我一直在研究{Shellcoder的手册:发现和利用安全漏洞',可以找到here,但我并不完全理解p.179(p.205全球)中给出的漏洞之一可以找到here。此漏洞利用攻击第175页(全球第201页)中发现的易受攻击的程序。
作为漏洞利用的一部分跳转到的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”,这对我来说非常有意义,因为我们试图在TEB中找到偏移量为0x30的PEB。但是,该漏洞只适用于留下的“\ x01”,如果我将其更改为“\ x90”(在Windows XP的香草副本上)则会中断。奇怪的是,该漏洞也可以通过将“\ x01”替换为“\ x02”来实现,这真的让我很困惑。因此,我的问题是“\ x01”在漏洞利用中起什么作用,为什么它不仅仅是一个nop?
我认为这里有更深层次的事情,我不知道了。任何帮助将不胜感激。
答案 0 :(得分:1)
这本书说:
这里没有什么棘手的;我们溢出缓冲区,进行任意覆盖,发生访问冲突,然后让ExitProcess开始有趣。
所以似乎ADD
指令只是因为它可以生成访问冲突。 NOP
可能有助于确保您到达正确的位置。
在第178页进一步说,他们提到PEB在固定地址使用指针。通过更改这些指针,您可以获得调用并执行的特定代码(您的代码)。
由于您正在利用分配,HeapAlloc()
将执行将指针移动到正确位置(在PEB中)的工作。指针直接进入你的代码并从实际尝试获取内存锁(进程间锁)的ExitProcess()
调用。
显然,一旦执行代码,您就可以随心所欲地执行任何操作。这不是问题。
为什么会有效?
MMU(内存管理单元)介绍的一件事是能够安装软件和任何"物理地址并执行它就像它在不同的地址一样。
在过去,英特尔处理器使用段寄存器(如DS)获得类似的效果,但没有内存保护(进程A可以从进程B读取数据)68000进程允许您编写代码到尺寸为64Kb(32Kb使其变得简单)并将其重新定位到任何地方。旧的Mac很好地使用了这个功能。
现在,MMU为您提供了完全的自由,Windows XP已经使用了该硬件功能。所以...所有程序(文本)都从完全相同的地址开始。 (类似于0x10000,如果我是正确的。)并且该过程使用的许多信息都保存在第一个64Kb中。这很容易作为好的旧全局变形。用于访问系统的各个部分,而不必每次都执行syscall
并指向各种部分,例如动态库(PEB内容)。
这意味着你的利用只需知道那些指针,它就可以利用它们。开始使用起来有点费力,但是一旦习惯了演练,就很容易看到这些漏洞。