2017-06-02 63 views
2

一切我閱讀使我相信,這應該引起stack buffer overflow,但是它沒有:爲什麼我沒有獲得緩衝區溢出?

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

int main(int argc, char *argv[]) { 
    char password[8]; 
    int correctPassword = 0; 

    printf("Password \n"); 
    gets(password); 

    if(strcmp(password, "password")) 
    { 
     printf ("Wrong password entered, root privileges not granted... \n"); 
    } 
    else 
    { 
     correctPassword = 1; 
    } 

    if(correctPassword) 
    { 
     printf ("Root privileges given to the user \n"); 
    } 

    return 0; 
} 

但這裏是我的輸出:

description

在這種情況下

,testtesttesttesttest顯然是大於8個字符,並根據source,它應該導致stack buffer overflow,但它不。爲什麼是這樣?

+11

因爲它是未定義的行爲,所以任何事情都可能發生。 https://stackoverflow.com/documentation/c/364/undefined-behavior#t=201706020423447810219。 – Stargateur

+2

您預期堆棧溢出如何顯示?當我運行這個時,我得到以下輸出:'輸入了錯誤的密碼,未授予root權限... ***堆棧檢測到***:./溢出終止 ' – merlin2011

+0

'p&password [8]'和'p&correctPassword'顯示? – Ryan

回答

1

讀取更多字節,那麼您的緩衝區可以包含並不總是會導致運行時錯誤,但它是一個非常糟糕的和常見的錯誤(閱讀本文about smashing the stack)。當我讀到評論時,你添加了-fno-stack-protector讓程序不打印*堆棧粉碎檢測到*但這不是一個好主意。你應該使用scanf(" %8s",password)或類似的東西來限制你閱讀的內容。

+0

[堆棧緩衝區溢出](https://en.wikipedia.org/wiki/Stack_buffer_overflow)確實是與[堆緩衝區溢出]相同的事情(https://en.wikipedia.org/wiki/Heap_overflow) – bradgonesurfing

+0

@bradgonesurfing我不明白我在說什麼堆。你可以說得更詳細點嗎? – BetaRunner

+1

您批評術語「堆棧緩衝區溢出」是一個不正確的術語,聲稱它不同於「緩衝區溢出」。術語「堆棧緩衝區溢出」沒有任何問題。它意味着恰好存在於已寫入但在其範圍外的堆棧上的緩衝區。 – bradgonesurfing

1

您的代碼確實會導致堆棧上的緩衝區溢出,因爲您已覆蓋爲password緩衝區分配的內存。注意提供輸入後覆蓋的內存。

gcc -o Overflow Overflow.c -fno-stack-protector -g 

gdb Overflow 
(gdb) b 8 
Breakpoint 1 at 0x4005cc: file Overflow.c, line 8. 
(gdb) b 11 
Breakpoint 2 at 0x4005e2: file Overflow.c, line 11. 
(gdb) r 
Starting program: /home/hq6/Code/SO/C/Overflow 

Breakpoint 1, main (argc=1, argv=0x7fffffffde08) at Overflow.c:8 
8  printf("Password \n"); 
(gdb) x/20x password 
# Memory before overflow 
0x7fffffffdd10: 0xffffde00 0x00007fff 0x00000000 0x00000000 
0x7fffffffdd20: 0x00400630 0x00000000 0xf7a2e830 0x00007fff 
0x7fffffffdd30: 0x00000000 0x00000000 0xffffde08 0x00007fff 
0x7fffffffdd40: 0xf7ffcca0 0x00000001 0x004005b6 0x00000000 
0x7fffffffdd50: 0x00000000 0x00000000 0x67fbace7 0x593e0a93 
(gdb) c 
Continuing. 
Password 
correctPassword 

Breakpoint 2, main (argc=1, argv=0x7fffffffde08) at Overflow.c:11 
11  if(strcmp(password, "password")) 
(gdb) x/20x password 
# Memory after overflow 
0x7fffffffdd10: 0x72726f63 0x50746365 0x77737361 0x0064726f 
0x7fffffffdd20: 0x00400630 0x00000000 0xf7a2e830 0x00007fff 
0x7fffffffdd30: 0x00000000 0x00000000 0xffffde08 0x00007fff 
0x7fffffffdd40: 0xf7ffcca0 0x00000001 0x004005b6 0x00000000 
0x7fffffffdd50: 0x00000000 0x00000000 0x67fbace7 0x593e0a93 

緩衝區溢出是否具有不良副作用是未定義的行爲。