我目前還是沒有辦法解開任何一題 Pwn 的題目(水題例外),所以今天繼續學習~
程式沒有檢查使用者輸入的長度,如果輸入了比定義的 buffer 還長的資料的話,就會造成相鄰記憶體被覆蓋。
常見的原因:
strcpy()
、gets()
,這些都不會檢查字串長度以下這個就是容易發生 buffer overflow 的例子:
#include <stdio.h>
#include <string.h>
int main() {
char input[200];
printf("請輸入字串:");
gets(input); // 這裡使用不檢查輸入字串的長度的 gets() 接收使用者輸入,容易引起 buffer overflow
char buffer[100];
strcpy(buffer, input); // strcpy() 函數也沒有檢查輸入的字串長度
return 0;
}
這邊指的不是遞迴過深造成的那種 stack overflow,Stack-based Buffer Overflow 也是 buffer overflow 的一種,成因也和 buffer overflow 差不多,只是這個 buffer 在 stack 中。
來一個例子:
#include <stdio.h>
#include <string.h>
void vulnerable_function(char *input) {
char buffer[64]; // stack 上的 buffer,大小為 64 個字元
strcpy(buffer, input); // strcpy() 沒有檢查輸入的字串長度
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("請輸入參數\n");
return 1;
}
vulnerable_function(argv[1]);
return 0;
}
和 stack 的靜態分配不同,heap 是動態分配的記憶體,並且有一個 Heap Memory Manager 來負責處理 malloc()
或是 free()
之類的操作。因為大小可變的緣故,要讓它 overflow 就要把可使用的空間全部都寫滿。
和 stack-based buffer overflow 比較不同的地方是,heap 上不會有 ret
這類可以控制程式流程的指令,所以也不能用來控制 EIP。
一般來說,heap overflow 比較常利用來:
Ref: https://bamboofox.cs.nctu.edu.tw/uploads/material/attachment/13/heap_exploit.pdf
這個是 Bamboofox 的簡報,主題是 Heap Exploitation