2013-03-05 125 views
1

我正在學習使用GDB爲安全類導致緩衝區溢出。我有一個輸入文件,成功地使一個程序通過寫入緩衝區溢出跳轉到未經授權的功能時,我給它輸入這樣的:有沒有辦法關閉gdb的緩衝區檢查輸入?

sh myFile.txt | ./myProgram 

現在我要檢查使用GDB的授權的功能。但是當我使用tty command or using <將myFile作爲輸入提供給GDB時,GDB只需要我的輸入的中間20個字節填充20字節的緩衝區。看起來GDB正在「檢查」輸入的緩衝區大小。

  1. gdb在做什麼?
  2. 如果是這樣,是否有辦法關閉它?

C代碼如下所示:

char one[20]; 
    char two[20]; 

    printf("..."); fflush(stdout); 
    gets(one); //only takes 20 bytes from the middle of printf "morethan20bytes..." from input file 
    printf("..."); fflush(stdout); 
    gets(two); //only takes 20 bytes from the middle of printf "morethan20bytes..." from input file 
+1

你如何確定這種行爲? – 2013-03-05 14:13:57

+0

@OliCharlesworth我使用x命令檢查緩衝區1和緩衝區2的比特級內容​​。然後我轉換十六進制我看到ascii,並可以告訴,只是從中間輸入20個字符。 – bernie2436 2013-03-05 14:24:09

+0

內存內容可能已被覆蓋,但由於GDB知道陣列大小,它只會顯示該內容。您可以使用超出範圍的索引來檢查數組外部,或者轉換爲指針並添加偏移量。 – 2013-03-05 14:43:27

回答

2

GDB不 「取」 什麼。它只是假設你只想看到「one」的內容而已。

您是否知道用於在調試器中打印變量的{type} expr @ num符號?例如,看到「一」過去在緩衝區20指數的內容:

(gdb) next 
...10  gets(one); //only takes last 20 bytes of printf "morethan20bytes..." from input file 
(gdb) next 
BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH # <== simulating input 
11 printf("..."); fflush(stdout); 

(gdb) print one 
$2 = "BLAHBLAHBLAHBLAHBLAH" 

以上,看來,「一」只中有20個字符。但那是因爲gdb假設你只想看20個字節。

現在讓我們打印出來的前40個字符是開始於「一」

(gdb) print {char}[email protected] 
$3 = "BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH" 

的內存地址,您可以清楚地看到,它進入了緩衝區長度

(gdb) print two 
$4 = "BLAHBLAHBLAH\000\000\000\000\000\000\000" 

,你可以看到溢出也寫入「兩個」。

(gdb) x one 
0x7fffffffe750: 0x48414c42 
(gdb) print {char}[email protected] 
$6 = "BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH" 

上面你可以看到我們可以用內存地址做同樣的事情。

相關問題