0x00 前言
这道题我一开始一直以为是堆,然后也一直没找到堆溢出的漏洞,最后看了题解才知道原来是个栈,利用方式以前其实也做过,还是不能思维定式了。
0x01 题目分析
可以看出主要有四个功能,大致实现就是用双向链表。结构是name|money|fd|bk
这样子。
0x02 漏洞分析
在checkout函数里,到了7147可以获得一部iphone8,然而这个iphone8却是用栈加进去的。
1 | unsigned int checkout() |
虽然这里没有栈溢出,但是可以利用其它函数比如delete,或者cart来修改栈上的内容。
泄露
由上可以泄露出libc地址,也可以泄露出堆地址。
还通过libc中的environ来泄露栈地址。
如何泄露栈地址?
在libc中保存了一个函数叫_environ,存的是当前进程的环境变量
得到libc地址后,libc基址+_environ的偏移量=_environ的地址
在内存布局中,他们同属于一个段,开启ASLR之后相对位置不变,偏移量之和libc库有关通过_environ的地址得到_environ的值,从而得到环境变量地址,环境变量保存在栈中,所以通过栈内的偏移量,可以访问栈中任意变量
修改双向链的fd bk
- 修改双向链表的fd bk可以在delete的过程中造成一个dwordshoot的攻击,也就相当于任意地址写四字节,然而想直接修改atoi的got表为system会出现段错误(没权限)
- 利用dwordshoot修改delete函数的ebp,改变handler函数中参数的位置(修改为atoi_got - 0x22),这样my_read会直接读到atoi的got中,并且atoi_got可以往里面写。
- 最后仍然是利用linux的参数截断特点,输入system+‘;/bin/sh’ 获得shell
0x03 exp
1 | from pwn import * |