"Shellcoder's Handbook: Discovery and Exploiting Security Holes"第 8 章中的第一个堆漏洞利用是如何工作的?



我一直在研究"Shellcoder's Handbook:发现和利用安全漏洞",可以在这里找到,但我不完全理解p.179(全球第205页(中给出的漏洞之一,可以在这里找到。此漏洞攻击第 175 页(全球第 201 页(中发现的易受攻击的程序。

作为漏洞利用的一部分跳转到的外壳代码以"\x90\x90\x90\x90\x90\

x01\x90\x90\x6A\x30\x59"开头。我使用这个网站来反汇编它,它显示这个十六进制字符串与 4 nops 相同,后跟"添加 DWORD PTR [eax+0x59306a90],edx"。据我所知,此指令似乎不适合其余漏洞利用。用nop指令替换"\x01"会产生7个nops,然后是"push 0x30,pop ecx",这对我来说非常有意义,因为我们试图找到偏移量为0x30的PEB。但是,该漏洞仅适用于保留的"\x01",如果我将其更改为"\x90"(在Windows XP的原版副本上(,则会中断。奇怪的是,该漏洞还可以通过将"\x01"替换为"\x02"来工作,这确实让我感到困惑。因此,我的问题是"\x01"在漏洞利用中扮演什么角色,为什么它不仅仅是一个nop?

我认为这里发生了一些更深层次的事情,但我错过了。任何帮助将不胜感激。

书中说:

这里没有什么棘手的;我们溢出缓冲区,进行任意覆盖,让访问冲突发生,然后让 ExitProcess 开始乐趣。

因此,似乎ADD指令的存在只是为了生成访问冲突。NOP可能有助于确保您到达正确的地方。

在第178页,他们提到PEB在固定地址上使用指针。通过更改这些指针,您可以调用并执行特定代码(您的代码(。

由于您正在利用分配,因此HeapAlloc()将执行将指针移动到正确位置(在 PEB 中(的工作。指针直接指向您的代码,并从实际尝试获取内存锁(进程间锁(的ExitProcess()调用。

显然,一旦你执行了你的代码,你就可以很好地做任何你想做的事情。这里不是问题。

为什么有效?

MMU(内存管理单元(引入的一件事是能够安装软件"任何"物理地址并像在不同的地址一样执行它。

在过去,英特尔处理器使用段寄存器(如 DS(来获得类似的效果,但没有内存保护(进程 A 可以从进程 B 读取数据。68000 进程允许您编写最大 64Kb 的代码(32Kb 以使其简单(,并将其重新定位到任何地方。旧Mac很好地使用了该功能。

现在MMU给你完全的自由,Windows XP已经使用了这个硬件功能。 所以......所有程序(文本(都从完全相同的地址开始。(如果我是对的,类似于0x10000。并且该过程使用的许多信息都保存在前64Kb中。这很容易作为好的旧全局变量访问。对于访问系统的各个部分很有用,而不必每次都执行syscall,并且具有指向各个部分(例如动态库(PEB 内容((的指针。

这意味着您的利用只需要知道这些指针,就可以利用它们来发挥自己的优势。入门有点费力,但是一旦您习惯了演习,就很容易看到这些漏洞。

相关内容

最新更新