原理

ret2text即控制程序执行程序本身已有的的代码(.text)。其实,这种攻击方法是一种笼统的描述。我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码(也就是gadgets),这就是我们所要说的ROP。
这时我们就需要知道对应返回代码的位置,当然程序可能开启了某些保护,我们需要想办法绕过这些保护

[!note]
顾名思义,ret2text(return to text),也就是说我们的利用点在原文件中寻找相对应的危险代码即可(例如进程存在危险函数system(“/bin/sh”)或execv(“/bin/sh”)的片段,我们可以直接劫持返回地址到危险函数上,从而getshell),控制程序执行程序本身已有的代码(.text)

利用前提

开启了NX,栈上无法直接写入shellcode
当NX保护开启,就表示题目给了你system(“/bin.sh”),如果关闭,表示你需要自己构造shellcode

示例

[!info] 栈帧布局对齐
GCC编译32位程序时,默认保持栈帧边界按照16字节对齐,所以有时在实际进程中由于栈帧布局对齐问题会在局部变量和EBP之间塞入填充字节

手动测量变量溢出长度

通过cyclic生成无序字符串,然后执行函数报错,获取报错的返回地址,再通过cyclic的子函数就能查询到还需要溢出多少长度