chunk_extend
Chunk Extend and Overlapping
chunk extend是堆漏洞的一种常见利用手法,通过 extend可以实现 chunk overlapping的效果。这种利用方法需要以下的时机和条件:
- 程序中存在基于堆的漏洞
- 漏洞可以控制 chunk header 中的数据,如修改size
例题
我们可以先创建2个堆块看看功能
xxxxxxxxxx6 1size_t fread(void ptr, size_t size, size_t nmemb, FILE stream)23ptr – 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针4size – 这是要读取的每个元素的大小,以字节为单位5nmemb – 这是元素的个数,每个元素的大小为 size 字节6stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流C


edit有off-by-one
edit heap0 ->content可以修改heap1的size


通过释放heap_1
edit(0, "/bin/sh\x00" + "a" * 0x10 + "\x41") |

先free heap1->content,再free heap1的结构块

此时0x40的链表上已经有extend后的块了

此时如果我们再申请一个content_size为0x30的堆块,将启用fastbins中一个0x20作为new_heap1的结构块,以及0x40的作为new_heap1的content块。
此时,形成了一个结构块被内容块吃掉的局面

改前

由于我们可以通过edit修改heap的content,相当于我们可以伪造new_heap的结构块
改后,0x602018即为free_got

在show中
会显示结构块中content指针变量,如果把这个指针覆盖为free_got指针,再show,就可以得到free函数的真实地址,从而成功泄露libc
此时edit new_heap1的话,由于content的指针被改了,edit会跟着free_got中的地址,我们可以把他改成别的函数地址,当执行free时,会转而执行我们所希望的函数,例如system
heap0的内容块又是binsh,直接getshell
EXP
from pwn import * |