如何找出逆向工程汇编中的第二个参数/寄存器?

2024-01-01

所以我正在做二进制炸弹的变体。这就是阶段

0x0000000000401205 <+0>:     sub    $0x8,%rsp
0x0000000000401209 <+4>:     cmp    $0x3,%rdi                    #rdi = 3
0x000000000040120d <+8>:     je     0x40121d <phase_2+24>        #if(rdi == 3) skip explosion 
0x000000000040120f <+10>:    callq  0x401c01 <bomb_ignition>
0x0000000000401214 <+15>:    mov    $0xffffffffffffffff,%rax
0x000000000040121b <+22>:    jmp    0x40124c <phase_2+71>
0x000000000040121d <+24>:    xor    $0xffffffffffffff1c,%rsi     #rsi ^= 0xffffffffffffff1c
0x0000000000401224 <+31>:    and    %rsi,%rdx                    #rdx &= rsi
0x0000000000401227 <+34>:    add    $0x1c8,%rdx                  #rdx += 456 
0x000000000040122e <+41>:    cmp    $0x2c5,%rdx                  #rdx == 709
0x0000000000401235 <+48>:    sete   %al 
0x0000000000401238 <+51>:    movzbl %al,%eax
0x000000000040123b <+54>:    cmp    %rcx,%rdx                    #rdx == rcx
0x000000000040123e <+57>:    je     0x40124c <phase_2+71>
0x0000000000401240 <+59>:    callq  0x401c01 <bomb_ignition>
0x0000000000401245 <+64>:    mov    $0xffffffffffffffff,%rax
0x000000000040124c <+71>:    add    $0x8,%rsp
0x0000000000401250 <+75>:    retq

我已经在汇编旁边注释了我认为它的含义。我坚持的是<+24>在哪里xors $0xffffffffffffff1c and %rsi. %rsi第二个参数传递正确吗?那么我怎样才能知道它是什么,这样我就可以xor它?因为那时ands it to %rdx这是第三个参数。

所以我认为它需要 4 个数字。第一个是“3”(对吗?)。然后xor第二个是 0xffffffffffffff1c。And将其移至第三个数字。然后第三个数字加上 456,应该是 709。这就是第四个数字应该是的。另外我还是有点困惑sete and movzbl。但我不知道第二个和第三个数字应该是什么。我的预测正确吗?感谢任何帮助。谢谢


调用者是否检查返回值?我假设是这样,否则你可以为 rsi 和 rdx 选择你想要的任何内容,然后计算 rcx 将匹配的内容。它设置rax= -1(炸弹爆炸),或0或1(sete/movzx)基于cmp $0x2c5,%rdx result.

让我们命名我们的函数输入,这样我们就可以将函数参数与寄存器中的当前值分开讨论:x:rsi, y:rdx, and z:rcx。 (忽略第一个参数rdi,单独检查)。

z只与其他交互一次,因此可以自由选择。

rsi ^= -228;  // 0xffffffffffffff1c
rdx &= rsi;   // rdx &= (x ^ -228)
rdx += 456

if(rdx != rcx) explode();

我们假设我们还需要 rdx == 709 = 0x2c5 (因此z=709,也是)。让我们从rdx == 709:

709 - 456 = 253   // rdx before  add    $0x1c8,%rdx

那么我们需要x and y这样y & (x^-228) == 253。这是一个包含 2 个变量的方程,因此应该有多个解。 “最简单”的是y= 253 (0xfd),然后选择一个x这将保留所有这些位。

例如,选择x以便x ^ 0x1c == 0xfd以及。 (我们可以忽略高位,因为 AND 与 0xfd 会清除它们)。您可以像求解加法一样求解该方程。xor是它自己的逆(并且是可交换/结合的),所以我们可以xor双方由0x1c解决x = 0xfd ^ 0x1c = 0xe1 = 225.

@Prl的解决方案使用x = 0xe1 but y=255。这可以;额外的设置位将被 AND 擦除。

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

如何找出逆向工程汇编中的第二个参数/寄存器? 的相关文章

  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 为什么 Visual Studio 使用 xchg ax,ax

    我正在查看程序的反汇编 因为它崩溃了 并注意到很多 xchg ax ax 我用谷歌搜索了一下 发现它本质上是一个 nop 但是为什么 Visual Studio 会执行 xchg 而不是 noop 该应用程序是一个C NET3 5 64位应
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • 对 C# 解决方案进行逆向工程

    我知道 Visual Studio 2010 Ultimate 有一些功能 我通常会凭本能这样做 但我的日程安排非常紧张 我还安装了 Visio 2010 并将其集成到 VS 中 但它的逆向工程功能似乎没有多大作用 并且必须在每个项目的基础
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • 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
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save

随机推荐