在汇编中推送内存地址时会发生什么?

时间:2011-04-19 16:41:12

标签: assembly push memory-address disassembly

我正在尝试对反汇编的二进制文件进行反向工程。当我打电话时,我不明白它在做什么:

推送$ 0x804a254

更令人困惑的是,该地址不是指令的地址,也不在符号表中。它在做什么?

3 个答案:

答案 0 :(得分:2)

这是3种情况之一:它是一个常量(无论是散列,数字,位标志还是类型转换的地址),在任何范围内静态分配的变量或缓冲区的地址(包括字符串文字)或错误分析的操作数(由于加密/连接)。它的真正含义与其使用有关(无论是调用参数还是设置mem / reg的间接方法)。

答案 1 :(得分:1)

您看到的值不在任何表或指令中,因为它是局部变量。 (局部变量不保持与符号表关联的任何名称,因为当您使用特定方法时它们只是“活着”)地址等同于

void somefunc()
{
  int t; //t may have address 0x804a254 since this is a local variable.
}

为了正确释放内存,本地变量在系统堆栈上而不是在内存中的其他位置分配。它们在创建函数时被推送,并在函数返回时弹出,这就是你所看到的。

答案 2 :(得分:1)

该指令只是在栈中推送32位常量(0x804a254)。

仅凭这一指令还不足以让我们知道以后如何使用它。你能提供更多的代码解析吗?特别是我想看看弹出这个值的位置,以及以后如何使用这个值。

在开始任何逆向工程之前,我建议您阅读本书(Reverse Engineering secrets),然后阅读X86指令集手册(IntelAMD)。我假设您是x86 CPU的逆向工程。