涉及到的知识点
1、fastbin attack
2、unsorted bin attack
3、malloc堆内存管理
一些记录
当我们用malloc申请一个0x20的空间的时候,glibc实际上给予了我们一个如下这样子的一个结构。
|head(0x8/0x10)|data(0x20)|
注意:由于x84和x64的机器字长不一样,故其head头部大小也不一样,x86为0x8长度,x64为0x10长度。
data区域是我们可以进行数据输入的区间,malloc返回的指针便是该区间的首地址,记作PTR
当我们free它的时候,它会判定是否与top chunk相邻,如果相邻,它将会与top chunk合并,如果不是的话,它会进一步判断自身大小是否满足fast bin的要求,fastbin的边界大小由 libc内的全局变量fast_max决定,不过x86下这个值为0x40,x64下位0x80,小于等于这个值的所有chunk,free后将有fast bin管理,如果该chunk可以重复free,我们则可以利用fast bin attack来实现有限制的地址写能力(https://github.com/shellphish/how2heap/blob/master/fastbin_dup_into_stack.c )。而如果边界的大小大于fastbin的边界大小,该chunk则会加入到unsorted bin中去,此时我们可以修改bk来实现unsorted attack ( https://github.com/shellphish/how2heap/blob/master/unsorted_bin_attack.c )如果free 一个small/large chunk 的时候,可以修改本chunk、前一个或后一个,small/large chunk的head and data,则可以进行double free攻击。( http://www.hackdig.com/08/hack-25191.htm )
cuit2017 pwn400
题目可以从我github上下载。
hint:ubuntu 16.04
本题利用方式为:fast bin attack 覆盖name变量实现信息泄露。 overlap chunk attack 实现 hijack fsp attack,最终修改vtable至onegadget 或者system 实现get shell。
注意点:x64下面 0x220为vtable偏移量。x86么。。还没测ORZ
|
|
似乎有个可以直接用来算偏移的C源码,妈妈再也不用担心我算不准偏移啦~
0ctf baby heap
这题有两种利用方式,一种是全程使用fastbin attack ,还有一种是既利用fast bin 又利用 unsorted bin attack
exp1 如下
|
|
exp2 如下
|
|
参考资料
http://www.freebuf.com/articles/system/104144.html (Linux堆内存管理深入分析(上))
http://www.freebuf.com/articles/security-management/105285.html (Linux堆内存管理深入分析(下))
http://www.freebuf.com/news/88660.html (浅析Linux堆溢出之fastbin)
http://www.cnblogs.com/shangye/p/6268981.html ( house of orange )
http://www.bitscn.com/network/hack/200607/30235.html ( FSO 利用 )