iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
1
自我挑戰組

到處挖坑,現在該來還(填)願(坑)ㄌ !!!系列 第 29

『 Day 29』拜託別 Pwn 我啦! - Buffer Overflow

https://ithelp.ithome.com.tw/upload/images/20191013/20115060ClanoAyKAe.png

你曾經有沒有想過,如果我們在一個輸入框輸入了很多的字元,那麼會發發生什麼是呢?就讓我們繼續看下去...

Buffer Overflow

Buffer Overflow 俗稱『緩衝區溢位』。常見原因是程式未對輸入的資料進行長度檢查,導致若有使用者輸入一筆較長的資料,這會造成程式癱瘓或改變執行流程。

舉個簡單的例子,char 陣列(字串)的輸入

  • gets 沒有限制輸入長度

  • read 有限制最⼤輸入長度

這裡寫個 Code 來比較一下差異吧!

#include <stdio.h>
int main(){
char buffer[8];
    gets(buffer);    // Input
    puts(buffer);    // Output
    return 0;
}

Compile & Run

gcc test.c -fno-stack-protector -o test    //必須先關閉 canary 保護機制

./test
> hello
< hello

./test
> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
< aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
zsh: segmentation fault (core dumped)  ./test

基礎的 Pwn 題型

常見的 Buffer Over Flow,在 CTF 中是很常見的題型,範例程式碼如下。

#include <stdio.h>
 
void func(arg1, arg2){
    char buffer[16];
    gets(buffer);
    printf("Hello, %s", buffer);
}

如果夠敏銳一定可以察覺到 buffer 僅有 16 個 Bytes 的長度,而 gets 並沒有限制使用者輸入的長度,當使用者輸入大於 16 個字元時,可能就會造成程式錯誤。

這樣說似乎有些抽象,假設 Stack 狀態如下。

https://ithelp.ithome.com.tw/upload/images/20191015/20115060rxobRWCLgc.png

當使用者輸入超過 16 個字元時的狀況,例如大量的 A,並且觀察 Stack 的狀態,可以發現所有資料都被取代成 A 了。

https://ithelp.ithome.com.tw/upload/images/20191015/20115060oNlldxThu5.png

其中比較關鍵的地方是,原先為 ret address 的藍色區塊,ret address 紀錄的是一個進入該 Function 前的下一行指令的記憶體位置。

https://ithelp.ithome.com.tw/upload/images/20191014/2011506003dTjGnME5.png

所以只要可以很精確地把 ret address 覆蓋成其他 Function 的記憶體位置,即可在該 Func Function 結束後跳至由使用者控制的目的地。

https://ithelp.ithome.com.tw/upload/images/20191015/20115060dDtksoDsQj.png

參考資料


上一篇
『 Day 28』拜託別 Pwn 我啦! - Protection 保護機制
下一篇
『 Day 30』管他是夢境?還是現實?來造夢吧!
系列文
到處挖坑,現在該來還(填)願(坑)ㄌ !!!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言