pwn(堆-buu)

1:题目:hitcontraining_unlink (off by one 漏洞之unlink-64)

老规矩checksec

开了三个保护。

查看main函数:

很明显是菜单题

此程序主要的功能有add,edit,remove,show。

来看看这四个函数的代码

add函数:

edit函数:

remove函数:

show函数:

一:首先,先申请堆块:

此时堆块状态布局如下:

前两个是系统自动生成的,不用管,后三个是我们申请的,可以看到状态都是used。

二:开始伪造堆块信息:编辑0号堆块,堆块上要构造fd=chunk-0x18   bk=chunk-0x10通过unlink检测,并且通过堆溢出篡改1号堆块标志位让0号堆块free

此时堆块布局状态如下:

可以看到通过堆溢出篡改了1号堆块的标志位,0号堆块变为free状态了。

三:接着我们再free掉1号堆块,这是就会实现unlink,0号堆块与一号堆块会实现合并,并且此时堆块0的fd指针指向chunk-0x18 所以此时edit堆块0时会在chunk-0x18上写内容,实现任意地址写。

此时堆块布局状态如下:

可以看到,0号堆块与1号堆块都为free状态。

四:覆盖 chunk 0 指针为 atoi@got 表地址。这时候show 就可以泄露atoi的got表地址,实现libc偏移的计算。然后计算出system的地址

此时堆块的布局状态如下:

计算出的system地址:

五:改写atoi为system

此时堆块的布局状态如下:

六:atoi被改写成了system,现在在菜单选项那边传入bin/sh,读入参数那边会调用atoi,可获取shell

完整exp如下:

2:题目:

完整exp如下: