我知道一些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;
)。有人愿意向我解释这个吗?
此外,如果有人知道有关逆向工程入门的优秀资源/教程,那么它也会非常有用。感谢。
答案 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或不同的目标,您可能会看到不同的内容。
在你的反汇编的情况下,第一部分被反汇编者遗弃(被遗忘为无趣的内务处理任务),但倒数第二部分(撤销第一部分)却没有。