
栈上内存溢出漏洞利用之Return Address
发布日期:2021-05-17 16:49:22
浏览次数:6
分类:精选文章
本文共 1869 字,大约阅读时间需要 6 分钟。
栈上内存溢出与攻击——如何利用栈溢出覆盖返回地址并注入ShellCode
栈溢出的基本概念与危害
栈(Stack)是计算机中的一种内存结构,用于存储局部变量及函数调用的上下文信息。在函数调用执行过程中,局部变量通过压栈和弹栈操作存储起来。然而,栈溢出问题可能会导致严重后果,包括程序Crash或运行意想不到的代码片段。
栈溢出的常见结果是覆盖了堆栈中的某些关键信息,例如Return Address(返回地址)。返回地址是函数返回执行调用链时所需的地址,如果被修改,程序可能会执行错误的指令,导致整个系统崩溃或进入恶意代码执行状态。
栈溢出迹象与攻击方法
在32位环境中,当局部数组进行无效读写操作时,容易造成栈溢出。尤其是当局部变量被赋值超过其容量时,可能会覆盖上栈帧的数据。在这种情况下,攻击者可以利用这个漏洞来覆盖返回地址,并将其设置为执行恶意代码或ShellCode。
如何利用栈溢出注入ShellCode
为了实现栈溢出攻击,攻击者需要以下几个关键步骤:
确定溢出范围与结构
通过分析栈帧结构,找到局部变量的偏移量,确定覆盖返回地址的offset值。例如,Return Address
通常位于数组结束后的偏移位置。覆盖返回地址
在进行文件读取或其他可能导致溢出的操作时,修改数组的长度或内容,覆盖返回地址指令。例如,在32位环境下,cszContent
数组溢出可能会覆盖Return Address
,导致程序跳转到攻击者的恶意代码中。注入ShellCode
利用覆盖后的返回地址直接跳转到预先准备的机器码(ShellCode)。ShellCode是一段可执行的代码片段,通常调用操作系统功能,如弹出计算器、删除文件或获取权限。确定ShellCode的位置
通过工具(如Mona.py)搜索系统库(如ntdll.dll)中的jmp esp
指令,获取其虚拟地址。例如,Mona.py可以搜索jmp esp
的位置并返回相应的地址。构造并执行攻击程序
将覆盖后的返回地址设置为`t继 ll_en 直接跳转到ShellCode的虚拟地址,随后将ShellCode注入进程并执行。注入示例:
覆盖后的返回地址填充:将返回地址覆盖为Mona.py搜索得到的
0x77b3f973
,这是jmp esp
的虚拟地址。ShellCode:一个简单的ShellCode片段用于弹出Windows计算器。例如:
; 计算器弹出代码.stack sectionglobal _stackела нщћ hus PROFILE.Libc.return("/ цель", аспект",ictionsallope al Hans al pl勾 определедирект оонIDISWinPEGs bloonle スタック сみたい弾矢ф,nullpies.core.sno.eding.germanikabilitas bolidep职场汉堡验证看似 расмотреть popalоя legionicealingPopup disable танцевальную последовательnosн Igor彩虹ни выявиw後問題
攻击程序构造:使用Python脚本构造包含覆盖地址和ShellCode的攻击程序,并将其写入目标文件。
栈溢出的防范措施
使用安全函数
使用微软推荐的安全函数替代标准库函数,如strcpy_s
、fread_s
和memcpy_s
。这些函数在拷贝过程中进行内存检查,能有效避免栈溢出漏洞。GS检查(Guard Stack)
Visual Studio可以通过/GS
编译选项启用栈保护功能。在函数返回时,检验栈框架的完整性。一旦发现异常,进程将终止,防止潜在的恶意代码执行。限制栈使用
对于不需要栈操作的函数,尽量避免使用局部数组或最大化栈使用量。对于需要使用的函数,严格控制数组大小,以确保不会溢出。微调安全策略
在生产环境中启用Address Space Layout Randomization(ASLR)和堆保护功能,增加攻击面的复杂性。参考资料
- 《Modern Windows Exploit Development》 by Massimiliano Tomassoli
结论
Stack overflow是一个严重的安全问题,尤其是在攻击者能够覆盖返回地址并注入恶意代码的情况下。通过妥善理解栈结构、使用安全函数、启用保护选项和构建健全的安全策略,可以有效降低栈溢出漏洞的风险。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年05月06日 09时08分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
2019-03-06
Python IO编程
2019-03-06
CSS入门总结
2019-03-06
使用 TortoiseGit 时,报 Access denied 错误
2019-03-06
基于 HTML5 WebGL 的污水处理厂泵站自控系统
2019-03-06
django-表单之模型表单渲染(六)
2019-03-06
c++之程序流程控制
2019-03-06
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
2019-03-06
有道云笔记 同步到我的博客园
2019-03-06
李笑来必读书籍整理
2019-03-06
Hadoop(十六)之使用Combiner优化MapReduce
2019-03-06
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
2019-03-06
CoreCLR源码探索(八) JIT的工作原理(详解篇)
2019-03-06
andriod 开发错误记录
2019-03-07
C语言编译错误列表
2019-03-07
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
2019-03-07
《web安全入门》(四)前端开发基础Javascript
2019-03-07
python中列表 元组 字典 集合的区别
2019-03-07