level 0 x64
分析
main函数:
vuln函数:
用strings可以看到,有/bin/sh,这样我们不用再去写入了。
exp
|
|
flag
|
|
level 1
分析
main函数;
vulnerable_function函数:
很明显的栈溢出漏洞。溢出点用pattern查出为140个字节。用checksec看后发现NX没有开启,可以插入shellcode。题目也给出了buf的地址。因此可以在buf数组中插入shellcode,然后再溢出跳转到buf的起始位置去执行shellcode。
exp
|
|
flag
|
|
level 2
分析
main函数
vulnerable_function函数:
这题用strings查看时,会发现有/bin/sh字符串,不需要我们再去写入了。用gdb去调试,没成功,栈被重置了。不过从vuln函数里可以很清楚的看到,它先调用了一次system,而且read中存在栈溢出漏洞。而且buf的地址在bp-88h
的位置。从内存的分布知道,当前栈帧的ebp再减去4个字节就是return的地址。所以溢出的offset同样是 0x88 + 4
。所以这题的思路就是,覆盖返回地址,跳转到system,构造栈上的参数,给system传入sh/。
exp
|
|
flag
|
|
level 2 x64
分析
换成64位版本,参数要用rdi传递。binary中有sh字符串,直接利用就可以。这题似乎跟level0差不多啊。。
exp
|
|
flag
|
|
level 3
分析
main函数跟前面一样。
vuln函数:
仍然是栈溢出。题目给了libc.so,这样我们就有偏移。利用write泄露出read的地址后计算出system和sh的地址,之后直接调用即可。
exp
|
|
flag
|
|
exp(无libc版本)
假设题目没有给libc的话,可以用下面这个exp:
这个exp几乎和level4的相同,所以具体的一些坑就见下面吧。
level 3 x64
分析
函数啥的,跟前面的level3一样。参数用rdi,rsi等寄存器优先传递。构造rop链。
exp
|
|
flag
|
|
level 4
分析
main()函数和前同。
vuln函数:
没给libc,自己利用栈溢出和DynELF来泄露system地址。完了后调用read函数往bss段写入sh字符串,最后完成调用。这个思路很老套了。不过自己写的时候踩了很多坑,列举如下:
- leak函数中,若每次leak完后跳转到vuln函数地址,则远程getshell不成功,尽管本地测试可以。
- leak函数中,需要在leak后先pop3把栈上参数清空后再进行跳转到main函数中,否则本地或远程getshell都不成功。
- 在泄露完system地址后,若再调用一次start函数以恢复栈,则远程getshell不成功,尽管本地测试可以。
- 还有一些…
以上几点,在以前利用时没遇到过,这次想了很久也不知道为什么。。。
exp
|
|
flag
|
|
:)
文件已打包:http://pan.baidu.com/s/1eR2XzNk 密码:9y4l