【发布时间】:2021-09-01 04:33:18
【问题描述】:
我想知道如果汇编代码跳转到包含错误指令的地址会发生什么?
我从this blog 读到,当jmpq 跳转到某个地址时包含错误指令。
机器的响应是完全不跳转并简单地执行下一条指令(或者我误解了这个博客),例如:
jmpq abc
[ code ]
...
abc :
[ bad instruction ]
它会简单地执行[ code ]
但是这个博客是关于x86 指令集的。我想知道arm指令集发生了什么。
我问这个问题的原因是因为我最近在做一个基于 apk 的统一 IL2CPP 项目,并且它被混淆了。
反编译发现有很多bl指令跳转到坏指令。
我想知道如果他们跳转到错误指令或执行包含错误指令会发生什么。
ps:我使用的反编译器是Ghidra
【问题讨论】:
-
x86 和 ARM 都有无效指令异常。在 x86 上,例外是 #UD。 (在 Linux 下,内核的处理程序将 SIGILL 传递给有问题的进程。)该博客是错误的(或者您更可能误解了它,因为它是关于 PLT 间接跳转,其目标是下一条指令,直到惰性动态链接完成);获取错误代码不会使 CPU 撤消已执行的
jmp。 -
可能你的反汇编程序被混淆了(混淆的一个目标),并且
bl实际上不会运行,或者会在执行第一次到达它之前被修改为具有不同的偏移量。 -
但是elf文件的
.text部分不是只读的吗?在那种情况下,程序如何在运行时更改代码 -
程序可以使用
mprotect将私有映射改为read+write+exec,或者将机器码复制到其他地方。使用“文本重定位”运行时修复的动态链接确实需要实际修改 .text 部分,例如,如果您在 PIE 可执行文件中使用了mov rdi, absolute_address。 -
谢谢,这句话我看了几分钟,前半句我明白了,是的,有一些技巧可以用来绕过只读限制,但后半句我不明白为什么PIE与这个问题有关,我的意思是,这个例子是什么意思?
标签: x86 arm reverse-engineering