博客
关于我
栈上内存溢出漏洞利用之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/

    你可能感兴趣的文章
    C#选定文件复制到指定文件夹
    查看>>
    ACM DP Partitioning by Palindromes
    查看>>
    TiKV 源码解析系列文章(十三)MVCC 数据读取
    查看>>
    TiDB 源码阅读系列文章(十六)INSERT 语句详解
    查看>>
    TBSSQL 的那些事 | TiDB Hackathon 2018 优秀项目分享
    查看>>
    【面试题】Java中创建对象的方式有几种?
    查看>>
    1900分图论 : 1183E1 LCA + Kruskal
    查看>>
    (建议收藏)计算机网络:传输层概述、UDP协议与可靠传输协议习题解析与拓展
    查看>>
    Android 开发常用的工具类(更新ing)
    查看>>
    Android HUAWEI 使用安装包安装App时系统提示:文件打开失败
    查看>>
    EasyUI的简单介绍
    查看>>
    Idea代码统计工具
    查看>>
    python 安装scikit-learn遇到的问题解决方案
    查看>>
    HTTP 错误 500.21 - Internal Server Error 发布网站遇到这个错误
    查看>>
    微信小程序:出现脚本错误或者未正确调用 Page()错误解决
    查看>>
    Android获得缩略图的代码注释
    查看>>
    2017-05-11 DBA日记,导致log file sync单次等待超500ms又一可能
    查看>>
    MySQL查询---排序后取第一条数据
    查看>>
    初次安装webpack之后,提示安装webpack-cli
    查看>>
    Java后端服务明显变慢诊断思路
    查看>>