0x00 前言
曾经也遇到过堆上格式化字符串漏洞
类型的题目,但是咕了许久以后再次遇到这种类型的题目,捣鼓半天而且借助WP才搞出来……
特此写篇博客记录一下以加深印象。
题目在BUUCTF上可以找到.
0x01 程序分析
1 | Arch: i386-32-little |
buf不在栈上,而是通过malloc申请的
1 | buf = malloc(0x100u); |
然后将buf作为参数,进入sub_80485C4函数内,该函数存在格式化字符串漏洞,不过只能单次利用。
1 | char *__cdecl sub_80485C4(char *s) |
程序存在后门函数
1 | .text:080485AB ; __unwind { |
0x02 重点与思路
利用格式化字符串漏洞将返回地址改为后门函数
一条重点
对于%ac$xn
,其中a为个数,x是偏移,如果此处地址里面存放的依旧是个指针(地址),那么会向里面存放的指针所指向的地方写入数据。
即 A->B->C,A和B都是地址,则最后数据会写到C处。
稍作调试
在第一个printf(0x080485F6)的位置下断点,运行,然后查看栈。
可以看到这两处是可以作为跳板的
ebp位置的位于偏移0xa处,下面的位于偏移0x12处
不过即便每次运行的时候栈地址都会变动,但是偏移0x13处的最后一位总会是c,比如会是0c、1c、2c…..ec、fc。这便为我们爆破提供的条件。
确定思路
以图为例,如果我们利用那条重点
对偏移0xa处进行写入
则数据会写到如图0xffe5a238处(即修改0xffe5a238为其他值)
那么如果将0xffe5a238修改为0xffe5a20c
那么偏移0x12处也便指向了0xffe5a20c
偏移0x12处将变成: 0xffe5a208 -> 0xffe5a20c -> 0x8048697
的形式。(如果问为什么没有图,那是因为手残把gdb给关了…. 地址每次都是随机的,还原不回上图的值了,为了不让读者因地址变动而产生疑惑,只能用文字表示了。)
那么我们可以通过格式化字符串和那条重点
对偏移0x12处进行写入,即修改0x8048697的值为后门函数地址。
因为栈地址是随机的,所以采用爆破。
0x03 完整EXP
1 | #coding:utf-8 |