[投稿]Defcon babyfirst-Heap程序分析

babyfirst-heap这是今年defcon上的一道100分的pwn题目,是一个linux 32位的elf程序,程序见附件 .

一、静态分析

程序首先分配了14块堆内存,其中第11次申请的空间固定为260字节。
1

接着程序获取输入,并将输入数据放入到第11次申请的空间中去。(此处输入数据如果大于260字节,就会找出堆溢出)

之后程序对申请的空间进行释放。

2

由以上分析,大致可以估计 需要输入大于260字节的数据,使得堆释放时,能获得一次任意地址写任意数据的机会,将覆盖函数指针为shellcode地址。

3

二、动态分析

首先构造一个字节大于260字节的全a数据,见附件payload1。
4
首先在shell中运行 下列命令使程序崩溃时,能够产生转储文件。

运行程序,命令:

程序崩溃,核心转储,在当前目录中产生了core文件,分析转储文件,命令

查看崩溃出的指令:

查看eax和edx的值

6

可见,eax和edx的值完全由用户输入控制。

三、定位位置

构造一组特殊的数据payload2。(特殊数据可由msf生成,附件中的pattern.txt是现成的)

7

重新运行程序,程序崩溃后分析core文件,发现程序崩在同一个eip处,此时查看eax和edx的值。

8_2

9

发现eax正是输入数据的前4个字节,ebx是输入数据的第5到8个字节。

程序将edx值赋给eax+0x8处的内存。

构造edx=0x61616161,eax=0x0804bffc, 这样0x61616161就会覆盖掉printf函数在got中的值(因为程序中free后首先执行的是printf,所以优先覆盖printf)

10

构造数据如下:(见附件payload3)

11

运行再次崩溃,分析崩溃状态:

12

13

此时printf的值已经被替换为0x61616161了。

14

此处,程序将edx的值赋给eax+4处的内存。如果eax填写的是shellcode的地址,那么eax+4的内容会被edx改写,所以shellcode的第5-8字节会被程序改写,必须跳过这几个字节。

四、写exp并测试

构造payload如下:

0x804bffc 是printf函数地址-8

addr 存放shellcode地址,即跟在后面的 \xeb\x06处的地址,这个地址可以根据第11次malloc的返回值+8计算得来

\xeb\x06  jmp 06 用于跳过会被改写的那4个字节

Shellcode 可以用msf生成,生成的shellcode见附件cmd.bin,具体的生成命令如下:

15

16

17

完整的exp如下:(见附件exp.py)

 

exp测试:

环境

ubuntu 12.04 32位系统,创建个文件 /home/babyfirst-heap/flag文件,并随便输入一些字符,用以检测获取能否成功获取flag。

nc开端口进行监听:

运行exp脚本:

19

与flag文件内容对比,可见利用成功。

20

五、其它经验

程序一般都会有调用这个函数,所以程序运行一段时间后就会自动退出。

21

在gdb中调试时,可以对该信号进行忽略,命令如下:

附件链接:http://pan.baidu.com/share/link?shareid=3841819839&uk=3977589149

 

赏金发放情况:本文获得《安全技术大系:恶意代码分析实战》一本,已于6.2日发放到作者账号。

征稿启事:91RI一直相信“你不与人分享,谁与你分享”, 分享的确是件非常有意义的事情。为了让优秀的同学有 地方分享自己的独到见解,也为了让更多同学从分享中受益,同时我们也希望给那些愿意分享的小伙伴们一点点心意作为感谢,所以我们隆重了推出“有奖征文”活 动!本次活动的详情可以围观《征稿启事