我尝试反汇编ropasaurusrex。这是CTF的问题。您可以从以下链接下载可执行文件。我使用Hopper进行拆卸。 here
上图是该计划的主要例程。
请看上图中的红线。
似乎数组的声明就在这里。
lea eax, dword [ss:ebp+var_88] =====> char buffer[128];
为什么呢?我无法理解128字节?
答案 0 :(得分:4)
通常,各个汇编指令和C结构之间没有直接对应关系。单个指令可能只是一个单一的" brick"来自更大的构造。如果启用了优化,那么以这种方式追踪就会变得更加困难。
考虑到第一个例程,这是一个逐个指令的演练:
push ebp
保存旧的"堆栈基指针"在堆栈上,以便在离开功能后它可以恢复,并且来电者可以确信它没有改变;
mov ebp, esp
加载"基指针的值#34;使用"堆栈指针的当前值"。可以相对于这个新分配的基指针对该函数的堆栈帧中的变量进行任何进一步的引用;
sub esp, 0x98
从堆栈指针中减去值152
。这有效地"分配"堆栈上的空间。现在可以在ebp
和esp
指向的地址之间容纳具有自动存储的任何变量。这可能包括您的buffer
数组。
mov dword[ss:esp + 8], 0x100
将值256
放在esp + 8
指向的地址。这可能对应于自动变量/数组的赋值。
lea eax, dword[ss:ebp + var_88]
计算一个地址,该地址是基指针加上一些常量偏移的结果,并将其存储到eax
中。这可能对应于指向自动数组开头的指针。
eax
移动到堆栈,作为以下对j_read
的调用的参数。 0
也作为第一个参数传递。然后调用该函数,leave指令恢复旧的基指针,控件通过ret
指令返回给调用者。