[Pwnable.kr] tiny_easy
这道题提供了一个跑步起来的可执行文件,用IDA分析
GU2F]2ZKICEHBHS56HX” width=”461″ height=”263″>
之后就没有下文了,然后我们用gdb-peda调试一下试试——首先用ulimit -s unlimited关闭ALSR
这里插播一个小技巧,对于这种没有任何symbol的可执行文件如何下断点呢,首先我们给0地址下一个断点,当然会出错,提示:
然后我们查看一下pc
我们就看到了ep的地址,之后在这个0x8048054下断点就可以了
单步运行我们看到问题处在call edx这一步
此时edx值是原来栈上程序绝对目录,所以call edx的时候会引发段错误。那是不是我们控制了执行路径就控制了这个edx的值呢?我们试一下
首先我们用ulimit -c unlimited打开coredump,然后用exec执行程序
如我们所料,崩溃点在0x44434241,也就是‘ABCD’。但是我们在这里只能执行一条指令,这条指令最好是跳转指令,可以跳到我们预先布置好的其他位置,执行其他代码就好了。
这里要介绍另一种方法,一种类似heap spray的方法,使用大量的[shellcode][nop][shellcode][nop]指令段来填充栈,其中nop非常的长,以至于只要eip指针落到nop段中,就一定可以被引导到我们的shellcode段执行我们设定的指令。
跳转的地址可以选择gdb那种图里的栈地址,比如0xfff97de8这个。
关于shellcode的制作,可以直接从网上找,有个分享shellcode的网站shell-storm.org,我选择了这个http://shell-storm.org/shellcode/files/shellcode-585.php作为我的shellcode。
第一步我们将我们的shellcode段填充到环境变量里面去
1 2 3 4 |
for i in `seq 1 100`; do export A_$i=$(python -c 'print "\x90"*4096 + "\xeb\x0b\x5b\x31\xc0\x31\xc9\x31\xd2\xb0\x0b\xcd\x80\xe8\xf0\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"'); done |
然后我们执行payload:
经过若干次尝试我们终于在本机成功了,然后我们到服务器上重复上述步骤,成功拿到flag。