簡體   English   中英

緩沖區溢出怪異行為

[英]Buffer overflow weird behaviour

我已經安裝了名為DVL(該死的易受攻擊的Linux)的Linux發行版,並且正在使用緩沖區溢出漏洞進行鍛煉。 我編寫了兩個幾乎相同的程序,這些程序容易受到bof的攻擊:

//bof_n.c
#include <stdio.h>
void bof() {
  printf("BOF");
}

void foo(char* argv) {
  char buf[10];
  strcpy(buf, argv);
  prinf("foo");
}

int main(int argc, char* argv[]) {
  if (argc >= 1) {
    foo(argv[1]);
  }
  return 0;
}

//bof.c
#include <stdio.h>
void bof() {
  printf("BOF!\n");//this is the only change
}

void foo(char* argv) {
  char buf[10];
  strcpy(buf, argv);
  prinf("foo");
}

int main(int argc, char* argv[]) {
  if (argc >= 1) {
    foo(argv[1]);
  }
  return 0;
}

之后,我對它們都進行了編譯,並且在兩種情況下都獲得了bof()函數的地址(例如,objdump -d bof.o | grep bof)。 讓我們將這樣的地址命名為4字節。

我還發現,如果我在buf變量中寫入32個字節,則EIP寄存器將被完全覆蓋(由於gdb的輸出在虛擬機上,因此我無法在此處復制gdb的輸出)。

現在,如果我這樣做:

./bof `perl -e 'print "\x90"x28 . "ADDR"'`

我得到:

fooBOF!
Segmentation fault

相反,如果我嘗試相同的方法但使用bof_n,則只會收到“分段錯誤”消息。 因此,我嘗試增加重復ADDR值的次數,我發現如果將ADDR值重復至少350次,則會得到所需的結果。 但是,我得到的不是很完整的輸出,而是一長串的“ BOF”消息。 我試圖只獲得一個“ BOF”消息,但是顯然我不能做到這一點(我得到或為零,或者一長串)。 為什么會這樣呢? 任何想法?

我在gcc 3.4.6中使用DVL

你的目標是什么?

您確實應該為此使用調試器,請嘗試使用GDB Debuggergdb 有了它,您可以看到系統中當前正在發生的事情的存儲器/寄存器/堆棧和反匯編。

我猜想在第一個函數中,字符串只有3個字符的長度被優化為\\x42\\x4f\\x46\\x00 ,因此反匯編可能會略有不同。

C源代碼幾乎無關緊要,您需要反匯編或模糊化兩個二進制文件才能為兩個NOP底座找到合適的大小。

我找到了解決方案。 問題是關於消息的打印,而不是緩沖區溢出漏洞利用本身。 實際上,在bof_n示例中,寄存器eip也已被正確覆蓋,並且在bof()函數中已正確重定向了程序流。 問題是,顯然,在分段錯誤之前沒有清除標准輸出,因此沒有消息顯示。

而是使用fprintf(stderr, "BOF"); ,我終於收到了“ BOF”消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM