我通常没有阅读JavaScript脚本的困难,但这个我无法弄清楚逻辑.该代码来自于4天前发布的漏洞利用程序.你可以在milw0rm找到它.
这是代码:
x
这就是我相信它的作用,我希望你帮助我解决我误解的部分.
该变量shellcode
包含打开calc.exe的代码.我不知道他们是如何发现奇怪的字符串......任何想法?
第二件事是变量calc.exe
.我不明白这个奇怪的循环?
第三件事是spray
从未在任何地方使用的变量,他们为什么要创建它?
最后一点,XML标签在页面中做了什么?
好吧,目前我有很好的答案,但大多数都非常一般.我想更多解释代码的价值.一个例子是memory
.这是什么意思?循环相同的事情,为什么开发人员写道:
unescape("%u0a0a%u0a0a");
?我想要更深入的理解,不仅仅是这段代码的理论.
shellcode包含一些将执行实际利用的x86汇编指令.spray
创建一系列将被放入的指令memory
.由于我们通常无法在内存中找到shellcode的确切位置,因此我们nop
在它之前放了很多指令并跳转到那里的某个地方.该memory
数组将保存实际的x86代码以及跳转机制.我们将精心制作的XML提供给有错误的库.当它被解析时,该错误将导致指令指针寄存器被分配到我们的漏洞中的某个地方,从而导致任意代码执行.
为了更深入地理解,你应该真正弄清楚x86代码中的内容.unscape
将用于将字符串表示的字节序列放在spray
变量中.它是有效的x86代码,它填充了大量的堆并跳转到shellcode的开头.结束条件的原因是脚本引擎的字符串长度限制.您不能拥有大于特定长度的字符串.
在x86汇编中,0a0a
代表or cl, [edx]
.这实际上等同于nop
我们的利用目的的指令.无论我们跳到哪里spray
,我们都会到达下一条指令,直到我们到达shellcode,这是我们实际想要执行的代码.
如果你看一下XML,你也会看到0x0a0a
它.准确地描述发生的事情需要具体的漏洞利用知识(你必须知道bug的位置以及它是如何被利用的,我不知道).但是,我们似乎强制Internet Explorer通过设置innerHtml
恶意XML字符串来触发错误代码.Internet Explorer尝试解析它,并且错误的代码以某种方式控制数组存在的内存位置(因为它是一个很大的块,跳转的概率很高).当我们跳到那里时,CPU将继续执行or cl, [edx]
指令,直到到达放入内存的shellcode的开头.
我已经拆解了shellcode:
00000000 C9 leave 00000001 2B1F sub ebx,[edi] 00000003 B10C mov cl,0xc 00000005 BDC536DB9B mov ebp,0x9bdb36c5 0000000A D9C5 fld st5 0000000C 2474 and al,0x74 0000000E 5A pop edx 0000000F F4 hlt 00000010 EA8331FC0B6A6A jmp 0x6a6a:0xbfc3183 00000017 03D4 add edx,esp 00000019 07 pop es 0000001A 67305CFF xor [si-0x1],bl 0000001E 98 cwde 0000001F BBD7FFA4FE mov ebx,0xfea4ffd7 00000024 9B wait 00000025 74AD jz 0xffffffd4 00000027 058B8B028D add eax,0x8d028b8b 0000002C D893BCCD35A2 fcom dword [ebx+0xa235cdbc] 00000032 37 aaa 00000033 B84290A63A mov eax,0x3aa69042 00000038 94 xchg eax,esp 00000039 E99AA4D58D jmp 0x8dd5a4d8 0000003E E5A3 in eax,0xa3 00000040 1F pop ds 00000041 4C dec esp 00000042 EB46 jmp short 0x8a 00000044 4B dec ebx 00000045 8CD0 mov eax,ss 00000047 AD lodsd 00000048 A844 test al,0x44 0000004A 52 push edx 0000004B 4A dec edx 0000004C 3B81B80DD748 cmp eax,[ecx+0x48d70db8] 00000052 4B dec ebx 00000053 D46C aam 0x6c 00000055 46 inc esi 00000056 1392734A204F adc edx,[edx+0x4f204a73] 0000005C F8 clc 0000005D 6E outsb 0000005E DC8EA20726B4 fmul qword [esi+0xb42607a2] 00000064 04D4 add al,0xd4 00000066 D084ECBA978221 rol byte [esp+ebp*8+0x218297ba],1 0000006D 7CE8 jl 0x57 0000006F C0CA8C ror dl,0x8c 00000072 F4 hlt 00000073 A6 cmpsb 00000074 47 inc edi 00000075 210D2EA0B0CD and [0xcdb0a02e],ecx 0000007B 2CA8 sub al,0xa8 0000007D B05B mov al,0x5b 0000007F 43 inc ebx 00000080 F4 hlt 00000081 24E8 and al,0xe8 00000083 7A9C jpe 0x21 00000085 BB857DCBA0 mov ebx,0xa0cb7d85 0000008A 7DED jnl 0x79 0000008C 92 xchg eax,edx 0000008D 09E1 or ecx,esp 0000008F 96 xchg eax,esi 00000090 315580 xor [ebp-0x80],edx
理解这个shellcode需要x86汇编知识和MS库本身的问题(知道我们到达这里时的系统状态),而不是JavaScript!此代码将依次执行calc.exe
.
这看起来像微软发布紧急补丁的最新Internet Explorer漏洞利用.它使用Microsoft XML处理程序的数据绑定功能中的缺陷,导致堆内存被错误地释放.
Shellcode是在发生错误时运行的机器代码.喷雾和内存只是堆上分配的一些空间,以帮助发生可利用的情况.