2015-04-12 347 views
1

我有一個緩衝區溢出問題,我需要解決。下面的問題是,在底部是我的問題:緩衝區溢出緩衝區長度

#include <stdio.h> 
#include <string.h> 
void lan(void) { 
    printf("Your loyalty to your captors is touching.\n"); 
} 

void vulnerable(char *str) { 
    char buf[LENGTH]; //Length is not given 
    strcpy(buf, str); //str to fixed size buf (uh-oh) 
} 

int main(int argc, char **argv) { 
    if (argc < 2) 
     return -1; 
    vulnerable(argv[1]); 
    return 0; 
} 

(gdb) disass vulnerable 
0x08048408: push %ebp 
0x08048409: mov %esp, %ebp 
0x0804840b: sub $0x88, %esp 
0x0804840e: mov 0x8(%ebp), %eax 
0x08048411: mov %eax, 0x4(%esp) 
0x08048415: lea -0x80(%ebp), %eax 
0x08048418: mov %eax, (%esp) 
0x0804841b: call 0x8048314 <strcpy> 
0x08048420: leave 
0x08048421: ret 
End of assembler dump. 

(gdb) disass lan 
    0x080483f4: push %ebp 
    0x080483f5: mov %esp, %ebp 
    0x080483f7: sub $0x4, %esp 
    0x080483fa: movl $0x8048514, (%esp) 
    0x08048401: call 0x8048324 <puts> 
    0x08048406: leave 
    0x08048407: ret 
    End of assembler dump. 

然後我們有以下信息:

(gdb) break *0x08048420 
Breakpoint 1 at 0x8048420 
(gdb) run 'perl -e' print "\x90" x Length' 'AAAABBBBCCCCDDDDEEEE' 
Breakpoint 1, 0x08048420 in vulnerable 
(gdb) info reg $ebp 
ebp   0xffffd61c 0xffffd61c 
(gdb) # QUESTION: Where in memory does the buf buffer start? 
(gdb) cont 
Program received signal SIGSEGV, Segmentation fault. 

最後,perl的命令是編寫出的字符長度副本速記0×90。

我已經完成了這樣的一些問題,但是這裏阻礙了我的下列問題:「通過查看彙編代碼,LENGTH的價值是什麼?

我不知道如何從給定的彙編代碼中找到它。我所知道的是......我們寫入的緩衝區位於堆棧的位置-128(%ebp)(其中-128是十進制數)。但是,我不確定從哪裏去獲得緩衝區的長度。

回答

2

讓我們來看看你的vulnerable函數。

首先,編譯器創建一個框架和儲量均爲0x88字節堆棧:

0x08048408: push %ebp 
0x08048409: mov %esp, %ebp 
0x0804840b: sub $0x88, %esp 

然後它把兩個值到堆棧中:

0x0804840e: mov 0x8(%ebp), %eax 
0x08048411: mov %eax, 0x4(%esp) 
0x08048415: lea -0x80(%ebp), %eax 
0x08048418: mov %eax, (%esp) 

,並恢復爲之前做的最後一件事請撥打strcpy(buf, str)

0x0804841b: call 0x8048314 <strcpy> 
0x08048420: leave 
0x08048421: ret 

因此我們可以推斷出兩個值它放在堆棧上的參數是strcpy
mov 0x8(%ebp)將是char *strlea -0x80(%ebp)將是指向char buf[LENGTH]的指針。因此,我們知道你的緩衝區起始於-0x80(%ebp),所以假設編譯器沒有浪費任何空間,它的長度爲0x80 = 128字節。因此,我們知道你的緩衝區起始於-0x80(%ebp),所以它的長度爲0x80 = 128字節。

1

我所知道的是..我們正在寫入緩衝區是在位置-128(%EBP)堆棧

由於局部變量在%ebp結束,並在你只有一個本地變量buffer本身,你可以得出結論,它的長度最多爲128。如果編譯器添加了一些用於對齊的填充,它可能會更短。

+0

謝謝@Jester,這就是我的想法(阻止我回答問題)。這是來自我的學校的一次舊考試中的一個問題,當我不知道編譯器放在那裏有多少填充時,我覺得(並且仍然覺得)回答有多大的LENGTH是很奇怪的。 – user2451412