博客
关于我
栈上内存溢出漏洞利用之Return Address
阅读量:623 次
发布时间:2019-03-14

本文共 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_sfread_smemcpy_s。这些函数在拷贝过程中进行内存检查,能有效避免栈溢出漏洞。

  • GS检查(Guard Stack)

    Visual Studio可以通过/GS编译选项启用栈保护功能。在函数返回时,检验栈框架的完整性。一旦发现异常,进程将终止,防止潜在的恶意代码执行。

  • 限制栈使用

    对于不需要栈操作的函数,尽量避免使用局部数组或最大化栈使用量。对于需要使用的函数,严格控制数组大小,以确保不会溢出。

  • 微调安全策略

    在生产环境中启用Address Space Layout Randomization(ASLR)和堆保护功能,增加攻击面的复杂性。

  • 参考资料

    • 《Modern Windows Exploit Development》 by Massimiliano Tomassoli

    结论

    Stack overflow是一个严重的安全问题,尤其是在攻击者能够覆盖返回地址并注入恶意代码的情况下。通过妥善理解栈结构、使用安全函数、启用保护选项和构建健全的安全策略,可以有效降低栈溢出漏洞的风险。

    转载地址:http://ekgoz.baihongyu.com/

    你可能感兴趣的文章
    [梁山好汉说IT] 梁山好汉和抢劫银行
    查看>>
    [源码解析] 消息队列 Kombu 之 基本架构
    查看>>
    [源码分析] 消息队列 Kombu 之 启动过程
    查看>>
    wx.NET CLI wrapper for wxWidgets
    查看>>
    Silverlight for linux 和 DLR(Dynamic Language Runtime)
    查看>>
    ASP.NET MVC Action Filters
    查看>>
    Powershell中禁止执行脚本解决办法
    查看>>
    OO_Unit2 多线程电梯总结
    查看>>
    git clone 出现fatal: unable to access ‘https://github 错误解决方法
    查看>>
    04_Mysql配置文件(重要参数)
    查看>>
    python 加密算法及其相关模块的学习(hashlib,RSA,random,string,math)
    查看>>
    JavaSE总结
    查看>>
    手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
    查看>>
    Python IO编程
    查看>>
    CSS入门总结
    查看>>
    使用 TortoiseGit 时,报 Access denied 错误
    查看>>
    基于 HTML5 WebGL 的污水处理厂泵站自控系统
    查看>>
    django-表单之模型表单渲染(六)
    查看>>
    c++之程序流程控制
    查看>>
    spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
    查看>>