“Shellcoder手册:发现和利用安全漏洞”第8章中的第一个堆栈如何工作?

问题描述:

我一直在通过'Shellcoder的手册:发现和利用安全漏洞',可以找到here,但我没有完全理解p.179(全球p.205)上可以找到的漏洞之一here。这个漏洞攻击了第175页上的脆弱程序(全球第201页)。“Shellcoder手册:发现和利用安全漏洞”第8章中的第一个堆栈如何工作?

作为漏洞利用的一部分跳转到的shellcode以“\ x90 \ x90 \ x90 \ x90 \ x01 \ x90 \ x90 \ x6A \ x30 \ x59”开头。我用this网站进行分解,它显示这个十六进制字符串与4个nops相同,后面加上“add DWORD PTR [eax + 0x59306a90],edx”。从我所知道的情况来看,这条指令似乎并不适合于其他的利用。用nop指令替换“\ x01”会产生7个nops,然后是“push 0x30,pop ecx”,这对我来说很合理,因为我们试图找到位于0x30偏移处的PEB进入TEB。然而,只有当我将其更改为“\ x90”(在Windows XP的香草副本中)时,该漏洞才会与左侧的“\ x01”兼容并中断。奇怪的是,漏洞也可以通过将“\ x01”替换为“\ x02”来实现,这使我很困惑。因此,我的问题是“\ x01”在漏洞攻击中扮演什么角色,为什么它不仅仅是一个nop?

我认为这里有更深层的东西,我错过了。任何帮助将不胜感激。

+0

将'01'更改为'02'将'ADD r/m32,r32'更改为'ADD r8,r/m8',使用相同的操作数,但请注意目标将是'dl'而不是内存,所以“add”的实际效果可能不相关。您应该在调试器中单步执行它,并查看在“add”后面执行的指令。 (我没有阅读第一段中的链接,如果被攻击的代码太大而无法在一个合理长度的问题中进行总结,我没有足够的兴趣花时间阅读它,对不起。有兴趣的shellcode会看这个) –

书中说:

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

因此,ADD指令似乎只是因为它可以产生访问冲突。 NOP可能有助于确保您到达正确的位置。

再往178页上,他们提到在一个固定的地址PEB利用指针。通过改变这些指针,你可以获得调用并执行的特定代码(你的代码)。

因为你是一个开发分配,HeapAlloc()会做移动指针到合适的位置(在PEB)的工作。指针直接转到您的代码,并从ExitProcess()中调用,它实际上试图获取内存锁(进程间锁)。

显然,一旦你执行你的代码,可以很好地做你想做的。这里没有问题。

为什么它的工作?

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

在过去,Intel处理器使用段寄存器(如DS)获得类似的效果,但没有内存保护(进程A可以从进程B读取数据)。68000进程允许您编写代码到64Kb的大小(32Kb使其变得容易),并将它重新定位到任何地方。旧的Mac使用该功能相当好。

现在MMU给你完全的*和Windows XP已经使用的硬件功能。所以......所有的程序(文本)都从相同的地址开始。 (如果我是正确的话,就像0x10000一样)。该进程使用的许多信息都保存在第一个64Kb中。这很容易作为旧的全局变量访问。用于访问系统的某些部分,而不必每次都执行syscall,并且指向各个部分(如动态库(PEB))。

这意味着你的利用只需要知道这些指针,它可以使用它们的优势。开始起步有点费劲,但一旦习惯了演习,就很容易看到这些漏洞。