炸弹实验室阶段_4

2023-12-02

Dump of assembler code for function func4
    <+0>: mov %rbx,-0x18(%rsp)
    <+5>: mov %rbp, -0x10(%rsp)
    <+10>: mov %r12,-0x8(%rsp)
    <+15>: sub $0x18,%rsp
    <+19>: mov %edi,%ebx
    <+21>: mov %esi,%ebp
    <+23>: test %edi, %edi
    <+25>: jg 0x400fb2<func4+34>
    <+27>: mov $0x0,%ebp
    <+32>: jmp 0x400fd2<func4+66>
    <+34> cmp $0x1, %edi
    <+37>: je 0x400fd2<func4+66>
    <+39>: lea -0x1(%rbx),%edi
    <+42>: callq 0x400f90 <func4>
    <+47>: mov %eax,%r12d
    <+50>: lea -0x2(%rbx),%edi
    <+53>: mov %ebp,%esi
    <+55>: callq 0x400f90 <func4>
    <+60>: lea (%r12,%rax,1),%eax
    <+64>: add %eax,ebp
    <+66>: mov %ebp, %eax
    <+68>: mov (%rsp),%rbx
    <+72>: mov 0x8(%rsp), %rbp
    <+77>: mov 0x10(%rsp),%r12
    <+82>: add $0x18,%rsp
    <+86>: retq

这是func4的反汇编代码。 而且我不确定我是否正确理解了这个函数。

这里我没有写phase_4的反汇编代码, 但它需要“%d %d”输入,并且第一个整数应在 1

我想,func4的反汇编代码意味着

put the stack
ebx = edi
ebp = esi
if edi is not zero
    if edi is one: then eax=ebp.
                   rearrange the stack
                   return.
    else: edi = -0x1(rbx)
          func4
          r12d = eax
          edi = -0x2(rbx)
          esi = ebp
          func4
          eax = rax+r12+ebp
          rearrange the stack and return.
else
    ebp=0
    eax=ebp
    return

但以我的理解,我无法解决它。 例如,如果%rsp的原始地址是0x7fffffffd5a8 那么地址就会变小,直到 edi 的值变成 0。 我发现 0x7fffffffd56f 的值为 0 - 并且第一个 func4 调用结束 - 但在 0x7fffffffd56e 的值也为 0 之后 - 所以第二个 func4 调用结束 - 所有寄存器都变为0,包括eax。

所以我认为第二个数字的答案是零, 但 (1,0)、(2,0)、(3,0) 总是会爆炸炸弹。

你能猜出我错在哪里并帮忙吗?


edi and esi的两个参数是func4。这是根据标准调用约定,但也可以从以下事实推断出来:这些寄存器在没有初始化的情况下使用,因此它们的值必须来自外部。因此,原型是int func4(int a, int b).

Line +23检查是否a > 0,如果是则跳开。所以我们可以很容易地追踪如果条件为假会发生什么:

if (a <= 0) return 0;

Line +34正在检查是否a == 1,如果是,则当前值ebp返回,但已从初始化esi这是第二个参数,b:

if (a == 1) return b;

否则,行+39..+55递归调用func4. Line +60将两个调用的结果相加,然后行+64 adds b。所以我们有:

return func4(a - 1, b) + func4(a - 2, b) + b;

由此您可以计算任何输入的返回值。

当然,如果允许使用调试器,您可以让代码运行并查看值是什么eax将是 ;)

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

炸弹实验室阶段_4 的相关文章

  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • LC3 LEA指令和存储的值

    我对这个问题感到困惑 指令后寄存器0中存储的值是多少 LEA R0 A 被处决了吗 为什么答案是x370C 我认为应该将A的地址加载到R0中 如果是这样我们怎么知道地址 有人可以帮忙吗 非常感谢 ORIG X3700 LEA R0 A LD
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • 无法识别的仿真模式:MinGW32 上的 elf_i386

    我正在尝试制作内核 但无法链接C与程序集一起输出 这ld 我收到错误 无法识别的仿真模式 elf i386 我正在使用 Windows 10 专业版以及 MinGW32 和 MSYS 我正在使用的代码 link ld link ld OUT
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 从 DX:AX 寄存器转移到单个 32 位寄存器

    我在添加 16 位乘法的乘积时遇到问题 我想将一年 例如 2015 年 乘以 365 为此 我 mov dx 0 to clear the register mov ax cx cx holds the year such as 2015
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • 嵌入式系统:使用汇编语言时的内存布局

    根据我的理解 嵌入式系统运行机器代码 有多种方法可以生成此代码 一种是用 C 等高级语言编写程序 然后使用编译器获得这样的代码 另一种方法是用汇编语言为该嵌入式系统编写指令 并使用汇编器将其转换为机器代码 现在我们得到了加载到系统并执行的机
  • 汇编语言程序中连续两次相乘

    我正在使用 8086 模拟器以及 DOSBOX 和 MASM 我知道当我们将 8 位与 8 位相乘时 答案将是 16 位 al 8 bit ax 当我们将 16 位与 16 位相乘时 答案将是 32 位 ax 16 bit dx ax 但如
  • 如何将 asm 着色器编译为 fxo 文件?

    我有一个已编译的 fxo 着色器 我正在尝试对其进行稍微编辑 仅调整一些常量 使用 fxdis https code google com archive p fxdis d3d1x https code google com archiv
  • 在 qemu 中将扇区加载到 RAM

    我编写了一个简单的程序 将扇区 扇区编号 2 加载到 RAM 但什么也没打印 首先 我尝试了以下引导扇区代码 org 0x7c00 mov ax 0x1000 ES BX 1000 0000 mov es ax mov bx 0x00 Lo
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C
  • NASM:如何正确访问SSD驱动器?

    我需要使用 NASM 16 位代码访问 SSD 驱动器 访问普通硬盘时 需要设置寄存器AX DX CX来选择柱面 磁道 扇区 扇区数 AH 选择读扇区功能 DL 选择驱动器号 CH 选择气缸 DH 选择磁盘上的一侧 CL 选择步入正轨的部门
  • 如何在 AVX/AVX2 中递增向量

    我想使用内在函数来增加 SIMD 向量的元素 最简单的方法似乎是为每个元素加 1 如下所示 note vec inc之前已设置为1 vec mm256 add epi16 vec vec inc 但是是否有任何特殊指令来增加向量 类似于in
  • 如何使 gcc 为 -fpatchable-function-entry 发出多字节 NOP?

    gcc确实有能力使用多字节用于对齐循环和函数的 NOP 然而当我尝试 fpatchable function entry option https gcc gnu org onlinedocs gcc Instrumentation Opt

随机推荐

  • 如何向我的 vega-lite 图表添加辅助 Y 轴?

    这个问题展示了一种将多个时间序列添加到 vega lite 图表的方法 如何使用 Vega Lite 在轴上绘制多个变量 有没有办法将第二个系列放在辅助 Y 轴上 我说的是在右侧放置另一个 Y 轴 以便时间序列可以具有不同的尺度 但仍然可以
  • VSCode 安装失败 - 无法提取安装程序

    VSCodeSetup exe Installation has failed Failed to extract installer 我无法安装或打开安装日志 尝试在 Windows 8 1 Enterprise 上安装 我刚刚下载了 V
  • 如何获取多个页面的数据?

    我的项目基于 React redux redux saga es6 我尝试从此 API 获取数据 如您所见 此特定 API 调用显示的数据限制为每页 100 条数据 分布在 40 个页面上 根据这个答案 它说您可以将限制扩展到每页最多 30
  • Perl 的 Capture::Tiny::capture() 是否避免了使用 system() 时所需的磁盘 io?

    当从 Perl 脚本调用外部程序时 Capture Tiny 是否避免了使用 system 时所需的磁盘 io 使用两者时我得到的性能基本相同 一位同事正在使用我的代码 并告诉我它正在攻击他的磁盘 我 也许 在本地计算机上运行并写入本地磁盘
  • C#:继承布尔值?

    如何 我可以从布尔值继承吗 或者使我的类与带有 运算符的布尔值相当 class MyClass Boolean public MyClass this true class Program public Program MyClass my
  • 如何处理Azure Python Function异常处理?

    我是 Python 异常处理新手 我该如何正确try下列 except if get entity失败 但通过如果Status 200 这是我所在的位置 但它不正确 希望您能举例说明 from azure cosmosdb table ta
  • 如何使用 FileReader javascript 读取 XML 文件?

    我需要从 ODF 文件获取 XML 我尝试使用 FileReader readAsText 和 readAsBinaryString 但它不起作用 文件读取器读取文本返回 odf 文件的一些特殊字符 with 读取为二进制字符串 var r
  • JavaScript 中的函数组合

    在下划线 低破折号等库中实现函数组合有什么好处 类似于 var compose function var funcs arguments return function var args arguments for var i funcs
  • 获取404页面的原始url

    所以我发现了这两个问题 在 IIS7 404 重定向页面中访问原始 URL 获取导致 404 的请求页面的 URL 但它们都是不同的语言 有没有办法获取导致 404 消息之类的地址在自定义消息中使用 例如 如果我要求example com
  • 在C#中将SID转换为用户名

    在 net中 我可以创建一个NTAccount使用域和用户名 并获取其 SID 但我无法使用翻译功能将 SID 转换回 NTAccount new SecurityIdentifier stringSid Translate typeof
  • 如何向 tcp 服务器发出 http 请求?

    我想要建立一个侦听端口 443 的 TCP 服务器 以便它可以接收 HTTP 请求并回发 现在我正在使用 Apache 和 PHP 以正常方式执行此操作 但是是否可以在没有 Web 服务器的情况下执行此操作 例如 我用 C NET 构建了一
  • 使用 Linq to Entities 将 UTC 转换为本地时间

    我需要在 LINQ to Entities 查询中将字段从 UTC 转换为本地时间 但它无法识别我打算使用的方法 System DateTime ToLocalTime 我的查询是这样的 选择本地当天不存在任何其他请求尚未解决的请求 考虑到
  • 在 Delphi 中使用 XPath 查找元素

    我试图在 Delphi 中的 XML 文档中查找元素 我有这段代码 但它总是在日志中显示 0 个元素 function TForm1 KannaSidu Boolean var Doc IXMLDOMDocument List IXMLDo
  • 使用 OpenSL 为所有 Android 设备提供 8KHz 采样率的语音通信

    我需要创建一个 VOIP 应用程序 并且我正在使用 OpenSL ES 我需要为所有 Android 设备以 8KHz 采样率捕获和播放 pcm 音频数据 但是 当我以 8KHz 采样率捕获音频并同时播放 语音通信 时 它会产生噪音 并且对
  • 为什么 shell case 语句中的第一个模式不能是多重模式?

    The 标准描述 of the case声明说 The format for the case construct is as follows case word in pattern1 compound list pattern patt
  • 圆形/角度滑块

    A 最近的问题让我想起了不久前我尝试编写的一些代码 目的是制作一个CircularSlider 可用于动态对象中类似角度变量的对象 我的解决方案的框架 如下 来自ValueThumbSlider 定义在高级操作功能教程 主要区别在于Valu
  • ASP.NET MVC 中的 ViewBag 如何工作

    ASP NET MVC 是如何实现的ViewBag工作 MSDN 说这只是一个Object 这让我很感兴趣 魔法 属性如何ViewBag Foo和魔法弦ViewBag Hello 实际上工作吗 另外 我如何制作一个并在我的 ASP NET
  • 错误:字符串常量之前需要声明说明符或“...”

    我在模拟另一个文件中的用法的特定行上收到错误 PyObject pyCharGetHeight PyChar self void closure CHAR DATA ch PyChar AsChar PyObject self PyObje
  • 指向其声明范围之外的局部变量的指针

    假设我有一个代表 PDF 文档的结构pdf以及代表其中一页的结构pdf page typedef struct pdf page int page no pdf page next page char content pdf page ty
  • 炸弹实验室阶段_4

    Dump of assembler code for function func4 lt 0 gt mov rbx 0x18 rsp lt 5 gt mov rbp 0x10 rsp lt 10 gt mov r12 0x8 rsp lt