pwn堆总结

堆溢出

堆溢出是指程序向某个堆块中写入的字节数超过了堆块本身可使用的字节数,因而导致了数据溢出,并覆盖到物理相邻的高地址的下一个堆块。

前提

  • 程序向堆上写入数据
  • 写入的数据大小没有被良好地控制

利用思路

1.覆盖与其物理相邻的下一个chunk的内容。
2.利用堆中的机制(如unlink等)来实现任意地址写入或控制堆块中的内容等效果,从而来控制程序的执行流。

off-by-one

off-by-one漏洞是一种特殊的溢出漏洞,off-by-one指程序向缓冲区中写入时,写入的字节数超过了这个缓冲区本身所申请的字节数并且只越界了一个字节。

前提

1.能够溢出一个字节。

利用思路

1.溢出字节为可控制的任意字节:通过修改大小造成块结构之间出现重叠,从而泄露其他块数据,或是覆盖其他块数据。
2.溢出字节为NULL字节:在size为0x100的时候,溢出null字节可以使得prev_in_use位被清,这样前块会被认为是free块。

  • 这时可以选择使用unlink方法进行处理。
  • 另外,这时prev_size与就会启用,就可以伪造prev_size,从而造成块之间发生重叠。(2.28之前可以使用)

Chunk Extend and Overlapping

chunk extend是堆漏洞的一种常见利用手法,通过extend可以实现chunk overlapping的效果。

前提

  • 程序中存在基于堆的漏洞。
  • 漏洞可以控制chunk header中的数据。

利用思路

1.通过更改前一块的大小来控制后一块的内容。
2.通过更改pre_inuse域和pre_size域来控制当前块的之前块的内容。

unlink

unlink是bins中chunk的脱链操作,我们对chunk进行布局,然后借助unlink操作能够达成修改指针的效果。

前提

1.unlink中存在检查:

if (__builtin_expect (FD->bk != P || BK->fd != P, 0))                

所以我们够构造fakechunk的时候,要保证

fakeFD -> bk = fakeBK <=> *(fakeFD + 12) = fakeBK
fakeBK -> fd = fakeFD <=> *(fakeBK + 8) = fakeFD

2.存在UAF的chunk,可修改free状态下smallbin或是unsorted bin的fd和bk指针。
3.已知位置存在一个指针指向可进行UAF的chunk。

利用思路

设指向可UAF chunk的指针的地址为ptr。
1.修改fd为ptr - 0x18
2.修改bk为ptr - 0x10
3.触发unlink
ptr处的指针会变为ptr-0x18

use after free

Use After Free 就是其字面所表达的意思,当一个内存块被释放之后再次被使用。有以下几种情况:
1.内存块被释放后,其对应的指针被设置为NULL,然后再次使用,程序自然会崩溃。
2.内存块被释放后,其对应的指针没有被设置为NULL,然后在它下一次被使用之前,没有代码对这块内存块进行修改,那么程序和有可能可以正常运转。
3.内存块被释放后,其对应的指针没有被设置为NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,,那么当程序再次使用这块内存时,就很有可能出现奇怪的问题。
而我们一般所指的use after free漏洞主要是后两种。我们一般称被释放后没有被设置为NULL的内存指针为dangling pointer。

前提

1.存在dangling pointer。

利用思路

配合其他堆利用技巧使用。

fastbin attack

fastbin attack是一类漏洞的利用方法,是指所有基于fastbin机制的漏洞利用方法。主要有以下几种:

  • fastbin double free
  • house of spirit
  • alloc to stack
  • arbitrary alloc

其中,前两种主要漏洞侧重于利用free函数释放真的chunk或伪造的chunk,然后再次申请chunk进行攻击,后两种侧重于故意修改fd指针,直接利用malloc申请指定位置chunk进行攻击。

前提

1.存在堆溢出、use-after-free等能控制chunk内容的漏洞。
2.漏洞发生于fastbin类型的chunk中。

fastbin double free

Fastbin Double Free是指fastbin的chun 可以被多次释放,因此可以在fastbin链表中存在多次。这样导致的后是多次分配可以从fastbin链表中取出同一个堆块,相当于多个指针指向同一个堆块,结合堆块的数据内容可以实现类似于类型混淆 (type confused) 的效果。

check

1.free fastbin chunk时会检查当前free的chunk与fastbin表头的chunk是否一致,一致则报double free错误。
绕过:两次free之间free一个其他size的fastbin chunk。
2.malloc会对预分配位置的chunk验证其size与当前fastbin链表的size相同,不同则报错。
绕过:fake chunk的size要与fasbin的size一致。(size域中的A|M|P可以不同)

利用思路

1.double free同一个chunk(两次free之间需要free一个其他size的fastbin chunk来绕过检测)
2.通过fastbin double free后,我们实现了使用多个指针控制同一个堆块,这可以用于篡改一些堆块中的关键数据域或者是实现类似于类型混淆的效果。如果更进一步修改fd指针,则能够实现任意地址分配堆块的效果,这就相当于任意地址写任意值的效果。

house of spirit

该技术的核心在于在目标位置处伪造fastbin chunk,并将其释放,从而达到分配指定地址的chunk的目的。

check

1.fake chunk的ISMMAP位不能为1,因为free时,如果是mmap的chunk,会单独处理。
2.fake chunk的size大小需要满足对应的fastbin的需求。
3.fake chunk的next chunk的大小不能小于2 * SIZE_SZ,同时也不能大于av->system_mem。
4.fake chunk对应的fastbin链表头部不能是该fake chunk,既不能构成double free的情况。

利用思路

构造好fake chunk,通过free再malloc的方式使得分配到fake chunk处,达到控制fake chunk地址处内容的目的。

alloc to stack

该技术的核心点在于劫持fastbin链表中chunk的fd指针,把fd指针指向我们想要分配的栈上,从而实现控制栈中的一些关键数据,比如返回地址等。

check

1.fake chunk的size大小需要满足对应的fastbin的需求,也就是需要栈上存在有满足条件的size值。

利用思路

通过该技术我们可以把fastbin chunk分配到栈中,从而控制返回地址等关键数据。

arbitrary alloc

Arbitrary Alloc其实与Alloc to stack是完全相同的,唯一的区别是分配的目标不再是栈中。事实上只要满足目标地址存在合法的size域(这个size域是构造的,还是自然存在的都无妨),我们可以把chunk分配到任意的可写内存中,比如bss、heap、data、stack等等。

check

1.fake chunk的size大小需要满足对应的fastbin的需求。

利用思路

利用字节错位等方法来绕过size域的检验,实现任意地址分配chunk,最后的效果也就相当于任意地址写任意值。

unsorted bin attack

Unsorted Bin Attack,顾名思义,该攻击与Glibc堆管理中的Unsorted Bin的机制紧密相关。

前提

1.能控制Unsorted Bin Chunk的bk指针。

利用思路

将bk指针改为target addr -16,再次malloc大于fast bin大小的chunk时(注意选择的chunk不会被small bin分配),我们可以将target addr修改为较大的值。看起来似乎没有什么用处,但是还可以这样用:
1.通过修改循环的次数来使得程序可以执行多次循环。
2.修改heap中global_max_fast来使得更大的chunk可以被视为fast bin,这样我们就可以去执行一些fast bin attack了。

large bin attack

基于large bin的漏洞利用方法

前提

1.可以修改一个large bin chunk的data。
2.从unsorted bin中来的large bin chunk要紧跟在被构造过的chunk后面。

利用思路

1.修改已经free的large bin中的bk为&stack_var1-2,bk_nextsize为&stack_var2-4
2.再次free一个比当前large bin大的large bin,就能把stack_var1和stack_var2的值为较大值(victim的地址)。
运用方法与unsorted bin类似,可以修改golbal_max_fast之类的全局变量为一个很大的值。
注意在堆风水排布时,注意每个chunk之间分配一个fastbin,防止free时chunk合并。
目前large bin题目较少,预计未来题目有更深入的large bin attack利用。

tcache attack

tcache是libc2.26以后引进的一种新的机制,有点类似与fast bin,不过它的优先级比fast bin高。free的时候当tcache满了才放入fastbin,unsorted bin。tcache几乎没有什么检测机制,使得利用方法较为多样。

pwn tcache

利用思路

类似于fast bin attack
1.free掉一个chunk进入tcache bin。
2.修改tcache bin的next指针(也就是fd指针)为想要分配的地址。
3.malloc两次,即分配到想要的地址。
而且相比较于fast bin attack,tcache bin attack没有对size的检查,利用空间更大。

tcache dup

利用思路

与fast bin dup类似,但是因为其没有任何检查,可以直接double free。

tcache house of spirit

利用思路

利用方法于fast bin的house of spirit一样,一样是构造fake chunk,先free在malloc,就能分配到fake chunk的地址。

利用思路

在申请内存块符合smallbin大小并在smallbin内找到可用的空闲块时,会把该smallbin链上的其他内存块放入tcache中。放入tcache中时,一样是做解链操作,但是没有调用unlink宏来做,也就少了unlink中的检查。使得可以通过unlink实现任意地址任意写。

利用思路

这种攻击利用的是tcache bin有剩余 (数量小于 TCACHE_MAX_BINS ) 时,同大小的small bin会放进tcache中 (这种情况可以用calloc分配同大小堆块触发,因为calloc分配堆块时不从 tcache bin 中选取)。在获取到一个smallbin中的一个chunk后会如果tcache仍有足够空闲位置,会将剩余的small bin链入tcache ,在这个过程中只对第一个bin进行了完整性检查,后面的堆块的检查缺失。当攻击者可以写一个small bin的bk指针时,其可以在任意地址上写一个libc地址 (类似unsorted bin attack的效果)。构造得当的情况下也可以分配fake chunk到任意地址。

house of einherjar

house of einherjar是一种堆利用技术,由Hiroki Matsukuma提出。该堆利用技术可以强制使得malloc返回一个几乎任意地址的chunk 。其主要在于滥用free中的后向合并操作(合并低地址的chunk),从而使得尽可能避免碎片化。

check

unlink有两个检查
1.需要满足FD->bk == P && BK->fd == P
2.需要满足chunksize(P) == prev_size (next_chunk(P)

利用思路

1.构造相应的fake chunk。
2.修改物理相邻的高地址的chunk的 prev_size 与 PREV_INUSE 部分。
3.free掉高地址的chunk。
这样我们就能获得一个大的fake chunk,而且再次分配能分配到fake chunk地址处。如果高地址的chunk与top chunk相邻,构造得当能够分配任意地址。

house of force

基于top chcunk分配机制的利用

前提

1.能够以溢出等方式控制到top chunk的size域。
2.能够自由地控制堆分配尺寸的大小

check

glibc会对用户请求的大小和top chunk现有的size进行验证,如果size不够大。就不会使用top chunk来进行分配。我们可以篡改size为一个很大值来绕过这个验证。一般的做法是把top chunk的size改为-1,因为在进行比较时会把size转换成无符号数,因此-1也就是说unsigned long中最大的数。

利用思路

1.篡改top chunk size。
2.计算想要分配的地址到top chunk的偏移(注意宏的计算,如果偏移不是MALLOC_ALIGN,需要具体调试才能确定malloc分配的大小)
3.malloc偏移大小的chunk,就能将top chunk移到想要分配的地址处。
4.再次malloc就能分配到想要分配的地址。

House of Lore

House of Lore攻击与Glibc堆管理中的Small Bin的机制紧密相关。House of Lore可以实现分配任意指定位置的chunk,从而修改任意地址的内存。

前提

1.能够控制small bin chunk的bk指针。
2.能够控制指定位置chunk的fd指针。

check

分配small bin的时候,需要满足bck->fd == victim。

利用思路

1.构造满足条件的fake chunk1,然后分配大小一样的small bin。
2.此时small bin尾部的bin返回给了用户,fake chunk链接进small bin尾部。
3.故技重施,构造满足条件的fake chunk2,然后分配一样的small bin。
4.现在我们就能分配到fake chunk1处。

house of orange

House of Orange 的利用比较特殊,首先需要目标漏洞是堆上的漏洞但是特殊之处在于题目中不存在 free 函数或其他释放堆块的函数。我们知道一般想要利用堆漏洞,需要对堆块进行 malloc 和 free 操作,但是在 House of Orange 利用中无法使用 free 函数,因此 House of Orange 核心就是通过漏洞利用获得 free 的效果。这种操作的原理简单来说是当前堆的 top chunk 尺寸不足以满足申请分配的大小的时候,原来的 top chunk 会被释放并被置入 unsorted bin 中,通过这一点可以在没有 free 函数情况下获取到 unsorted bins。

check

想要伪造top chunk size,必须满足以下要求
1.伪造的size必须要对齐到内存页。
2.size要大于MINSIZE。
3.size要小于之后申请的chunk size + MINISIZE。
4.size的prev inuse位必须为1。
5.malloc的大小不能大于mmap分配阈值。

利用思路

1.篡改top chunk size(注意size需要对齐内存页)
2.分配比top chunk size大的chunk。
3.现在原来的top chunk进入了unsorted bin中,再次malloc就会从unsored bin中切分出需要的大小,剩余部分作新的unsorted bin。

house of rabbit

House of rabbit 是一种伪造堆块的技术,我们一般运用在 fastbin attack 中,因为 unsorted bin 等其它的 bin 有更好的利用手段。

前提

1.可以修改fastbin的fd指针或size。
2.可以触发malloc consolidate。

利用思路

原理很简单,就是通过修改 fastbin chunk 的 size 直接构造 overlap chunk,或者修改 fd,让它指向一个 fake chunk,触发 malloc consolidate 之后让这个 fake chunk 成为一个合法的 chunk。

house of roman

House of Roman 这个技巧说简单点其实就是 fastbin attack 和 Unsortbin attack 结合的一个小 trick。该技术用于 bypass ALSR,利用 12-bit 的爆破来达到获取 shell 的目的。且仅仅只需要一个 UAF 漏洞以及能创建任意大小的 chunk 的情况下就能完成利用。

利用思路

内容来源

(CTF Wiki)[https://ctf-wiki.github.io/ctf-wiki/]

posted @ 2020-05-08 03:34  PwnKi  阅读(4122)  评论(0编辑  收藏  举报