緩衝區溢位

講者 : 邱妍瑛

日期:2019 / 12 / 1

大綱

  • 緩衝區溢位簡介
  • Lab - 簡單的實作
  • 延伸介紹
  • 參考資料

Outline

Buffer overflow

緩衝區溢位簡介

緩衝區溢位簡介

是針對程式設計缺陷,

向程式輸入超過了處理限制的範圍的資料

導致相鄰存儲器位置被覆蓋,

從而破壞程式執行或趁著中斷之際取得系統控制權。

U S E R N A M E
1 2
0 1 2 3 4 5 6 7

緩衝區 (8byte)

溢位

8 9

Buffer overflow

Lab - 簡單的實作

寫程式囉

使用 C 語言:

#include <stdio.h>
 
void Name()
{
    char name[10];
    printf("What's your name?\n");
    gets(name);
    printf("Hey %s, how are you?\n", name);
}
int main()
{
    Name();
    return 0;
}

Step 1

安裝 gcc (Mac)

請按這個連結前往 homebrew,

照官網步驟安裝好後,在終端機輸入:

Step 2

$ brew install gcc
$ gcc --version
$ whereis gcc

確認是否安裝 gcc :

安裝 gcc (Windows)

請按這個連結前往 minGW,

安裝後更改環境變數為你的 minGW 的路徑

Step 2

$ gcc --v

確認是否安裝 gcc :

找到 PATH 的方式可參考這裡

真的不懂可以參考這個影片的 14:40 秒左右https://www.bilibili.com/video/av75301720/

用 gcc 編譯

Step 3

$ gcc overflow.c -o overflow -fno-stack-protector

打開終端機並輸入 :

overflow.c 是你剛剛的檔案名稱

Step 3

$ gcc overflow.c -o overflow -fno-stack-protector

意思是「不啟用堆棧保護器」。

-fno-stack-protector

用於設置編譯後的檔案名稱。

-o

$ gcc -o overflow overflow.c -fno-stack-protector

執行程式

Step 4

$ ./overflow //mac
$ overflow //windows
What is your name?

>>>Erica

Hey Erica, how are you?

如果我們的輸入少於10個字元:

Step 4

What is your name?

>>>EricaOneAAAAAAAAAA

Hey EricaOneAAAAAAAAAA, how are you?
segmentation fault 

如果我們的輸入大於10個字元:

這表示我們成功使用「緩衝區溢位」使程式中斷。

segmentation fault

Buffer overflow

延伸介紹

如果刪除此命令,重新編譯並執行,應該會失敗。

fno-stack-protector

當輸入少於 10 個字元

▼ Stack

為什麽會 「segmentation fault」?

name[1]
...
name[10]
rdp
ret of Name

當輸入比 10 個字元多

▼ Stack

name[1]
...
name[10]
rdp
ret of Name

Erica

OneAA

AAAAAAAA

Buffer overflow

參考資料

Buffer overflow

Thanks for listening.

緩衝區溢位

By oneone

緩衝區溢位

SIRLA - This 15 speech

  • 64