如何使用缓冲区溢出攻击替换堆栈上的返回地址

2024-02-09

对于家庭作业,我正在执行一系列缓冲区溢出攻击。有人给了我一个要反汇编的程序,这是一个不正确调用的函数的 C 源代码gets(),以及我应该强制程序调用的其他几个函数的源代码。对于其中一项任务,我必须:

  • 注入一些改变值的代码,然后
  • 返回上述方法之一

主要的是我不明白程序在确定返回位置时在堆栈中查找的位置。方法的返回地址存储在堆栈中的哪里?

该程序是为 x86 编译的。


您需要了解什么:

  • EIP是一个寄存器,指向下一条要执行的指令。
  • 当调用函数时,参数和 EIP(因此被调用的函数知道返回到哪里)被保存在堆栈上。

  • 当编译器被告知(显式或隐式)使用帧指针时,它会将帧指针(在 EBP 寄存器中)保存在堆栈上(以便稍后可以将帧指针恢复为调用函数上的值) ,然后将帧指针设置为指向当前堆栈顶部。这允许从已知的参考点(帧指针)轻松访问参数和局部变量,并极大地简化了调试。

  • 然后,为局部变量保留空间,并执行该函数。
  • 当从函数返回时,前一帧指针和指令指针被恢复。

x86 上的函数调用类似于:

                                        ...
int main()                              add  $-0x8,%esp ; alignment
{                                       push $0x2       ; arg 2
        ...                             push $0x1       ; arg 1
        func(1, 2);                     call func       ; function call
        ...                             add  $0x10,%esp ; pop args from stack
}                                       ...

被调用的函数看起来像:

void func(int arg1, int arg2)           push %ebp       ;\
{                                       mov  %esp,%ebp  ;/ create stack frame
        int local1;                     sub  $0x18,%esp ; reserves space
        ...                             ...
}                                       mov  %ebp,%esp  ;\
                                        pop  %ebp       ;/ destroys frame
                                        ret             ; returns

因此,堆栈将类似于:

          :           :
          +-----------+
          : alignment :
          +-----------+
12(%ebp)  |   arg2    |
          +-----------+
 8(%ebp)  |   arg1    |
          +-----------+
 4(%ebp)  |    ret    | -----> return address
          +-----------+
  (%ebp)  |    ebp    | -----> previous ebp
          +-----------+
-4(%ebp)  |  local1   | -----> local vars
          +-----------+
          : alignment :
          +-----------+
          :           :

(较低的地址在 ASCII-art 上较低)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用缓冲区溢出攻击替换堆栈上的返回地址 的相关文章

  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • 从 NASM 调用 C 函数 _printf 会导致分段错误

    我一直在尝试使用 NASM 在 Mac OS 和 Windows 上学习 64 位汇编 我的代码是 extern printf section data msg db Hello World 10 0 section text global
  • AVX-512CD(冲突检测)与原子变量访问有何不同?

    所以我在看他们展示了如何 void Histogram const float age int const hist const int n const float group width const int m const float o
  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 这种没有推送寄存器的交换有多安全?

    我对汇编非常陌生 下面的代码应该通过两个不同的函数交换两个整数 首先使用swap c然后使用swap asm 但我怀疑 我是否需要push 我的意思是保存 汇编代码之前寄存器的每个值和pop稍后 就在返回之前 main 换句话说 如果我返回
  • Visual Studio 2012 本机 C++ DLL x86 编译

    我最近将我的工具集从 Win 7 x86 Visual Studio 2010 升级到 Win 8 x64 Visual Studio 2012 但是 现在我的本机 C dll 编译为 x64 而不是 x86 除了将代码移至新操作系统并将其
  • 如何使用 Bochs 运行汇编代码?

    我想使用 Bochs 作为 8086 模拟器 是否有捷径可寻 我想要的是类似 emu8086 的东西 http www emu8086 com http www emu8086 com 如果程序的初始部分适合 512 字节 并且您不介意将自
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 错误 LNK2019:函数 main 中引用的外部符号无法解析

    我正在尝试在 C 中运行我的简单汇编代码 我只有两个文件 cpp 文件和 asm 文件 编译时出现错误 见下文 如果有人可以提供帮助 我将不胜感激 这是我的 main cpp 文件 include
  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c

随机推荐

  • Django DDP 帮助

    对于这个问题我很抱歉我还不是 django 和meteorjs 的专家 我正在尝试使用此 django ddp 技术 但我有点陷入示例使用说明中的 启动 Django DDP 服务 https github com commoncode d
  • 未加权图的最短节点序列

    我想知道是否有一种算法可以通过从头节点到尾节点的图找到最短的节点序列 该图从头节点分支出来 并且是任意复杂的 并在尾节点处收敛 节点之间的所有连接都是未加权的 我正在考虑解决这个问题 从头节点和尾节点采取探索性步骤 直到图形两端的节点接触等
  • 使用 LESS mixin 多次设置变量但得到错误的结果

    在前面 我今天开始少了 因此 欢迎提出如何做得更好的建议 我有以下 less 文件 test target context em target context 1em custom field position relative test
  • Java 将文本字符串添加到 Rectangle2D

    我有一些矩形 给定一个声明并定义为的矩形 Rectangle2D rec new Rectangle2D Double 50 50 50 50 是否可以在该矩形内添加一串文本 谢谢 不要尝试将字符串放入预定义的矩形中 而是考虑使用FontM
  • 如何在同一部分文本上的 TextView 文本上设置多个跨度?

    假设我有下一个文本 你好堆栈溢出 我希望将第二个词设置为两者相对尺寸跨度 http developer android com reference android text style RelativeSizeSpan html 设置相对字
  • 在Android中如何实现这样的UI呢?

    在我的一个应用程序中 我需要为线性布局创建一个边框 如下所示 我不想有图像并将其设置为背景 因为那时我需要为不同的设备创建各种尺寸的图像 如果我使用线性布局创建布局并使用绝对定位放置文本视图 则它在不同设备中可能看起来不符合预期 那么实现这
  • Django复杂查询从groupby和having子句中获取数据

    我想在具有 CNT Status 的 MyUser 表上执行 group by 子句 原始查询如下所示 SELECT user id from user table GROUP BY user id HAVING COUNT status
  • 尝试运行 Docker 导致退出代码 127

    我正在尝试在使用 docker 的 Windows 中运行某个应用程序 由于该应用程序是 shell 脚本 因此我使用 cygwin 终端 作为 docker 的新手 我对其工作原理没有明确的想法 使用 boot2docker 我在 Win
  • C++ 中的“auto 运算符”是什么?

    Clang https en wikipedia org wiki Clang和 Visual Studio 编译器 但不是GCC https en wikipedia org wiki GNU Compiler Collection 允许
  • 应用模板上选择属性的 xslt 处理

    我有一个如下所示的 XSLT 并将该 xslt 应用于输入 xml 粘贴在下面 它工作正常 除了需要澄清的一件事 这是输入 xml
  • 这是 C# 4 中的协方差错误吗?

    在下面的代码中 我希望能够隐式转换elements to baseElements因为TBase可以隐式转换为IBase public interface IBase public interface IDerived IBase publ
  • 如何使用/绕过 Gmail 的 SMTP 出站发送限制?

    我正在使用我的 Gmail Apps for Domain 帐户在 Rails 应用程序中发送电子邮件以获取标准自动电子邮件 用户注册 忘记密码 通知管理员新评论等 但我担心每天设置的 500 封电子邮件限制由谷歌 谷歌建议克服该限制的一种
  • Python中的R函数rep()(复制列表/向量的元素)

    R 函数rep 复制向量的每个元素 gt rep c A B times 2 1 A B A B 这就像 Python 中的列表乘法 gt gt gt A B 2 A B A B 但使用rep R函数 还可以指定向量每个元素的重复次数 gt
  • OpenCV 的 unactorPoints 是否也可以纠正它们?

    我试图通过使用带有两个摄像头的 OpenCV 2 3 1 来确定两个对象之间的距离 但无法计算对象的 objectPoints OCV 2 3 1 MSVC Windows 7 我认为这是因为在计算视差之前没有对图像点进行校正 一 我首先要
  • 从 Heroku 中的 python 应用程序运行 java 子进程

    我是 Heroku 新手 我的 Flask Web 应用程序的后端逻辑实际上正在运行一个 Java 子进程 subprocess call 来获取一些辅助数据 我知道这样做是一件坏事 在部署时 Heroku 按预期工作 并从requirem
  • 在tinymce文本编辑器数据中的字符串末尾添加句点/点

    目前我的数据保存在 mysql 数据库中 如下所示 来自tinymce textarea 在 html 中显示数据时 我需要在字符串末尾附加一个句点或点 下面是示例 数据存储在数据库中 strong Hello World strong 当
  • 评估 XML 中的 XPath 表达式

    使用Add on SDK创建Firefox插件时 如何处理XML文件 使用 XPath 评估会引发错误 XPathResult 未定义 我正在尝试处理用这个代码 var iterator xmlDoc evaluate stream xml
  • 覆盖 left_join dplyr 来更新数据

    我的问题与此类似 但是我在 LHS 中有其他应保留的列https stackoverflow com a 35642948 9285732 https stackoverflow com a 35642948 9285732 y是一个子集x
  • 角度套接字 io 未定义

    这里有一个建议 https github com btford angular socket io issues 127 https github com btford angular socket io issues 127 确保您有 s
  • 如何使用缓冲区溢出攻击替换堆栈上的返回地址

    对于家庭作业 我正在执行一系列缓冲区溢出攻击 有人给了我一个要反汇编的程序 这是一个不正确调用的函数的 C 源代码gets 以及我应该强制程序调用的其他几个函数的源代码 对于其中一项任务 我必须 注入一些改变值的代码 然后 返回上述方法之一