ret2text即执行程序中已有代码,例如程序中写有system等系统的调用函数,我们就可以利用控制已有的gadgets(以ret结尾的指令序列,通过这些指令序列,可以修改某些地址的内容)控制system函数。
这是ctf-wiki上ret2text的例子。
首先查看保护
仅仅开启了栈不可执行保护,并且位32位的程序
利用IDA查看程序
发现明显的栈溢出漏洞,gets()函数
发现secure函数中调用了system函数
所以我们可以利用gets函数的漏洞使得程序执行system()函数从而进行获取shell.
所以我们现在要知道输入多少个字符会导致栈溢出
利用脚本pattern或使用pwntools中的函数cyclic生成150个有序字符
使用pattern:
首先生成150个有序字符
生成150个有序字符
接着利用gdb调试,查看溢出点
在0x64413764发生溢出
利用pattern.py脚本自带方法,计算偏移量
计算出偏移量位112
使用pwntools自带方法cyclic:
生成150个有序字符
利用gdb调试
找到溢出点
pwntools也有自带方法计算偏移量即与cyclic相对于的cyclic -l 地址 计算偏移量
计算出偏移量112
我们已经计算出偏移量,那么可以利用栈溢出漏洞调用程序中自带system函数从而得到系统的shell
调用system函数地址0x0804863A
脚本
python脚本
运行脚本
获得系统权限