House of Spirit攻击
原理
House of Spirit是一种堆利用方法,其核心在于通过任意地址的释放达到篡改地址的目的。
利用条件:
- 在目标地址周围能够伪造一个堆块。
- 能对伪造堆块地址周围进行一次释放(即将伪造的堆块地址作为free函数的参数进行一次释放操作)
- 释放之后能够重新申请得到这个堆块并篡改目标地址的内容
这里给出一个POC代码如下:
1 |
|
gcc编译一下进行调试分析
运行结果如下
调试命令如下:
1 |
|
x指令结果为
bins指令结果为
可以看到我们伪造chunk成功,prev_size为0,size字段为0x71。
这里我们还需要伪造下一个chunk的头部,如果不伪造,就会报错。因为会检查下一个chunk的size字段,如果下一个chunk的字段不在正常范围内(2*SIZE_SZ到av->system_mem),则会报错退出,所以在伪造chunk的时候,不仅要伪造当前的chunk头,还要伪造下一个chunk的头部
例题
例题下载:例题
查看保护
IDA反编译发现后门函数
在main函数中满足一定条件可以调用后门函数
magic 为在 bss 段的全局变量,如果我们能够控制 v3 为 114514 并且覆写 magic 使其值⼤于 114514 ,就能get flag。
看菜单menu()
打开create_heap():
heaparray 数组:存放 chunk 的⾸地址。
read_input(heaparray[i], size):把我们输⼊的内容写⼊ chunk 中。
且heaparray是存放在bss段上
打开edit_heap():
可以再次编辑 chunk 的内容,⽽且可以选择输⼊⼤⼩。如果我们这次输⼊的 size ⽐创建时⼤的话,就会导致堆溢出
(read_input(heaparray[v1], v2):向 chunk 中写⼊ v2 ⼤⼩的内容,也就是说如果 v2 ⽐ create 时的 size ⼤的话就会造成堆溢出。)
那么我们就可以用House of Spirit
攻击思路:
- 首先创建俩个chunk,chunk0大小为0x10,chunk1的大小为0x60
- 然后删除chunk1
- 编辑chunk0造成堆溢出,修改chunk1的fd指针为0x000000000060208d
- 创建两个chunk大小都为0x60,第一个内容随意,第二个要构造payload覆盖magic的值
- getflag
需要注意的一点是,在我们修改fd指针时,需要连到一个合法的chunk头,
这就是一个合法的chunk头,大小为0x70
EXP
1 |
|
这题一样可以用Arbitrary Alloc攻击,关于fastbin攻击等我研究透彻会进行总结,这里先贴个脚本。
1 |
|