突然发现看雪开了CTF板块,向大家推荐一个开源项目CTF-Wiki,有兴趣的师傅们可以参与进来一起交流。
0aaK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6U0N6r3k6Q4x3X3c8%4K9h3E0A6i4K6u0r3j5%4c8X3i4K6u0V1N6$3W2C8K9b7`.`.
House Of Force属于House Of XXX系列,House Of XXX指的是2004年一篇名为《The Malloc Maleficarum-Glibc Malloc Exploitation Techniques》的文章中提出的一系列针对glibc漏洞的利用方法。
但是由于年代久远《The Malloc Maleficarum》中提出的大多数利用在今天都不能奏效,我们现在所指的House Of XXX利用相比2004年文章中写的已有较大的不同。但是《The Malloc Maleficarum》依然是一篇推荐阅读的文章,你可以在这里读到它的原文:
4d0K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8q4)9J5k6i4m8S2j5$3E0W2N6s2y4@1L8%4u0E0M7$3g2U0N6i4u0A6N6s2W2Q4x3X3g2F1k6i4c8Q4x3V1k6H3j5i4m8W2M7Y4y4Q4x3V1k6S2N6s2c8S2j5$3E0Q4x3V1k6y4j5h3I4D9L8$3y4y4j5h3I4W2k6X3W2U0j5i4u0#2L8g2)9J5k6i4c8^5N6l9`.`.
House Of Force是一种堆溢出的利用方法,当然能够通过House Of Force进行利用的可能不只是堆溢出漏洞。如果一个堆(heap based)漏洞想要通过House Of Force方法进行利用,需要以下条件:
House Of Force产生的原因在于glibc对top chunk的处理,根据前面堆数据结构部分的知识我们得知,进行堆分配时会从top chunk中分割出相应的大小作为堆块的空间,因此top chunk的位置会发生上下浮动以适应堆内存分配和释放。
HOF的利用思想可以概括为一句话:
当使用top chunk分配堆块的size值是由用户控制的任意值时会发生什么?
答案是,可以使得top chunk移动到我们想要达到的任何位置,这就相当于一次任意地址写。
然而在glibc中,会对用户请求的大小和top chunk现有的size进行验证
然而,如果可以篡改size的大小为一个很大值,就可以轻松的通过这个验证,这也就是我们前面说的需要一个能够控制top chunk size域的漏洞。
一般的做法是把top chunk的size改为-1,因为在进行比较时会把size转换成无符号数(如上),因此-1会解释成为一个大数,就可以使得所有64位值都能通过验证。
之后这里会把top指针更新,接下来的堆块就会分配到这个位置,用户只要控制了这个指针就相当于实现任意地址写任意址(write-anything-anywhere)。
在学习完HOF的原理之后,我们这里通过一个示例来说明HOF的利用
这个例子的目标是通过HOF来篡改malloc@got.plt
实现劫持程序流程
首先,我们分配一个0x10字节大小的块
之后把top chunk的size改为0xffffffffffffffff,在题目中这一步可以通过堆溢出等漏洞来实现。
因为-1在补码中是以0xffffffffffffffff表示的,所以我们直接赋值-1就可以。
注意此时的top chunk位置,当我们进行下一次分配的时候就会更改top chunk的位置到我们想要的地方
接下来我们执行malloc(-4120);
,-4120是怎么得出的呢?
首先明确要写入的目的地址,这里我编译的情况0x601020是malloc@got.plt
的地址
之后明确当前top chunk的地址,根据前面描述,top chunk位于0x602020
所以我们使用0x601020-0x602020-0x10=-4120,之所以要减去0x10是为了刨除chunk header的偏移
当调用malloc(-4120)
之后,我们可以观察到top chunk被抬高到我们想要的位置
之后,我们分配的块就会出现在0x601010+0x10的位置,也就是0x601020可以更改got表中的内容了。
在上一个示例中我们演示了通过HOF使得top chunk的指针减小来修改位于其上面(低地址)的got表中的内容,
但是HOF其实也可以使得top chunk指针增大来修改位于高地址空间的内容,我们通过这个示例来演示这一点
我们可以看到程序代码与简单示例1基本相同,除了第二次malloc的size有所不同。
这次我们的目标是malloc_hook,我们知道malloc_hook是位于libc.so里的全局变量值,首先查看内存布局
可以看到heap的基址在0x602000,而libc的基址在0x7ffff7a0d000,因此我们需要通过HOF扩大top chunk指针的值来实现对malloc_hook的写。
首先由调试得知__malloc_hook的地址位于0x7ffff7dd1b10,采取计算0x7ffff7dd1b00-0x602020-0x10=140737345551056
经过这次malloc之后,我们可以观察到top chunk的地址被抬高到了0x00007ffff7dd1b00
之后,我们只要再次分配就可以控制0x7ffff7dd1b10处的__malloc_hook值了
在这一节中讲解了House Of Force的原理并且给出了两个利用的简单示例,通过观察这两个简单示例我们会发现其实HOF的利用要求还是相当苛刻的。
其实这三点中第二点往往是最难办的,CTF题目中往往会给用户分配堆块的大小限制最小和最大值使得不能通过HOF的方法进行利用。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!