介绍
starctf2019的一道题,漏洞很明显,但是不算很好利用。(其实是因为我的利用方式问题,下面会提到如何利用比较简单)
分析程序
程序实现了快速排序,但是漏洞和它完全无关。漏洞点一眼就能看出来gets函数。但是程序开了Canary,所以直接溢出是肯定不行的,但是gets读到的s数组,下面还有很多变量,我们可以通过覆盖这些变量来进行一些操作。
1 | int *tmp; // ebx |
我们可以在写s数组的时候,覆盖掉data指针,之后在对data进行写的时候就可以做到任意写了。
利用方式
- 覆盖data指针为got表,将free函数改写为sort_func,为了能再次跳回这个函数
- 覆盖data指针为got表,打印结果时leak信息(此处重新覆盖是因为,排序函数会打乱got表,我们需要找一个不会影响后续程序的位置)
- 覆盖data指针为got表,将atoi函数覆盖为system函数,即可getshell
注:其实后面才想到有比较简单的利用方式。即然都可以写got表了,直接将__stack_chk_fail
改掉即可,这样canary检查就无效了,接着就是正常的rop完事。
脚本
1 | #!/usr/bin/env python2 |