2012-09-06 20 views
2

我嘗試使用C程序在Ubuntu 10.04中溢出緩衝區,並將返回地址轉移到函數「垃圾」。但是我無法用未使用的函數「垃圾」的地址覆蓋返回地址。它只是在12個字節的堆棧上轉儲一些未知的地址。請幫我解決它。下面是C語言代碼: -Ubuntu 10(程序集)中的實驗性緩衝區溢出

(gdb) list 
    1 #include<stdio.h> 
    2 void display() 
    3 { 
    4  char buff[8]; 
    5  gets(buff); 
    6  puts(buff); 
    7 } 
    8 main() 
    9 { 
    10  display(); 
    (gdb) 
    11  return(0); 
    12 } 
    13 junk() 
    14 { 
    15  printf("cracked"); 
    16 } 

爲主要的disasambled代碼是: - 轉儲的彙編代碼功能主要:

0x08048462 <+0>: push %ebp 
    0x08048463 <+1>: mov %esp,%ebp 
    0x08048465 <+3>: call 0x8048444 <display> 
    0x0804846a <+8>: mov $0x0,%eax 
    0x0804846f <+13>: pop %ebp 
    0x08048470 <+14>: ret  

彙編轉儲結束。

轉儲的彙編代碼功能顯示:

0x08048444 <+0>: push %ebp 
    0x08048445 <+1>: mov %esp,%ebp 
    0x08048447 <+3>: sub $0xc,%esp 
    0x0804844a <+6>: lea -0x8(%ebp),%eax 
    0x0804844d <+9>: mov %eax,(%esp) 
    0x08048450 <+12>: call 0x8048350 <[email protected]> 
    0x08048455 <+17>: lea -0x8(%ebp),%eax 
    0x08048458 <+20>: mov %eax,(%esp) 
    0x0804845b <+23>: call 0x8048380 <[email protected]> 
    0x08048460 <+28>: leave 
    0x08048461 <+29>: ret  

彙編轉儲結束。

轉儲的彙編代碼功能垃圾:

0x08048471 <+0>: push %ebp 
    0x08048472 <+1>: mov %esp,%ebp 
    0x08048474 <+3>: sub $0x4,%esp 
    0x08048477 <+6>: mov $0x8048550,%eax 
    0x0804847c <+11>: mov %eax,(%esp) 
    0x0804847f <+14>: call 0x8048370 <[email protected]> 
    0x08048484 <+19>: leave 
    0x08048485 <+20>: ret  

彙編轉儲結束。

現在我組裝它沒有堆棧保護: -

gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o buffer buffer.c 

如果我給的輸入: - printf的 「wwwwwwwwwwww \ X72 \ X84 \ X04 \ X08」 | ./buffer

值: - 「x72 \ x84 \ x04 \ x08」作爲未使用函數「垃圾」的第1條指令的轉移地址。 它與12位字節一起存儲一些奇怪的內存值以及返回地址,但不是我的地址。並再次給出「分段錯誤」。在更新的Linux版本中是否有其他方式來利用緩衝區?

回答

1

休假等同於以下內容:

movl %ebp, %esp 
popl %ebp 

因此,你的情況,如果提供「WWWW」爲%EBP,該程序會嘗試做這樣的事情:

movl $0x77777777, %esp ; 0x77777777 = 'wwww' 
popl %ebp     ; read from address 0x77777777! 

您需要爲%esp提供合理的值!