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如下: