[好,所以我试图学习逆向工程和x64汇编。例如,我在C中编写了这个小测试程序:
#include <stdio.h>
int square(int num) {
return num * num;
}
int main() {
int ans = square(5);
printf("%d", ans);
}
这将导致square
函数的以下汇编代码:
push rbp
mov rbp,rsp
mov DWORD PTR [rbp-0x4],edi
mov eax,DWORD PTR [rbp-0x4]
imul eax,eax
pop rbp
ret
这对我来说似乎很奇怪,因为edi
是函数参数,我认为它随后会存储在堆栈中并加载回eax
,然后在其中相乘?为什么不跳过第3和第4行,而仅跳过imul edi, edi
?因此,我打开了radare2并执行了该操作,但是现在程序返回了看似随机数,我猜是内存地址?
有人可以向我解释为什么GCC使用此看似冗余的寄存器,而尝试修补二进制文件时我做错了什么?