2011-04-19 60 views
0

我想反向工程拆解的二进制文件。我不明白它使一个呼叫时它在做什么,例如:当您在程序集中推送内存地址时会发生什么?

推$ 0x804a254

是什么使得它更加混乱的是,该地址是不是和指令的地址也不是在符号表。它在做什么?

+2

它将某种32位数字推入堆栈。没有某种背景,完全不可能再说什么。 – 2011-04-19 16:49:30

+0

是的,发布一个反汇编,而不是一条指令。 – 2011-04-19 17:00:41

回答

2

这是以下三种情况之一:它是一个常量(无论是散列,数字,位标记还是类型地址),变量或缓冲区的地址(包括字符串文字)或者是一个错误分析的操作数(由于加密/废弃)。它的真正意义与它的使用有关(不管是调用参数还是设置mem/reg的间接方法)。

1

您看到的值不在任何表格或指令中,因为它是局部变量。 (局部变量不保持与符号表关联的名字,因为他们只是“活着”,而你是在一个特定的方法)地址相当于像

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

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

+0

而不是在x86上使用esp(或ebp)寄存器引用本地函数变量吗?我认为0x804a254可能是一个全局变量地址或稍后弹出的常量...... – 2011-04-19 16:57:56

+0

局部变量是相对于堆栈指针(例如ebp或esp)而不是绝对地址寻址的。所以我怀疑这是发生了什么。 – 2011-04-19 17:00:11

+0

那么它是一个全局变量,因为它们不只是推动0x4或%eax或其他东西?如果是这样,如果它不再被引用,那么将其设为全局是没有意义的。 另外,什么 jmp * 0x804b0fc 意思是什么时候该地址也没有在反汇编或符号表中的其他地方引用? – Gabe 2011-04-19 17:00:27

1

该指令只是将32位常量(0x804a254)推入堆栈。

仅靠这个指令是不足以让我们知道它是如何被使用的。你能否提供更多的代码解构?特别是我想知道这个值在哪里出现,以及这个值如何被使用。

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

相关问题