为什么 shell 代码只对我有用 nop 幻灯片?

逆向工程 开发 元破解
2021-06-20 07:56:58

我试图了解 SLMail 5.5 的漏洞利用。

这是基本流程:

  1. 我能够控制 EIP 并指向指令“JMP ESP”
  2. ESP 指向我的 shellcode 的确切开始位置。(Shell 代码在 msfvenom 中使用 shikata_ga_nai 编码器进行编码)
  3. 由于 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 幻灯片附加到 shellcode,实际上在执行行中的以下指令将被执行,但没有任何麻烦并使漏洞利用工作......

0159A133   5B               POP EBX

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

1个回答

让我们看看“奇怪的指令”了什么

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

在我们的例子中,目标是ESP-C,它是代码开始前的 12 个字节(如果代码从 开始ESP)。由于 FPU 状态是 28 字节,所以它会更进一步并用 FPU 值覆盖 shellcode 的开头如果添加 NOP 雪橇,雪橇将被覆盖,这不会产生任何影响,因为它不会再次执行。如果没有雪橇,当前正在执行的指令将被覆盖,这会破坏 shellcode。

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