在反汇编代码中声明数组

时间:2015-12-09 08:50:55

标签: c assembly x86 reverse-engineering 32-bit

我尝试反汇编ropasaurusrex。这是CTF的问题。您可以从以下链接下载可执行文件。我使用Hopper进行拆卸。 here

enter image description here

上图是该计划的主要例程。

请看上图中的红线。

似乎数组的声明就在这里。

lea eax, dword [ss:ebp+var_88] =====> char buffer[128];

为什么呢?我无法理解128字节?

1 个答案:

答案 0 :(得分:4)

通常,各个汇编指令和C结构之间没有直接对应关系。单个指令可能只是一个单一的" brick"来自更大的构造。如果启用了优化,那么以这种方式追踪就会变得更加困难。

考虑到第一个例程,这是一个逐个指令的演练:

  • push ebp保存旧的"堆栈基指针"在堆栈上,以便在离开功能后它可以恢复,并且来电者可以确信它没有改变;

  • mov ebp, esp加载"基指针的值#34;使用"堆栈指针的当前值"。可以相对于这个新分配的基指针对该函数的堆栈帧中的变量进行任何进一步的引用;

  • sub esp, 0x98从堆栈指针中减去值152。这有效地"分配"堆栈上的空间。现在可以在ebpesp指向的地址之间容纳具有自动存储的任何变量。这可能包括您的buffer数组。

  • mov dword[ss:esp + 8], 0x100将值256放在esp + 8指向的地址。这可能对应于自动变量/数组的赋值。

  • lea eax, dword[ss:ebp + var_88]计算一个地址,该地址是基指针加上一些常量偏移的结果,并将其存储到eax中。这可能对应于指向自动数组开头的指针。

  • 然后将
  • eax移动到堆栈,作为以下对j_read的调用的参数。 0也作为第一个参数传递。然后调用该函数,leave指令恢复旧的基指针,控件通过ret指令返回给调用者。