【问题标题】:Not understanding Hopper decompiler output不了解 Hopper 反编译器输出
【发布时间】:2016-10-18 09:15:30
【问题描述】:

我知道一些 C 和一点汇编,想开始学习逆向工程,所以我下载了 Mac 版 Hopper Disassembler 的试用版。我创建了一个超级基础的 C 程序:

int main() {
    int a = 5;
    return 0;
}

并使用 -g 标志对其进行编译(因为我之前看过这个并且不确定它是否重要):

gcc -g simple.c

然后我在 Hopper Disassembler 中打开 a.out 文件并单击 Pseudo Code 按钮,它给了我:

int _main() {
    rax = 0x0;
    var_4 = 0x0;
    var_8 = 0x5;
    rsp = rsp + 0x8;
    rbp = stack[2047];
    return 0x0;
}

我在这里理解的唯一一行是将变量设置为0x5。对于这样一个简单的程序,我无法理解所有这些附加行的用途(例如rsp = rsp + 0x8;)。有人愿意给我解释一下吗?

另外,如果有人知道很好的资源/教程来介绍逆向工程,那也会很有帮助。谢谢。

【问题讨论】:

  • 优化被禁用?
  • 您是否阅读过适用于您系统的 ABI?你检查过 rax、rsp 和 rbp 是什么吗?愿这值得一读cs.nyu.edu/courses/fall11/CSCI-GA.2130-001/x64-intro.pdf
  • 如果您打开优化,您将得到空存根,因为编译器会意识到您没有在该代码中执行任何操作(该变量未使用)。所以在你的情况下使用 -O0 和 -g 实际上更理智。
  • 如果您想了解汇编代码,您需要阅读您系统的 ABI(应用程序二进制接口)。它告诉你关于寄存器使用、堆栈使用、函数调用、参数传递等的低细节。除非您知道 ABI,否则汇编代码(可能)没有意义
  • ABI 肯定是特定于操作系统和 CPU 的。实际上更具体地说,如果您考虑例如 32b MS Windows 和 64b MS Windows 是相同的操作系统(仅在不同的变体中),但它们具有完全不同的 ABI 和本机二进制文件(32b 二进制文件以某种方式在 64b win 中运行包装层,这使它们在 32b 环境中运行)。编译器产生的 asm 的问题是,与人工编写的 ASM(故意以干净的方式编写)相比,如果感觉非常神秘。在您管理“人类”ASM 之后,这就像另一个难度级别。

标签: c assembly reverse-engineering pseudocode hopper


【解决方案1】:

看起来它在生成“反汇编伪代码”方面做得特别差(不管是什么——它是反汇编器还是反编译器?无法决定)

在这种情况下,它看起来有elided 堆栈框架设置(函数 prolog),但没有清理(函数 epilog)。因此,通过使用实际的反汇编程序查看实际的反汇编代码,您将更好地了解正在发生的事情:

$ gcc -c simple.c
$ objdump -d simple.o

simple.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   c7 45 fc 05 00 00 00    movl   $0x5,-0x4(%rbp)
   b:   b8 00 00 00 00          mov    $0x0,%eax
  10:   5d                      pop    %rbp
  11:   c3                      retq   

所以我们这里的代码是设置一个堆栈帧(地址 0-1),你的赋值(4),设置返回值(b),拆掉帧(10)然后返回(11)。由于使用了不同版本的 gcc 或不同的目标,您可能会看到不同的结果。

在您进行反汇编的情况下,反汇编程序已省略了第一部分(作为一项无趣的内务工作而忽略),但倒数第二部分(撤消第一部分)没有。

【讨论】:

    【解决方案2】:

    您正在查看的是反编译的代码。每个反编译器输出看起来都与此相似,因为它不会尝试获取变量名,因为它们可以经常更改并且通常是。

    所以它会将它们放在“var_??”中最后附上一个数字。一旦您了解了逆向工程并非常了解您正在使用的编程语言,您就可以理解代码。当您尝试对 PHP、JavaScript 代码等进行去混淆处理时也不例外。

    如果您遇到逆向工程恶意软件,请做好准备,因为没有什么是容易的。您将拥有不同的打包程序、混淆器、混乱的代码、VM 检测例程等。因此,如果逆向工程是您的目标,请做好准备,为未来的漫长道路做好准备。

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 2013-04-01
      • 1970-01-01
      • 2017-03-05
      • 2021-06-15
      • 1970-01-01
      相关资源
      最近更新 更多