绕过ASLR而不泄漏地址

逆向工程 开发 缓冲区溢出
2021-06-11 04:48:58

我发现堆栈缓冲区溢出。

目前,情况是这样的:

  • NX/DEP 禁用
  • 启用 ASLR
  • 不是 PIE

我能够覆盖返回地址并跳转到 PLT 部分。

我的问题是由于空字节,我只能复制数据直到返回地址,因此我无法跳转到堆栈中的shellcode。二进制开始于0x00090000,因此执行 ROP gadget 是一个问题,因为我只能复制一个地址直到返回地址。

此外,我的二进制文件包含一个我可以跳转到的系统调用,但在这种情况下,我需要将字符串参数的地址放在 R0 中,由于 ASLR,这是不可能的。我还可以覆盖 4 个寄存器。

有没有人知道如何在不泄漏地址的情况下绕过ASLR?当前架构:ARM。

3个回答

好吧,如果您不能泄漏任何地址,您就不能真正使用 ROP,但是因为 ARM 是小端的,您实际上可以覆盖返回地址的最后几个字节。您最终会在二进制文件中进行相对跳转。不幸的是,您只能进行一次跳跃。

Return Address before:                     0x1122334455667788
Return Address overridden:                 0x112233445566????
Return Address overridden (case string):   0x11223344556600??

正如您所描述的问题,缓冲区溢出是由以 NULL 结尾的字符串触发的,因此降低了可能的跳转位置,但也许您很幸运并找到了一个好位置。喜欢

call rax   (there surely is an equivalent instruction on ARM, but idk)

也许堆栈上或某些寄存器中存在对 shellcode 的引用,您可以执行指向该指针的间接分支并在堆栈上执行 shellcode。

我能想到几个可能的解决方案。所有(显然)都取决于你没有提到的细节。我希望您至少发现其中一项有用。

  1. 将 shellcode放在被覆盖的返回地址之前这取决于缓冲区的长度(加上堆栈上的任何附加数据),但可能已经足够了(至少可以跳转或复制位于其他地方的另一段代码)。
  2. ret2libc方法更进一步 - 跳转到执行某些寄存器操作的小工具,然后通过直接调用system或调用/跳转到您可以控制的寄存器来调用有用的函数(例如系统)
  3. 请记住,您不一定必须覆盖堆栈的其余部分。对其进行一些有限的控制可能就足够了。您知道堆栈回溯并可以控制接下来要执行的代码,确保有足够的堆栈弹出(ARM 中的单个指令)和分支或其他一些有用的小工具。
  4. 使用 JOP。有可能(尽管更难)构建小工具序列,而不是使用ret指令通过一系列跳转/分支指令连接。这需要搜索以call/ b/etc 指令(最好是使用寄存器的)而不是指令结尾的小工具ret

请注意,对于更一般的答案,某些原语可用于在不绕过 ASLR 的情况下获得代码执行,尽管这实际上取决于场景(并且您通常必须非常幸运)。

也许我朋友的工具可以帮助你,它在运行时计算地址。