在反汇编代码中声明数组
Declaration of an array in disassembled code
我试着拆解ropasaurusrex。这是 CTF 的 Question.you 可以从 follow link 下载可执行文件。我使用 Hopper 进行拆卸。
here
上图是本程序的主程序
请看上图红线
好像数组的声明在这里
lea eax, dword [ss:ebp+var_88] =====> char buffer[128];
为什么?我看不懂 128bytes?
一般来说,单个汇编指令和 C 结构之间没有直接对应关系。单个指令可能只是来自更大构造的单个 "brick" 。如果打开优化,以这种方式追踪事情会变得更加困难。
考虑到第一个例程,这里是逐条指令演练:
push ebp
将旧的 "stack base pointer" 保存在堆栈中,以便在离开函数后可以恢复,调用者可以确信它没有改变;
mov ebp, esp
用 "stack pointer" 的当前值加载 "base pointer" 的值。对该函数堆栈帧中变量的任何进一步引用都可以相对于这个新分配的基指针进行;
sub esp, 0x98
从堆栈指针中减去值 152
。这有效地 "allocates" space 在堆栈上。现在可以在 ebp
和 esp
指向的地址之间容纳任何具有自动存储的变量。这可能包括您的 buffer
数组。
mov dword[ss:esp + 8], 0x100
将值 256
放在 esp + 8
指向的地址。这可能对应于对自动 variable/array.
的赋值
lea eax, dword[ss:ebp + var_88]
计算一个地址,该地址是基指针加上某个常量偏移量的结果,并将其存储到 eax
中。这可能对应于指向自动数组开头的指针。
eax
然后作为参数移入堆栈,作为对 j_read
的后续调用的参数。 0
也作为第一个参数传递。然后调用该函数,leave 指令恢复旧的基指针,并通过 ret
指令将控制权返回给调用者。
我试着拆解ropasaurusrex。这是 CTF 的 Question.you 可以从 follow link 下载可执行文件。我使用 Hopper 进行拆卸。 here
上图是本程序的主程序
请看上图红线
好像数组的声明在这里
lea eax, dword [ss:ebp+var_88] =====> char buffer[128];
为什么?我看不懂 128bytes?
一般来说,单个汇编指令和 C 结构之间没有直接对应关系。单个指令可能只是来自更大构造的单个 "brick" 。如果打开优化,以这种方式追踪事情会变得更加困难。
考虑到第一个例程,这里是逐条指令演练:
push ebp
将旧的 "stack base pointer" 保存在堆栈中,以便在离开函数后可以恢复,调用者可以确信它没有改变;mov ebp, esp
用 "stack pointer" 的当前值加载 "base pointer" 的值。对该函数堆栈帧中变量的任何进一步引用都可以相对于这个新分配的基指针进行;sub esp, 0x98
从堆栈指针中减去值152
。这有效地 "allocates" space 在堆栈上。现在可以在ebp
和esp
指向的地址之间容纳任何具有自动存储的变量。这可能包括您的buffer
数组。mov dword[ss:esp + 8], 0x100
将值256
放在esp + 8
指向的地址。这可能对应于对自动 variable/array. 的赋值
lea eax, dword[ss:ebp + var_88]
计算一个地址,该地址是基指针加上某个常量偏移量的结果,并将其存储到eax
中。这可能对应于指向自动数组开头的指针。eax
然后作为参数移入堆栈,作为对j_read
的后续调用的参数。0
也作为第一个参数传递。然后调用该函数,leave 指令恢复旧的基指针,并通过ret
指令将控制权返回给调用者。