首页 > 解决方案 > GCC编译的二进制文件中的冗余寄存器值?

问题描述

好的,所以我正在尝试学习逆向工程和 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并做到了,但现在程序返回看似随机的数字,我猜是内存地址?

雷达2截图+补丁二进制运行

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

标签: cgccassemblyx86-64reverse-engineering

解决方案


您没有启用优化,因此您正在查看调试代码。,-O3输出为:

在此处输入图像描述

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


推荐阅读