理解反汇编的c代码(尤其是var_28 = dword ptr -28h)(二进制炸弹实验室)

时间:2012-09-17 20:25:31

标签: c assembly disassembly

所以我正在拆解一些代码(二进制炸弹实验室)并需要一些帮助来弄清楚发生了什么。

以下是IDA截图:

enter image description here

(下面有一些跳转表和另一个比较,但我对这些东西感觉更舒服(我认为))

现在,我想我知道这个阶段正在发生什么,正如我读过的那样:

http://teamterradactyl.blogspot.com/2007/10/binary-bomb.html(向下滚动到第3阶段)

但是,我习惯了不同形式的装配。

我不明白的最重要的事情就是顶部的所有var_28 = dword ptr -28h。

当调用sscanf时,它如何知道每个令牌的放置位置?并且只有三个令牌(这就是上面的链接所说的,虽然我看到%d,%d ......所以可能有两个,我想三个)。基本上,任何人都可以告诉我在调用sscanf之后每个var_x(和arg_0)会指向什么?

它们只是对堆栈指针的相对寻址...?但是这些地址如何被sscanf中的令牌填满?

注意:这是家庭作业,但它表示不添加家庭作业标签,因为它已经过时或者其他东西。作业是通过命令行找出要进入每个阶段的秘密短语。

注意2:我真的不知道如何使用IDA,我的朋友刚刚告诉我在IDA中打开炸弹文件。也许有一种简单的方法让我在IDA中进行实验和弄清楚,但我不知道如何。

1 个答案:

答案 0 :(得分:1)

局部变量存储在帧指针的正下方。参数位于帧指针之上。 x86使用BP / EBP / RBP作为帧指针。

天真的反汇编只会将lea eax, [ebp+var_10]反汇编为lea eax, [ebp-10h]。该指令引用一个局部变量,其地址低于帧指针所指向的10h(16字节)。 LEA表示加载有效地址:它在[ebp - 10h]的{​​{1}}加载变量的地址,因此eax现在包含指向该变量的指针。

IDA显然正在尝试为局部变量提供有意义的名称,但由于显然没有可用的调试信息,因此最终使用虚拟名称。无论如何:

eax

只是IDA告诉它已为var_10= dword ptr -10h 创建别名var_10的方式。