这次比赛值得吐槽的地方很多,但是我要忍住,先讲正经的。 这次总结比赛的两道pwn,都是栈溢出类型的,比较简单。先放上题目链接:http://pan.baidu.com/s/1miT1kPM 密码:hwt3
正式写wp之前我需要默认你们都会IDA和gdb+peda的一些调试技巧以及脚本的编写,我主要讲题目思路,不然这篇文章就变成了工具教学。
查看程序信息,32位,动态链接,只开了NX保护,RELORO是Partial。
那么做法就很多了。思路后面讲,继续看程序。
程序接受一次输入,然后不管你输入是什么,都给你输出一大串东西,至于这是为什么,看下面代码就知道了。
程序的main,非常简单,只是有个定时一秒的时钟比较坑,可以选择性地nop掉。
这就是程序的主要函数了,实在是非常简单。
看了这里的代码也可以解释为什么会数出一大串字符了。
再结合汇编页面查看,溢出非常明显。
程序漏洞分析完毕,我们来讲讲思路。
exp我准备用图片展示出来,原因不需要多说,我希望我的exp主要起个参考作用。
题目做法很多,比如你也可以不泄露栈上的libc,去泄漏got表,或者ret2resolve,有不同的想法欢迎在评论区留言。
和上一题不一样,这里多了canary,但我们总会有办法绕过的。
这就是程序的功能展示了,只要我们每次都输入'Y',那我们就有无数次的输入机会。
程序main函数,程序有fork,看到这里,那么程序的canary就已经问题不大了。 我们主要分析的函数在下面的input_name() 中。
可以看到这里还是有个明显的格式化字符串。 我们进行的输入是在 input() 函数中。
由于没有验证字符串长度,我们可以在这里进行溢出。
总结:
这两道pwn题用来练习栈溢出漏洞还是不错的,我主要是利用ret2libc进行的攻击,你们也可以尝试其他方式,比如ret2resolve,虽然比较麻烦。