这段汇编代码究竟是做什么的?

逆向工程 部件 x86 小精灵 称呼
2021-07-07 10:03:46

这个程序集是针对 Intel x86-64 位的,对我来说似乎太莫名其妙了。

在此处输入图片说明

  • jz指令如何跳转到非指令(0x400AC9)?
  • 为什么call调用一个不存在的地址?

对于好奇的人,二进制文件在这里

3个回答

jz 指令如何跳转到非指令(0x400AC9)?

它不是。没有“指令”这样的东西。跳转不是跳转到指令而是跳转到地址

为什么调用调用一个不存在的地址?

它不是。如果你检查代码实际做了什么,你会发现这个调用永远不会被执行。


这是代码的相关部分,以原始十六进制字节为前缀。

400AC7:  66 b8 eb 05             mov    ax,0x5eb
400ACB:  31 c0                   xor    eax,eax
400ACD:  74 fa                   jz     0x400AC9
400ACF:  e8 0f b6 45 b0          call   0xffffffffb045b61c
400AD4:  3c 38                   cmp    al,0x38
400AD6:  0f                      .byte 0xf
400AD7:  85                      .byte 0x85
400AD8:  bc                      .byte 0xbc

如果您假设 400AC7 处的指令执行,它会加载ax一些值,但它会立即被下一条指令丢弃,将其清除为0因此,跳跃将始终被采用!

跳转到 400AC9,如果我们从那里开始反汇编,我们会得到一些其他代码:

400AC9:  eb 05                   jmp    0x400AD0
400ACB:  31 c0                   xor    eax,eax
400ACD:  74 fa                   je     0x0
400ACF:  e8 0f b6 45 b0          call   0xffffffffb045b61a
400AD4:  3c 38                   cmp    al,0x38
400AD6:  0f                      .byte 0xf

看起来你没有得到更多,因为仍然有奇怪的调用和未定义的代码。但是,请看第一条指令!它再一次跳进的东西似乎是一个指令中间在这一点-但如果你开始拆卸那里,你会发现一切从地址上是非常普通的代码*。

* 由于这是一个“crackme”并且你已经通过了它的第一次测试,我不会破坏它的其余部分。

IDA 错误地反汇编了指令。需要手动把jz后面的指令改成data,然后把jz的目的地改成code。

您应该修补程序用来检查它是否被调试器跟踪的 ptrace,然后使用 gdb 或其他调试器查看@runtime 发生了什么,如果您坚持静态分析它,则必须手动修复跳转yujyet 说。