GCC编译的二进制文件中的冗余寄存器值?

问题描述 投票:0回答:1

[好,所以我试图学习逆向工程和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并执行了该操作,但是现在程序返回了看似随机数,我猜是内存地址?

radare2 screenshot + patched binary running

有人可以向我解释为什么GCC使用此看似冗余的寄存器,而尝试修补二进制文件时我做错了什么?

c gcc assembly x86-64 reverse-engineering
1个回答
0
投票

您未启用优化功能,因此您正在查看调试代码。使用-O3,输出为:

enter image description here

关于问题的一个注释,您需要分配给eax,因为eax将返回值存储在x86应用程序中。

© www.soinside.com 2019 - 2024. All rights reserved.