这段汇编代码究竟是做什么的?
逆向工程
部件
x86
小精灵
称呼
2021-07-07 10:03:46
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 说。
其它你可能感兴趣的问题
