这是基本流程:
我能够控制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幻灯片才能阻止这种奇怪的行为。
。谢谢。 >
#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
评论
为什么在您的shellcode中放入FSTENV?哦,您使用了编码器。我想它弄糟了。