news 2026/9/24 6:51:06

图解原理:3个步骤搞定缓冲区溢出教程实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图解原理:3个步骤搞定缓冲区溢出教程实战

图解原理:3个步骤搞定缓冲区溢出教程实战

版本升级后 API 全变了,你是不是也对着新文档抓耳挠腮?别慌,这篇缓冲区溢出教程不玩虚的,直接上图解原理和可运行代码。

项目目标:从零搭建可控溢出演示环境

很多应届生面试被问“怎么构造一个可控的缓冲区溢出”,脑子里一片空白。其实核心就三点:可控输入、已知布局、可观察崩溃。我们不用真实系统,用 Python + C 搭建一个最小化靶场,重点不是“黑进系统”,而是理解栈帧结构、返回地址覆盖机制,以及为什么现代系统要加栈保护(Stack Canary)。

本项目目标明确:

  • 用 C 写一个 vulnerable 函数,接收用户输入
  • 用 Python 脚本生成精确长度的 payload
  • 通过 GDB 观察寄存器变化,确认返回地址被覆盖
  • 对比开启/关闭 -fstack-protector 的行为差异

这不是玩具,而是复现 CTF 题目和面试手写题的标准流程。官方文档如 GCC 的 man gcc 中明确说明 -fstack-protector 会在栈帧插入 canary 值,这正是我们后续要“绕过”的对象。

目录结构:最小化可复现工程

buffer-overflow-lab/
├── src/
│   ├── vuln.c          # 含漏洞的 C 程序
│   └── main.c          # 调用入口
├── exploit.py          # Payload 生成器
├── run.sh              # 一键编译+运行脚本
└── README.md

所有文件都控制在 50 行以内,确保你能在 10 分钟内跑通。vuln.c 是核心,exploit.py 负责计算偏移,run.sh 自动化编译参数。

核心代码实现:逐行拆解 vulnerable 函数

先看 C 端,这是整个教程的根基:

// src/vuln.c
#include <stdio.h>
#include <string.h>void vulnerable() {char buffer[16]; // 栈上分配 16 字节缓冲区gets(buffer);    // 无边界检查,经典漏洞点printf("Input: %s\n", buffer);
}int main() {printf("Enter input: ");vulnerable();printf("Back to main\n"); // 若返回地址被覆盖,这里不会执行return 0;
}

关键行解析:

  • char buffer[16]:栈帧中固定大小区域,编译器不会自动检查写入长度
  • gets(buffer):C89 标准函数,无任何长度限制,已被 C11 标记为危险,但教学中仍常用因其行为最纯粹
  • printf("Back to main\n"):验证函数是否正常返回。若 payload 覆盖了返回地址,程序会跳转到非法地址崩溃

注意:gets 在较新 GCC 版本中默认禁用,需加 -D_FORTIFY_SOURCE=0 或改用 read(0, buffer, 999)。我们在 run.sh 中统一处理。

运行与测试:GDB 观察栈帧变化

先编译,必须关闭栈保护

# run.sh
gcc -o vuln src/main.c src/vuln.c \-fno-stack-protector \-z execstack \-no-pie

参数说明:

  • -fno-stack-protector:禁用 canary,否则溢出会先触发 SIGABRT 而非跳转
  • -z execstack:允许栈可执行(实际 exploit 中不一定需要,但避免某些平台拦截)
  • -no-pie:禁用位置无关执行,使地址固定,便于计算偏移

用 GDB 加载:

gdb ./vuln
(gdb) break main
(gdb) run

输入 20 个 A,观察栈:

(gdb) x/16xw $esp

你会看到 buffer 起始地址,返回地址通常在 buffer 之后 16 字节(取决于编译器对齐)。用 exploit.py 精确定位:

# exploit.py
import sys# 假设 offset=20(需根据 GDB 实测调整)
OFFSET = 20
TARGET_ADDR = 0xdeadbeef  # 假地址,用于验证跳转payload = b'A' * OFFSET
payload += TARGET_ADDR.to_bytes(4, 'little')  # 小端序
sys.stdout.buffer.write(payload)

运行 python3 exploit.py | ./vuln,若 GDB 显示 $eip = 0xdeadbeef,说明返回地址已被覆盖。这就是缓冲区溢出的本质:用数据区写入覆盖控制流。

优化扩展:应对现代防护机制

真实系统不会让你这么轻松。我们扩展三种常见防护:

1. 栈保护(Stack Canary)

重新编译时去掉 -fno-stack-protector,输入超长数据会触发:

*** stack smashing detected ***: terminated

原理:编译器在 buffer 后插入随机 canary,返回前检查其完整性。绕过方法:泄露 canary 值(需配合格式化字符串漏洞等),但超出本文范围。

2. ASLR(地址空间布局随机化)

每次运行 vulnmain 地址不同。解决:

  • 使用 readelf -s vuln 找 PLT 表固定符号
  • 或找 ret 指令地址实现 ROP(Return-Oriented Programming)

3. NX(不可执行栈)

-z execstack 关闭后,即使跳转成功,若目标地址无代码权限仍会崩溃。此时需 shellcode 放在 .data 段或用 ROP 链。

面试高频追问: “如果开启所有防护,还能溢出吗?”
答:能,但需组合漏洞(如 info leak + ROP)。纯栈溢出在现代系统上已难独立利用,但原理仍是理解内存安全的基础。

小结:从教程到面试的衔接

这套缓冲区溢出教程没有教你“黑客技术”,而是拆解了栈帧布局、返回地址机制、防护原理。面试官问“什么是缓冲区溢出”,你该答:

  • 定义:写入超过分配空间,覆盖相邻内存
  • 危害:可篡改返回地址,劫持控制流
  • 防护:canary、ASLR、NX、SafeLibC

这个知识点你面试被问过吗?留言说说你当时怎么答的,或者卡在哪个环节。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 23:09:25

3天搞定巨人的陨落在线阅读系统一文搞懂

3天搞定巨人的陨落在线阅读系统一文搞懂 看了一堆教程还是不会写项目?别慌,这种“眼高手低”的尴尬,90%的后端新手都踩过。今天我不讲虚的,直接带你从零搭建一个名为“巨人的陨落在线阅读”的实战项目。为什么选这个题目?因为《巨人的陨落》本身是部史诗巨著,章节多、人物关系复杂,非常适合用来做数据建模和分页…

作者头像 李华
网站建设 2026/9/22 23:09:25

2026最新周杰伦给别人写的歌底层逻辑拆解

2026最新周杰伦给别人写的歌底层逻辑拆解 版本升级后 API 全变了,这是很多老鸟在 2026 最新技术栈迁移时最头疼的问题。当你试图复用过去几年的代码库,发现原本流畅的调用链路瞬间断裂,报错信息密密麻麻,那种无力感非常真实。…

作者头像 李华
网站建设 2026/9/22 23:08:57

2026最新:搞定整体性,复制代码跑不通别慌

2026最新:搞定整体性,复制代码跑不通别慌 盯着屏幕上满屏的红字报错,你是不是也心累?那种感觉就像拿着一张没有标注的地图在迷宫里瞎转,明明照着CSDN上高赞帖子复制的代码,一行没改,跑起来却直接崩溃。 别急,这通常不是你的代码写错了,而是你忽略了 整体性 。…

作者头像 李华
网站建设 2026/9/22 23:08:54

3个实战项目拆解strike vector面试真题

3个实战项目拆解strike vector面试真题 看了一堆教程还是不会写项目,这是很多开发者卡在中级阶段的死穴。 特别是面对 strike vector 这种看似冷门但高频出现的面试考点,大家往往死记硬背概念,一到实战项目就露馅。 真正的差距,不在于你背了多少定义,而在于你能不能在 15…

作者头像 李华
网站建设 2026/9/22 23:08:27

3个核心技巧搞定火影忍者究极风暴3操作源码解析面试

3个核心技巧搞定火影忍者究极风暴3操作源码解析面试 刚背完语法就写不出项目?别慌,这是90%开发者的通病。很多学员在面试中被问“火影忍者究极风暴3操作”这类看似无关的话题,实际考察的是 系统思维与源码解析能力 。游戏操作背后的状态机、事件驱动、性能优化,与后端服务设计异曲同工。 考点梳理…

作者头像 李华
网站建设 2026/9/22 23:08:10

3个关键点一文搞懂红外防盗报警器手写实现

3个关键点一文搞懂红外防盗报警器手写实现 面试被问“红外防盗报警器怎么防误报”,你只能干巴巴说“用红外对射”,结果面试官追问信号处理逻辑,你瞬间卡壳?别慌,这种底层原理题,很多培训机构只教接口调用,不抠源码,导致你面试时像背课文,一戳就破。…

作者头像 李华