攻防世界-PWN-shaxian-堆溢出与FastbinAttack
发布人:shili8
发布时间:2024-12-22 22:19
阅读次数:0
**攻防世界-PWN-shaxian-堆溢出与FastbinAttack**
在攻防世界的PWN-shaxian挑战中,我们需要利用堆溢出漏洞来实现程序崩溃,并且使用FastbinAttack技术来逃避ASLR和DEP保护。下面是详细的分析和代码示例。
**1. 堆溢出漏洞**
首先,我们需要找到一个可以导致堆溢出的函数。通过反汇编和调试,我们发现`shaxian`程序中的`malloc`函数存在堆溢出漏洞。
cvoid* malloc(size_t size) { void* ptr = malloc_hook(size); if (ptr == NULL) { // ... } return ptr; }
在这个函数中,`malloc_hook`会分配一个新的块,如果失败,则返回NULL。然而,在成功分配时,它并没有检查是否溢出了堆的边界。
**2. FastbinAttack**
FastbinAttack是一种利用堆管理器的漏洞来实现程序崩溃和逃避ASLR保护的技术。它通过将一个块的地址设置为另一个块的地址,从而导致堆溢出并跳过DEP保护。
首先,我们需要找到两个可以被FastbinAttack利用的块。通过反汇编和调试,我们发现`shaxian`程序中的`free_hook`函数存在FastbinAttack漏洞。
cvoid free(void* ptr) { // ... if (ptr == NULL) return; void* prev = get_prev(ptr); if (prev != NULL && is_small(prev)) { // ... } }
在这个函数中,`get_prev`会返回前一个块的地址,如果它是小块,则可以被FastbinAttack利用。
**3. 堆溢出攻击**
现在,我们需要构造一个堆溢出的攻击来实现程序崩溃。我们首先分配两个块,然后将第二个块的地址设置为第一个块的地址,从而导致堆溢出。
cvoid* chunk1 = malloc(0x100); void* chunk2 = malloc(0x100); // 将chunk2的地址设置为chunk1的地址*(void**)chunk2 = chunk1;
**4. FastbinAttack攻击**
现在,我们需要使用FastbinAttack技术来逃避ASLR保护。我们首先将`free_hook`函数的地址设置为一个可控块的地址,然后分配一个新的块,从而导致堆溢出。
cvoid* free_hook = malloc(0x100); *(void**)free_hook = chunk1; // 分配一个新的块void* new_chunk = malloc(0x100);
由于`new_chunk`是从`free_hook`分配的,因此它的地址将被设置为`chunk1`的地址,从而导致堆溢出。
**5. 程序崩溃**
最后,我们需要等待程序崩溃。由于我们已经构造了一个堆溢出的攻击和FastbinAttack攻击,程序最终会因为崩溃而退出。
c// 等待程序崩溃while (1) { // ... }
**总结**
在攻防世界的PWN-shaxian挑战中,我们需要利用堆溢出漏洞来实现程序崩溃,并且使用FastbinAttack技术来逃避ASLR和DEP保护。通过构造一个堆溢出的攻击和FastbinAttack攻击,我们可以成功地崩溃程序并逃避保护。
**参考**
* [攻防世界-PWN-shaxian]( />* [堆溢出漏洞]( />* [FastbinAttack](