二元炸弹 - 第 4 阶段

2023-11-26

我很难追踪以下二进制炸弹的汇编代码(学校的一项作业,其中必须拆除炸弹,该炸弹包含 6 个阶段,所有阶段都有 1 个正确的输入才能进入下一阶段)。我目前处于 Phase_4,它有一个名为 func4 的递归函数。我已经确定输入是“%d %d”,它是两个整数。但是,即使在每个步骤中获取所有寄存器的信息之后,我也无法完全弄清楚 func4 正在做什么。

Phase_4:

    (gdb) disas
Dump of assembler code for function phase_4:
=> 0x08048e24 <+0>: sub    $0x2c,%esp
   0x08048e27 <+3>: lea    0x1c(%esp),%eax
   0x08048e2b <+7>: mov    %eax,0xc(%esp)
   0x08048e2f <+11>:    lea    0x18(%esp),%eax
   0x08048e33 <+15>:    mov    %eax,0x8(%esp)
   0x08048e37 <+19>:    movl   $0x804a7f1,0x4(%esp)
   0x08048e3f <+27>:    mov    0x30(%esp),%eax
   0x08048e43 <+31>:    mov    %eax,(%esp)
   0x08048e46 <+34>:    call   0x80488d0 <__isoc99_sscanf@plt>
   0x08048e4b <+39>:    cmp    $0x2,%eax
   0x08048e4e <+42>:    jne    0x8048e5d <phase_4+57>
   0x08048e50 <+44>:    mov    0x18(%esp),%eax
   0x08048e54 <+48>:    test   %eax,%eax
   0x08048e56 <+50>:    js     0x8048e5d <phase_4+57>
   0x08048e58 <+52>:    cmp    $0xe,%eax
   0x08048e5b <+55>:    jle    0x8048e62 <phase_4+62>
   0x08048e5d <+57>:    call   0x8049470 <explode_bomb>
   0x08048e62 <+62>:    movl   $0xe,0x8(%esp)
   0x08048e6a <+70>:    movl   $0x0,0x4(%esp)
   0x08048e72 <+78>:    mov    0x18(%esp),%eax
   0x08048e76 <+82>:    mov    %eax,(%esp)
   0x08048e79 <+85>:    call   0x8048dbb <func4>
   0x08048e7e <+90>:    cmp    $0x25,%eax
   0x08048e81 <+93>:    jne    0x8048e8a <phase_4+102>
   0x08048e83 <+95>:    cmpl   $0x25,0x1c(%esp)
   0x08048e88 <+100>:   je     0x8048e8f <phase_4+107>
   0x08048e8a <+102>:   call   0x8049470 <explode_bomb>
   0x08048e8f <+107>:   add    $0x2c,%esp
   0x08048e92 <+110>:   ret    
    End of assembler dump.

func4:

Breakpoint 2, 0x08048dbb in func4 ()
(gdb) disas
Dump of assembler code for function func4:
=> 0x08048dbb <+0>: sub    $0x1c,%esp
   0x08048dbe <+3>: mov    %ebx,0x14(%esp)
   0x08048dc2 <+7>: mov    %esi,0x18(%esp)
   0x08048dc6 <+11>:    mov    0x20(%esp),%eax
   0x08048dca <+15>:    mov    0x24(%esp),%edx
   0x08048dce <+19>:    mov    0x28(%esp),%esi
   0x08048dd2 <+23>:    mov    %esi,%ecx
   0x08048dd4 <+25>:    sub    %edx,%ecx
   0x08048dd6 <+27>:    mov    %ecx,%ebx
   0x08048dd8 <+29>:    shr    $0x1f,%ebx
   0x08048ddb <+32>:    add    %ebx,%ecx
   0x08048ddd <+34>:    sar    %ecx
   0x08048ddf <+36>:    lea    (%ecx,%edx,1),%ebx
   0x08048de2 <+39>:    cmp    %eax,%ebx
   0x08048de4 <+41>:    jle    0x8048dfd <func4+66>
   0x08048de6 <+43>:    lea    -0x1(%ebx),%ecx
   0x08048de9 <+46>:    mov    %ecx,0x8(%esp)
   0x08048ded <+50>:    mov    %edx,0x4(%esp)
   0x08048df1 <+54>:    mov    %eax,(%esp)
   0x08048df4 <+57>:    call   0x8048dbb <func4>
   0x08048df9 <+62>:    add    %eax,%ebx
   0x08048dfb <+64>:    jmp    0x8048e16 <func4+91>
   0x08048dfd <+66>:    cmp    %eax,%ebx
   0x08048dff <+68>:    jge    0x8048e16 <func4+91>
   0x08048e01 <+70>:    mov    %esi,0x8(%esp)
   0x08048e05 <+74>:    lea    0x1(%ebx),%edx
   0x08048e08 <+77>:    mov    %edx,0x4(%esp)
   0x08048e0c <+81>:    mov    %eax,(%esp)
   0x08048e0f <+84>:    call   0x8048dbb <func4>
   0x08048e14 <+89>:    add    %eax,%ebx
   0x08048e16 <+91>:    mov    %ebx,%eax
   0x08048e18 <+93>:    mov    0x14(%esp),%ebx
   0x08048e1c <+97>:    mov    0x18(%esp),%esi
   0x08048e20 <+101>:   add    $0x1c,%esp
   0x08048e23 <+104>:   ret    
End of assembler dump.

我希望很明显phase4正在检查第一个数字是否在范围内0..14包含在内(参见行+44..+57) 然后它调用func4有三个参数:输入的第一个数字,0 and 14 (lines +62..+85)。接下来它检查返回值是否为0x25(十进制 37)在线+90输入的第二个数字也是37 (line +95)

让我们继续func4。我将调用这三个参数x, low and high。最初您当然不知道它们是什么。线路+23..+34计算(high - low) / 2。丑陋的混乱是因为编译器生成代码来处理截断为零的负数。但我们不会看到任何负数。线+36只是一个奇特的补充,所以在ebx我们现在有low + (high - low) / 2这也称为两个数字的平均值。然后代码将该平均值与数字进行比较x这已作为第一个参数提供。线路+43..+62被执行如果x < average他们调用func4(x, low, average - 1)并将返回值添加到平均值中。同样,线+70..+89被执行如果x > average并计算average + func4(x, average + 1, high). If x == average然后只返回平均值本身。

它基本上是进行二分搜索并总结猜测。假设区间有 15 个元素,则最多需要 4 次猜测。第一个猜测是7,这样就可以得到所需的结果37我们需要30更多的。我们最多还有 3 次尝试,所有的猜测要么小于 7,要么大于 7。7 * 3 = 21那不能给我们30这意味着数字必须大于 7。因此第二个猜测是(8 + 14) / 2 = 11,求和18 with 19还有更多的事情要做。如果数字高于 11,则意味着我们超出了目标,因此数字必须大于 7 且小于 11。第三个猜测是(8 + 10) / 2 = 9这使得总和为27 with 10还有更多的事情要做,只是一个猜测,所以这意味着数字是10.

TL;DR:正确的输入应该是10 and 37

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

二元炸弹 - 第 4 阶段 的相关文章

  • 测试是否定义了 gdb 便利变量

    有没有办法测试 gdb 中是否设置了便利变量 例如 gdb if exitcode 0 gt quit gt end Invalid type combination in equality test gdb p exitcode 1 vo
  • 为什么这个“std::atomic_thread_fence”起作用

    首先我想谈一下我对此的一些理解 如有错误请指正 a MFENCE在x86中可以保证全屏障 顺序一致性可防止 STORE STORE STORE LOAD LOAD STORE 和 LOAD LOAD 重新排序 这是根据维基百科 https
  • 为什么我可以使用 ret 退出 main?

    我即将弄清楚程序堆栈到底是如何设置的 我了解到用以下方式调用该函数 call pointer 实际上等同于 mov register pc programcounter add register 1 where 1 is one instr
  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • 破坏/分解函数的函数

    我以前有过 here https stackoverflow com questions 4920610 c class function in assembly 已经表明 C 函数不容易用汇编表示 现在我有兴趣以一种或另一种方式阅读它们
  • C++ 中的 CPUID 实现

    我想知道这里是否有人有一些可以从任何托管 net 语言引用的 C CPUID 实现的好示例 另外 如果情况并非如此 我是否应该注意 X86 和 X64 之间的某些实现差异 我想使用 CPUID 来获取运行我的软件的机器上的信息 崩溃报告等
  • 什么时候汇编比C更快? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 为什么不能执行 mov [eax], [ebx] [重复]

    这个问题在这里已经有答案了 我可以做这个 mov eax ebx 和这个 mov eax ebx 甚至这个 mov eax ebx 但不是这个 错误C2415 mov eax ebx 只是wtf 为什么 它与 ptr1 ptr2 相同 为什
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

    我在用x86GNU 与 GCC 的程序集 并尝试实现相当于以下内容的程序集c c int x 10 x 0 5 但是 当我尝试运行 使用命令 a out 我的汇编代码如下 第一次编译后gcc filename s 错误Segmentatio
  • Visual Studio Code,调试子进程不起作用

    我有这个确切的问题 https github com Microsoft vscode cpptools issues 511 https github com Microsoft vscode cpptools issues 511 但那
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 用于生成 C++ 代码轮廓/图的工具 - 有这样的东西吗? [复制]

    这个问题在这里已经有答案了 我需要深入研究用 C 编写的软件组件并对其进行一些修改 我幻想生成一些代码映射 它将显示类之间的关系并引导我完成方法的流程 调用图 有这个工具吗 几年前 我使用 Rational Rose 建模工具 该工具具有对
  • 用于将类文件转换为 Java 源代码的 Eclipse 插件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当源不可用时 是否有可用的 Eclipse 插件来反编译类文件 从 class 文件生成 java 源代码 类似于 Resharper 在
  • “劣质调试器”一词中的“劣质”是什么意思?

    我不太明白GDB手册中对inferior的解释 谷歌也没有提供任何更有帮助的信息 谁能简单地解释一下 低等 劣质 是一个通用术语 表示 您正在使用 gdb 来调试的东西 通常是在模拟器或通过串行线路连接的其他硬件上运行的进程或内核 当您使用
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x

随机推荐

  • 用于 Ruby on Rails / ActiveRecord 的优雅 PostgreSQL Group by

    尝试使用 PostgreSQL 检索按日期分组的 ActiveRecord 对象数组 更具体地说 我正在尝试翻译以下 MySQL 查询 posts Post all group gt date date conditions gt loca
  • 具有其他表的多个 id 的 SQL 字段

    有人可以告诉我如何创建这个数据库结构吗 这是一个例子 Table countries id countryname 1 US 2 DE 3 FR 4 IT 现在我有另一个表 产品 我想在其中存储该产品可用的所有国家 地区 Table pro
  • 使用 js (jquery) 查找所有 YouTube 链接

    假设有一个包含内容和 YouTube 链接的 div 我想获取该 YouTube 链接并将其嵌入 div p Here is a cool video Check it out http www youtube com watch v oH
  • mysql 选择没有表的日期

    我只需要返回一个月内所有日期的列表 我没有访问特定的表 所以我需要一个 sql select 语句 如果给定二月份 则返回以下内容 Day 2011 02 01 2011 02 02 2011 02 03 etc etc 2011 02 2
  • 什么是好的 PHP 模板系统? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 集成 PHP 的最好 最简单的模板系统是什么 使用它有什么好处 我目前根本不使用它 并且我认为这可能有助于将内容与演示文稿进一步分离 PHP 本身就
  • cartopy set_xlabel set_ylabel (不是刻度标签)

    使用 cartopy 地图时 我无法添加 xlabel 或 ylabel 有没有办法做到这一点 我不是在寻找刻度标签 import matplotlib pyplot as plt import cartopy ax plt axes pr
  • 使用导航组件重新加载片段

    我正在使用导航组件加载我的片段 如下所示 https developer android com guide navigation navigation getting started navController findNavContro
  • SQL 查询中的 IF 条件

    我是 SQL Server 的新手 请帮我在查询中编写以下逻辑 If getnow gt today 4 PM Then SELECT FROM table WHERE MailDate is Tomorrow Else SELECT FR
  • Haskell 中函子如何工作?

    我正在尝试学习 Haskell 并且我已经完成了所有基础知识 但现在我陷入困境 试图了解函子 我读过 函子将一个类别转换为另一个类别 这是什么意思 我知道有很多问题要问 但有人可以给我一个吗简单的英语函子的解释或者可能是简单的用例 我不小心
  • 将存储过程返回值分配给 VBA 变量

    这应该很容易 但我还没有找到真正简洁的答案 我在 sql server 中有一个非常简单的存储过程 它返回一个整数值 我想要做的就是将该返回值放入变量中以便在 Access 中使用 存储过程 ALTER PROCEDURE dbo out
  • 检测计划关闭

    我有一个 cmd 脚本 它将执行一组补丁 它被设计为在需要重新启动时中止以避免补丁问题 我还想扩展脚本以在计划重新启动时中止 例如通过 shutdown 命令 以便尽可能避免在补丁中重新启动 不幸的是 除了尝试安排另一次关闭之外 我还没有找
  • Bitbucket 警告我的 git 存储库太大,但我无法确认大文件

    Bitbucket 警告我的 Git 存储库超过 1 GB 事实上 在存储库详细信息页面说它是1 7 GB 太疯狂了 我一定在版本控制中包含了大数据文件 我的本地存储库实际上是10 GB 这意味着至少我一直在使用 gitignore在某种程
  • Eclipse 中的 JPA 项目出现问题 - 注释 @Entity 的类中出现错误:无法解析表“xxx”

    我正在尝试在 Eclipse Indigo 中创建简单的 EJB JPA 项目 我创建了新的 EJB 项目 其中 目标 现有的 Glassfish 服务器 配置 EJB 模块 GlassFish 部署描述符文件 Java JPA 在窗口 J
  • ViewPager 的无尽适配器

    我一直在使用CWAC 的 EndlessAdapter实现ListViews的无限滚动 我想完成 ViewPager 的同等功能 不幸的是 PageAdapter 和ListAdapter 不共享相同的公共基类 解决这个问题的最佳方法是什么
  • Java:尝试编译 Hadoop 程序时未找到 com.sun.tools.javac.Main

    当我尝试使用此命令在 Hadoop 中编译程序时 bin hadoop com sun tools javac Main WordCounter java 从 Hadoop 文件夹中 它说 Error Could not find or l
  • 在 UIPopoverController 的页脚中使用 UISegmentedControl

    在我的 iPad 应用程序取景器中 iTunes 链接 我正在尝试重新创建 UISegmentedControl 的外观 如 Keynote 的 内置 弹出窗口的页脚中所示 iPad HIG 建议使用底部对齐的 UIToolbar 但外观不
  • 复选框检查事件监听器

    最近我一直在使用 Chrome 插件 API 我希望开发一个插件 这将使我管理网站的生活变得更轻松 现在我想做的是在选中某个复选框时触发一个事件 由于这个网站不属于我 我无法更改代码 因此我使用 Chrome API 主要问题之一是没有 I
  • 从 python 数据帧的列构造二分图

    我有一个包含三列的数据框 data subdomain data domain data IP 我想为子域的每个元素构建一个二分图 对应同一个域 权重为它出现的次数 对应 例如我的数据可能是 subdomain domain IP test
  • TransferRequestHandler 和 BeginRequest 的性能问题

    我已经开始使用 New Relic 来监控性能http alternativeto net那是一个相当大的网站 我注意到的是 他们报告为 TransferRequestHandler 的方法花费了大量时间 当我深入研究它时 我发现实际上是
  • 二元炸弹 - 第 4 阶段

    我很难追踪以下二进制炸弹的汇编代码 学校的一项作业 其中必须拆除炸弹 该炸弹包含 6 个阶段 所有阶段都有 1 个正确的输入才能进入下一阶段 我目前处于 Phase 4 它有一个名为 func4 的递归函数 我已经确定输入是 d d 它是两