create /bin/sh

本文最后更新于:2022年3月20日 晚上

当目标有调用system函数,但无/bin/sh字符串时

xctf pwn新手区最后三题之一,cgpwn2.

打开IDA乍一看,没有后门函数,没有明显的可导向的返回地址。

关注有两个读取输入的地方,一个是有限制大小的读取函数,另一个是gets()这个危险函数。

考虑到这题只开启了NX保护,栈溢出应该是必须的。

于是,思路是通过name字符串,导入“/bin/sh”字符串。

再通过gets()溢出,传入_system函数地址,最后传入/bin/sh。

\

payload = b’a’*42 + p32(_system_addr) + p32(0x0) + p32(/bin/sh_addr)

上面是脚本中核心语句。

b’a’*42 填充字符串和ebp

后面传入system函数地址替换原有返回地址,以调用system函数。

进入system函数后,因为这里是32位程序,推荐用布置栈帧的方式传参。

也就是,调用system后,此时位于system函数栈的ebp顶部。

需要传入一个4字节的数据,填充返回地址,然后来到传入的参数部分。

将/bin/sh 字符串的地址传入,完成传参。

达到调用system(“/bin/sh”)的目的。

劫持到程序,cat flag拿到答案。

总结下,第一眼看上去没法溢出,是因为忽略了通过传参的手段,构造一个system(“/bin/sh”)的可能性。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!