【问题标题】:What happened if assembly code jump to a address contain bad instruction?如果汇编代码跳转到包含错误指令的地址会发生什么?
【发布时间】: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


【解决方案1】:

比特就是比特。

处理器不可能知道地址指向错误指令。处理器非常愚蠢。他们做他们被告知的事情,他们被编程去做的事情。就像火车在轨道上一样,如果您碰巧在一条或两条轨道上留下空隙,或者轨道没有对齐,火车可能会撞车。或者它可能会直立滚动,直到撞到房子或其他东西。

处理器(arm、intel 等与相同的答案无关)将根据其规则(线性执行、分支等)获取它找到的下一个字节,并尝试将它们解码并作为指令执行。如果这些字节在无效指令中是“坏的”,那么一些/许多/大多数处理器将引发异常并执行每个 ISA 定义的解决方案(调用异常处理程序、挂起、重置等)。如果字节不是您想要的指令,但位/字节模式恰好是有效指令。它将执行它,因为处理器非常非常非常愚蠢,它们按照编程的方式执行,没有例外。

所以毫无疑问,如果...处理器将尝试执行找到的字节/位,就像它对每个指令周期、分支或无分支所做的那样。如果编码的分支地址违反了 ISA,那么同样的答案将执行 ISA 为该故障定义的任何事情。

现在是反汇编程序。任何可变长度指令集(肯定是 x86,带有 arm 和 thumb 和 thumb2 的 ARM 也是一个问题)假设你不能反汇编并假设反汇编是坏的。对看起来很糟糕或杂草丛生的指令(bl到糟糕的地方,bl拆卸本身可能是问题而不是目的地)的指令非常非常少。处理可变长度指令集的唯一好方法是从已知的良好入口点反汇编,并且按照执行顺序而不是线性地通过内存。有了这个,特别是 ARM 和其他的,你最终会得到很大一部分二进制文件,因为你不能静态地确定一些执行路径,你必须实际执行、模拟或视觉上作为人类检查,代码找到一些执行路径。如果反汇编程序和指令集导致无法使用的输出,则某些反汇编程序比其他反汇编程序和组合更差。使用 x86 代码很容易看到 gnu objdump 惨遭失败。如果您知道自己在做什么,则可以使 objdump 输出绝对可怕(对于 x86),甚至远不接近正确。用拇指和拇指2 的手臂相同的答案。 risc-v等

【讨论】:

  • 很久以前(软盘上的dos)有一个反汇编程序,您可以调整入口点。理想情况下,这就是您想要的那种工具,请记住,除非您使用非常严格的固定长度指令集(例如旧的 arm 和 mips),否则没有任何理由期望完整和准确的反汇编。你让它找到它可以找到的东西,但需要一个工具,你可以将字节标记为非指令并将其他字节标记为入口点或指令的开头。当您直观地分析代码时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
相关资源
最近更新 更多