我正在尝试了解SLMail 5.5的漏洞利用。

这是基本流程:


我能够控制EIP并指向一条指令“ JMP ESP”
ESP指向我的shellcode的确切开始位置。
(Shell代码使用msfvenom中的shikata_ga_nai编码器编码)
ESP指向我想要的确切位置,我觉得我不需要nop幻灯片。但是当我不使用nop时,我看到的是有线结果。我希望有人可以对此有所了解。

4)下面是第一个我的shellcode没有NOP幻灯片的一些指令,一旦执行了突出显示的怪异指令,内存中的指令就被更改了(太怪异了!)

0159A128   BF A849F49D      MOV EDI,9DF449A8
0159A12D   D9E5             FXAM
0159A12F   D97424 F4        FSTENV (28-BYTE) PTR SS:[ESP-C] <-- Weird instruction
0159A133   5B               POP EBX
0159A134   33C9             XOR ECX,ECX
0159A136   B1 52            MOV CL,52
0159A138   317B 12          XOR DWORD PTR DS:[EBX+12],EDI
0159A13B   83EB FC          SUB EBX,-4
0159A13E   03D3             ADD EDX,EBX


在执行突出显示的指令后,我的记忆看起来是这样的:

0159A12F   0100             ADD DWORD PTR DS:[EAX],EAX
0159A131   0000             ADD BYTE PTR DS:[EAX],AL
0159A133   0000             ADD BYTE PTR DS:[EAX],AL <--Jumping here after the weird instruction
0159A135   00FF             ADD BH,BH
0159A137   FF31             PUSH DWORD PTR DS:[ECX]
0159A139   7B 12            JPO SHORT 0159A14D
0159A13B   83EB FC          SUB EBX,-4
0159A13E   03D3             ADD EDX,EBX


但是在外壳代码上附加了NOP幻灯片,下面的指令实际上在执行行中被激怒,无论有什么麻烦和使漏洞得以发挥作用。...

0159A133   5B               POP EBX


谁能解释为什么我需要NOP幻灯片才能阻止这种奇怪的行为。
。谢谢。 >

评论

为什么在您的shellcode中放入FSTENV?

哦,您使用了编码器。我想它弄糟了。

#1 楼

让我们看一下“奇怪的指令”的作用:


将当前FPU操作环境保存在由目标操作数指定的内存位置
,然后屏蔽所有
浮点异常。 FPU操作环境包括
FPU控制字,状态字,标记字,指令指针,数据
指针和最后一个操作码


目标是ESP-C,它是代码开始之前的12个字节(如果代码从ESP开始)。由于FPU状态为28个字节,因此它走得更远,并用FPU值覆盖Shellcode的开头。如果添加NOP底座,底座将被覆盖,这将无效,因为它将不会再次执行。如果没有雪橇,则当前执行的指令将被覆盖,从而破坏shellcode。

显然,FSTENV用作“ getpc”原语的一部分(存储的值之一是当前EIP),它需要一些用于环境的堆栈空间。因此,您需要确保ESP周围有可用空间,或者添加NOP底座进行填充。或者,您可以尝试修改编码器,以使用更常见的调用$ + 5 / pop ebx序列,该序列只会覆盖ESP处的一个双字。

评论


必须登录以对此进行投票。很好的观察。

– Shebaw
17年7月5日在19:38



我网站上的“ Shellgames”演示中介绍了该技术。 [esp-0c]允许使用弹出指令来返回弹出寄存器中的EIP。但是,您需要将堆栈指针与代码保持足够的距离,以免被覆盖。

–彼得·弗里
17年7月14日在20:12