本文共 2584 字,大约阅读时间需要 8 分钟。
房子精神攻击(house_of_spirit)是一种基于glibcfastbin的堆攻击技术。它结合了堆Exploit和fastbin攻击,通过构造伪造的堆块,使得攻击者能够控制后续的内存分配和释放过程,从而获得程序的控制权。
房子精神攻击的核心思想是利用fastbin(快速分配单元)的特性,通过构造伪造的heap chunk,隐藏实际控制流的溢出漏洞。以下是房子精神攻击的关键步骤:
伪造Fastbin块:攻击者在栈中预留一块内存区域,伪造出一个fastbin结构,包含size和nextsize等关键字段。这样,该块可以像一个真正的fastbin块一样被glibc接受和处理。
控制heap指针:攻击者将栈中的指针*a设置为伪造的fastbin块的地址。通过调用free(a),glibc释放这个伪造的块,并将其加入fastbin。
利用malloc:下次为特定大小(如0x30)调用malloc时,glibc会从fastbin中取出伪造的块,并将其返回给应用程序。此时,攻击者可以通过已控制的块进一步修改堆内存布局,或者直接控制程序的执行流。
房子精神攻击的关键是绕过传统的stack overflow利用方式,而是通过fastbin机制,让攻击者能够控制heap中的特定区域,从而达到漏洞利用的目的。
以下是一个实现房子精神攻击的glibc 2.23源代码示例:
#include#include #include #include #include < malloc.h>int main() { unsigned long long *a; unsigned long long fake_chunks[10] __attribute__((aligned(16))); fprintf(stderr, "This file demonstrates the house of spirit attack.\n"); fprintf(stderr, "Calling malloc() once so that it sets up its memory.\n"); malloc(1); fprintf(stderr, "We will now overwrite a pointer to point to a fake 'fastbin' region.\n"); unsigned long long fake_chunks[10] __attribute__ ((aligned (16))); fprintf(stderr, "This region (memory of length: %lu) contains two chunks. The first starts at %p and the second at %p.\n", sizeof(fake_chunks), &fake_chunks[1], &fake_chunks[9]); fake_chunks[1] = 0x40; // 第一块的大小 fake_chunks[9] = 0x1234; // 第二块的next_size unsigned long long *a = &fake_chunks[2]; fprintf(stderr, "Freeing the overwritten pointer.\n"); free(a); fprintf(stderr, "Now the next malloc will return the region of our fake chunk at %p, which will be %p!\n", &fake_chunks[1], &fake_chunks[2]); printf("malloc(0x30): %p\n", malloc(0x30)); return 0;}
初始化伪造块:声明一个伪造的fake_chunks
数组,该数组需要满足fastbin块的对齐要求(在glibc中,fastbin块需要16字节对齐)。
设置块属性:通过设置fake_chunks[1]
的值为0x40(块大小),和fake_chunks[9]
的值为0x1234(块的下一个块的大小),伪造出一个合法的fastbin块结构。
准备攻击指针:声明*a
指针,用于指向伪造的块。
释放指针:调用free(a)
,释放a
指针所指的伪造块,并将其加入fastbin列表中。
触发攻击:调用malloc(0x30)
,glibc将从fastbin中获取伪造的块,返回其地址。由于攻击者控制了块的内存区域,攻击者可以进一步利用该地址控制程序的行为。
poison null byte攻击则是一种类似的堆利用技术,但它基于glibc中堆管理中的单字节溢出漏洞。该漏洞允许攻击者在特定条件下,控制堆中的某些指针,进而获得程序的控制权。
识别漏洞:首先,攻击者需要找到一个内存块,它在被释放后,会导致下一个块的指针被覆写。
利用单字节溢出:攻击者将一个字节写入释放块的size字段,使得即将被释放的块占用空间超过它原本的大小。
绕过glibc检查:在glibc中,确认当释放被覆写的块时,glibc不会标记该块为损坏或错误,从而允许进一步的别块分配和利用。
控制key chunk:攻击者需要控制被覆写块的下一个块,以实现对堆内存的进一步控制。
获取控制权:攻击者可以通过读写被控制的块中的数据(如函数返回地址),从而获得程序的完整控制权。
房子精神攻击和poison null byte攻击均依赖于堆利用漏洞,通过对堆内存结构和fastbin机制的深入理解,攻击者能够绕过传统的栈溢出方法,实施更复杂和隐蔽的攻击。
转载地址:http://zdevz.baihongyu.com/