不了解Hopper反编译器输出

时间:2016-06-16 17:56:13

标签: c assembly reverse-engineering pseudocode hopper

我知道一些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;)。有人愿意向我解释这个吗?

此外,如果有人知道有关逆向工程入门的优秀资源/教程,那么它也会非常有用。感谢。

1 个答案:

答案 0 :(得分:4)

看起来它在制作“反汇编伪代码”方面做得特别糟糕(无论是什么 - 它是反汇编程序还是取消装饰器?无法决定)

在这种情况下,看起来它有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或不同的目标,您可能会看到不同的内容。

在你的反汇编的情况下,第一部分被反汇编者遗弃(被遗忘为无趣的内务处理任务),但倒数第二部分(撤销第一部分)却没有。