【发布时间】: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