House Of Einherjar
通过off-by-one/off-by-null, 申请任意地址
- 利用结果: 使malloc返回任意地址
- 要求: 堆泄露, off-by-null
- 适用版本: 本篇记录的是改进版的House of Einherjar, 适用于包括2.31的带tcache版本.
利用方式
总结一下, 会用到三个chunk: a,b,c
- a: 在其中构造fake chunk
- b: victim, 在其中off-by-null溢出到c, 并修改c的prev_size,与fake chunk重叠
- c: 被溢出修改prev_size的chunk
一些细节如下:
- c的chunk大小应为0x100的倍数,这样off-by-null时就不会出问题
- fake_chunk -> size 要等于 c-> prev_size
- fake_chunk -> fd, fake_chunk -> bk 都指向fake_chunk, 以绕过unlink时的检查,也因此需要堆泄露
流程:
- 申请a,b,c
- 在B中改写
C->prev_size
, 同时通过OFF-BY-NULL写C->prev_inuse
为0 - 填满
tcache[c -> size]
; 当然,情况允许的话,我们也可以直接申请大于tcache范围的chunk. - 释放c, 触发fake_chunk与c的合并
- 申请fake_chunk+c的chunk, 叫他d
- 桥豆麻袋! 此处需要先
malloc
并free
一个b大小的chunk做padding. - 释放b
- 开始攻击(tcache poisoning): 利用d修改 b->fd 为target
- 申请两次,第二次申请获取到target!
参考
https://github.com/shellphish/how2heap/blob/master/glibc_2.31/house_of_einherjar.c