while 循环函数反汇编 x86

逆向工程 艾达 x86
2021-06-12 21:55:45

我正在尝试将此二进制文件转换为 C,但我在使用 while 循环时遇到了问题。什么
sub esp, 8意思?以及push [ebp+_a]有时我可以在更改打印语句时获得 esp 8。为什么会这样?

图。1

到目前为止我所拥有的。

    #include <stdio.h>

    int main(int argc, char *argv[])

{
    int a = 9;

    while (a) {

        printf("%d, ");
        --a;
    }
        puts("FIRE!");

    return 0;
}
1个回答

当调用 printf 函数(或任何其他函数)时,它从堆栈中获取所有参数。在 x86 中,根据cdecl参数以相反的顺序推送。因此,首先将整数值 a 压入堆栈顶部 ( push [ebp+_a]),然后将字符串"%d ,"压入堆栈 ( push offset aD)。虽然 printf 弹出参数,但它首先取出“%d,”,然后获取 a 的值 ie, [ebp+_a]堆栈指针也应相应更改,以便 printf 函数获得正确的参数。因此sub esp, 8,更改堆栈指针(esp)的指令