如何在内存转储中找到堆栈和其他信息?手臂

逆向工程 手臂 开发 缓冲区溢出 调用约定
2021-06-13 03:04:24

我正在反转一个封闭的平台,以尝试使用漏洞利用、堆栈溢出来获得执行。有人告诉我(因为没有调试器)最好的方法是使用 RAM 转储(我拥有的)来尝试了解缓冲区的长度、缓冲区后的链接寄存器在哪里、调用约定如何工作。 ..所以我可以成功地创建一个漏洞。

有关该平台的更多信息。

  • ARM 架构(ARM9 和 ARM11 处理器)
  • NX 位但没有 ASLR(这就是为什么我还需要知道哪些内存页是可执行的以获取 ROP 小工具)
  • 我没有调试器。仅 RAM 转储

我想知道如何识别内存中的堆栈(尽管可能不止一个)以及如何识别内存页面,并知道哪些是可执行的。

1个回答

我唯一的想法是比较转储。所有转储中相同的地方是代码或只读数据。从转储到转储发生变化的地方要么是堆栈,要么是像.bss. 在找到没有改变的地方后,我会尝试反汇编这些地方,以便在代码和数据之间进行划分。

我认为带有代码的地方应该比带有数据的地方具有更高的熵,但我无法正式证明。

此外,您可能应该考虑以下几点:

  • 有可能执行的代码来自闪存并直接从闪存执行。RAM 中的代码可能不完整。
  • 代码有可能在启动过程中自行解包。我见过这样的东西带itcmdtcm内存区。
  • 有内存映射寄存器,旨在用于不同的设备,因此您可能会看到对这些内存区域的大量访问。找到这些地址信息的最好方法是找到一个数据表并仔细阅读它,它可能包含系统的内存映射。

一般来说,我不太确定使用 RAM 是最好的解决方案,如果我要承担这样的任务,我会尝试用初始图像焊接闪存,读取它并对其进行静态逆向工程。