【问题标题】:Declaration of an array in disassembled code反汇编代码中的数组声明
【发布时间】:2016-03-14 11:10:02
【问题描述】:

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

上图是本程序的主程序

请看上图中的红线。

数组的声明好像在这里。

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

为什么? 128bytes看不懂?

【问题讨论】:

  • 分配发生在前一点,在mov esp, 0x98。除了为buffer 分配0x80,它还为该范围内的其他变量分配0x18lea指令只是为了确定buffer在栈上的地址
  • 谢谢你的评论!我明白了。
  • 谢谢你的评论!我知道了。但是,我还是不明白。对不起。为什么要为缓冲区分配 0x80?为什么你会找到 0x80。谢谢!
  • @stackosiete: 0x80128 的十六进制表示。

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


【解决方案1】:

一般来说,单独的汇编指令和 C 结构之间没有直接的对应关系。单个指令可能只是来自更大结构的单个“砖”。如果启用优化,以这种方式跟踪事物会变得更加困难。

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

  • push ebp将旧的“栈基指针”保存在栈上,以便离开函数后可以恢复,调用者可以确信它没有改变;

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

  • 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 也作为第一个参数传递。然后调用该函数,离开指令恢复旧的基指针,并通过ret 指令将控制权返回给调用者。

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 2021-05-03
    • 2013-07-21
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2012-06-01
    相关资源
    最近更新 更多