Shockwave Aaron Portnoy and Logan Brown Tipping Point
Shockwaveのブラックボックス的監査 Aaron Portnoy and Logan Brown, Tipping. Point DVLabs November 9 th, 2011: Pac. Sec
自己紹介 • ブログ – http: //dvlabs. tippingpoint. com/team/aportnoy – http: //dvlabs. tippingpoint. com/team/lbrown • Tipping. Point DVLabs (TSRT) – Security Research / Vuln Discovery – http: //dvlabs. tippingpoint. com/appearances – http: //dvlabs. tippingpoint. com/advisories/published • Zero Day Initiative – http: //www. zerodayinitiative. com
!heap を使ってみたが… 0: 008> !heap p a @eax address 03910020 found in _HEAP @ 150000 HEAP_ENTRY Size Prev Flags User. Ptr User. Size state 03910018 20000 [0 b] 03910020 100000 – Trace: 2712 7 c 96 eed 2 ntdll!Rtl. Debug. Allocate. Heap+0 x 000000 e 1 7 c 94 b 394 ntdll!Rtl. Allocate. Heap. Slowly+0 x 00000044 7 c 918 f 21 ntdll!Rtl. Allocate. Heap+0 x 00000 e 64 7 c 80 ff 0 f kernel 32!Global. Alloc+0 x 00000066 690148 aa IML 32!Ordinal 1218+0 x 0000002 a
!heap を使ってみたが… 0: 008> !heap p a @eax address 03910020 found in _HEAP @ 150000 HEAP_ENTRY Size Prev Flags User. Ptr User. Size state 03910018 20000 [0 b] 03910020 100000 – Trace: 2712 7 c 96 eed 2 ntdll!Rtl. Debug. Allocate. Heap+0 x 000000 e 1 7 c 94 b 394 ntdll!Rtl. Allocate. Heap. Slowly+0 x 00000044 7 c 918 f 21 ntdll!Rtl. Allocate. Heap+0 x 00000 e 64 7 c 80 ff 0 f kernel 32!Global. Alloc+0 x 00000066 690148 aa IML 32!Ordinal 1218+0 x 0000002 a 何これ?
動的バイナリインスツルメンテーション(続き) メモリをVirtual. Allocする 0 xwhatever: jmp IML 32_1128+0 x 05 jmp far 0 xwhatever 2: jmpを挿入する <our asm logic>
動的バイナリインスツルメンテーション(続き) メモリをVirtual. Allocする 0 xwhatever: jmp IML 32_1128+0 x 05 jmp far 0 xwhatever 2: <our asm logic> jmp 0 xwhatever 取り出したコードへのjmp命令を書く
ファイル読み込みのフック(続き) [BITS 32] push ecx push esi mov ecx, [esp+0 x 14] mov esi, [esp+0 x 10] mov [_sym. Count], ecx mov [_sym. Buf], esi pop ecx
ファイル読み込みのフック(続き) [BITS 32] pushad pushfd mov ecx, [_sym. Count] mov esi, [_sym. Buf] shr ecx, 2 mov eax, _sym. Needle TEXT. loop cmp [esi], eax jnz. increment jmp. success . increment lea esi, [esi+4] dec ecx jz. fail jmp. loop. success int 3. fail jmp. exit popfd popad
ファイル読み込みのフック(続き) ファイルデータ (0 x 0000 dc 50に注目): 0000 h: 52 49 46 58 00 00 DC 50 4 D 56 39 33 69 6 D 61 70 RIFX. . ÜPMV 93 imap 0010 h: 00 00 00 18 00 00 00 01 00 00 00 2 C 00 00 07 3 A . . . , . . . : 0020 h: 00 00 00 6 D 6 D 61 70 . . . mmap msvcr 71フックを挿入: S: Toolshooking>python. exe i read_search. py 812 0 x 0000 dc 50 [*] Injecting hooks [*] Successfully injected >>>
ファイル読み込みのフック(続き) 0: 015> sxe ld: dirapi 0: 015> sxe ld: iml 32 0: 015> g Mod. Load: 69000000 6910 b 000 C: WINDOWSsystem 32AdobeShockwave 11IML 32. dll eax=7 c 37 b 9 b 0 ebx=0000 ecx=7 c 37 d 5 b 8 edx=03 b 4285 f esi=0000 edi=0000 eip=7 c 90 e 514 esp=025 dca 04 ebp=025 dcaf 8 iopl=0 nv up ei ng nz ac pe nc cs=001 b ss=0023 ds=0023 es=0023 fs=003 b gs=0000 efl=00000296 ntdll!Ki. Fast. System. Call. Ret: 7 c 90 e 514 c 3 ret 0: 008> g (32 c. 210): Break instruction exception - code 80000003 (first chance) eax=50 dc 0000 ebx=0000 ecx=00001 fff edx=03 b 71 fc 0 esi=04712 a 10 edi=04712 a 0 c eip=03 b 60089 esp=025 dbaa 4 ebp=00000003 iopl=0 nv up ei pl zr na pe nc cs=001 b ss=0023 ds=0023 es=0023 fs=003 b gs=0000 efl=00000246 03 b 60089 cc int 3 0: 008> dc esi L 3 04712 a 10 50 dc 0000 3339564 d 70616 d 69 . . . PMV 93 imap
ファイル読み込みのフック(続き) 0: 015> sxe ld: dirapi 0: 015> sxe ld: iml 32 0: 015> g Mod. Load: 69000000 6910 b 000 C: WINDOWSsystem 32AdobeShockwave 11IML 32. dll eax=7 c 37 b 9 b 0 ebx=0000 ecx=7 c 37 d 5 b 8 edx=03 b 4285 f esi=0000 edi=0000 eip=7 c 90 e 514 esp=025 dca 04 ebp=025 dcaf 8 iopl=0 nv up ei ng nz ac pe nc cs=001 b ss=0023 ds=0023 es=0023 fs=003 b gs=0000 efl=00000296 ntdll!Ki. Fast. System. Call. Ret: 7 c 90 e 514 c 3 ret 0: 008> g (32 c. 210): Break instruction exception - code 80000003 (first chance) eax=50 dc 0000 ebx=0000 ecx=00001 fff edx=03 b 71 fc 0 esi=04712 a 10 edi=04712 a 0 c eip=03 b 60089 esp=025 dbaa 4 ebp=00000003 iopl=0 nv up ei pl zr na pe nc cs=001 b ss=0023 ds=0023 es=0023 fs=003 b gs=0000 efl=00000246 03 b 60089 cc int 3 0: 008> dc esi L 3 04712 a 10 50 dc 0000 3339564 d 70616 d 69 . . . PMV 93 imap ファイルデータ
RIFXフォーマット 0000 h: 52 49 46 58 00 00 DC 50 4 D 56 39 33 69 6 D 61 70 RIFX. . ÜPMV 93 imap 0010 h: 00 00 00 18 00 00 00 01 00 00 00 2 C 00 00 07 3 A . . . , . . . : 0020 h: 00 00 00 6 D 6 D 61 70 . . . mmap 0030 h: 00 00 0 F E 0 00 18 00 14 00 00 00 CA 00 00 00 97 . . . à. . . . Ê. . . — 0040 h: 00 00 00 90 FF FF 00 00 00 68 52 49 46 58 . . . � ÿÿÿÿ. . . h. RIFX 0050 h: 00 00 DC 50 00 00 01 00 00 00 . . ÜP. . . 0060 h: 69 6 D 61 70 00 00 00 18 00 00 00 0 C 00 01 00 00 imap. . . 0070 h: 0 A AF D 9 24 6 D 6 D 61 70 00 00 0 F E 0 00 00 00 2 C . ¯Ù$mmap. . . à. . . , 0080 h: 00 00 0 A AF B 0 AC 4 B 45 59 2 A 00 00 02 28 . . . ¯°¬KEY*. . . ( 0090 h: 00 00 10 14 00 00 43 41 53 74 . . . CASt 00 A 0 h: 00 00 1 D 2 C 00 00 38 B 6 00 00 . . . , . . 8¶. . . . 00 B 0 h: 66 72 65 65 00 00 00 0 C 00 00 free. . . 00 C 0 h: 00 00 00 75 66 72 65 65 00 00 . . . ufree. . . . 00 D 0 h: 00 0 C 00 00 00 05 66 72 65 65 00 00 . . . . free. . 00 E 0 h: 00 00 00 0 C 00 00 00 06 66 72 65 65 . . . free
RIFXフォーマット(続き) 0000 h: 52 49 46 58 00 00 DC 50 4 D 56 39 33 69 6 D 61 70 RIFX. . ÜPMV 93 imap 0010 h: 00 00 00 18 00 00 00 01 00 00 00 2 C 00 00 07 3 A . . . , . . . : 0020 h: 00 00 00 6 D 6 D 61 70 . . . mmap 0030 h: 00 00 0 F E 0 00 18 00 14 00 00 00 CA 00 00 00 97 . . . à. . . . Ê. . . — 0040 h: 00 00 00 90 FF FF 00 00 00 68 52 49 46 58 . . . � ÿÿÿÿ. . . h. RIFX 0050 h: 00 00 DC 50 00 00 01 00 00 00 . . ÜP. . . 0060 h: 69 6 D 61 70 00 00 00 18 00 00 00 0 C 00 01 00 00 imap. . . 0070 h: 0 A AF D 9 24 6 D 6 D 61 70 00 00 0 F E 0 00 00 00 2 C . ¯Ù$mmap. . . à. . . , 0080 h: 00 00 0 A AF B 0 AC 4 B 45 59 2 A 00 00 02 28 . . . ¯°¬KEY*. . . ( 0090 h: 00 00 10 14 00 00 43 41 53 74 . . . CASt 00 A 0 h: 00 00 1 D 2 C 00 00 38 B 6 00 00 . . . , . . 8¶. . . . 00 B 0 h: 66 72 65 65 00 00 00 0 C 00 00 free. . . 00 C 0 h: 00 00 00 75 66 72 65 65 00 00 . . . ufree. . . . 00 D 0 h: 00 0 C 00 00 00 05 66 72 65 65 00 00 . . . . free. . 00 E 0 h: 00 00 00 0 C 00 00 00 06 66 72 65 65 . . . free
Dirapi!Ordinal_82 5926 ノード 323176 エッジ
Dirapi!Ordinal_82(続き)
アタックポイントの列挙(続き) 0000 h: 52 49 46 46 00 06 9 D 4 F 50 43 4 B 32 49 4 E 46 4 F RIFF. . � OPCK 2 INFO 0010 h: 00 00 00 A 2 00 00 00 18 00 00 00 03 00 00 . . . ¢. . . 0020 h: 00 00 9 B 00 00 00 8 A 78 DA 35 CB . . . . ›. . . ŠxÚ 5Ë 0030 h: 3 B 12 82 30 10 00 D 0 3 D CA 96 DA F 0 0 B 82 D 8 59 ; . ‚ 0. . Ð=Ê–Úð. ‚ØY 0040 h: DA D 8 C 0 38 B 6 F 9 AC C 2 38 10 66 B 3 18 BD BD 69 ÚØÀ8¶ù¬ 8. f³. ½½i 0050 h: EC DF 1 B E 8 23 77 61 0 D 67 E 7 0 D 61 FF 0 D 42 73 ìß. è#wa. gç. aÿ. Bs 0060 h: C 0 CB 62 3 D AF 9 E B 5 90 83 E 1 6 F E 0 46 3 C F 5 D 3 ÀËb=¯žµ� ƒáoàF<õÓ 0070 h: 73 C 1 81 B 7 20 78 25 89 9 E 5 F 09 70 3 A FE 81 5 B sÁ� · x%‰ž_. p: þ� [ 0080 h: 20 D 4 82 A 3 C 8 1 A 4 E 79 1 E 63 CC DE A 9 84 54 32 Ô‚£È. Ny. cÌÞ©„T 2 0090 h: EB E 7 9 C 57 8 D 3 B BB 2 F 6 A 00 E 5 AA CA E 8 C 6 18 ëçœW� ; » /j. åªÊèÆ. 00 A 0 h: 65 0 A 7 B B 0 65 D 5 76 D 4 D 6 CD D 1 2 A D 7 36 54 76 e. {°eÕvÔÖÍÑ*× 6 Tv 00 B 0 h: 00 3 F B 9 E 7 33 16 46 4 C 53 54 00 00 00 24 00 00 . ? ¹ç 3. FLST. . . $. . 00 C 0 h: 00 08 00 00 00 01 00 00 54 65 78 74 58 74 . . Text. Xt 00 D 0 h: 72 61 2 E 78 33 32 00 31 31 2 E 35 2 E 38 72 36 31 ra. x 32. 11. 5. 8 r 61 00 E 0 h: 32 00 53 49 47 4 E 00 00 00 40 23 87 1 A 11 A 1 E 9 2. SIGN. . . @#‡. . ¡é 00 F 0 h: D 1 75 BE EE 08 BA E 6 73 89 6 A 2 E 58 B 0 CE EA 53 Ñu¾î. ºæs‰j. X°ÎêS 0100 h: E 1 BA D 5 16 94 4 D 28 7 C 7 B C 8 AD 1 F 16 D 6 60 D 0 áºÕ. ”M(|{È. . Ö`Ð 0110 h: 48 BB 25 9 A C 7 22 C 6 68 E 3 75 B 7 A 3 83 01 3 C 64 H» %šÇ"Æhãu·£ƒ. <d 0120 h: BC 1 C FC 9 B FB C 7 D 7 0 A 89 2 C 43 45 52 54 00 00 ¼. ü›ûÇ×. ‰, CERT. .
脆弱性検証のクラウドソーシング • ちょうどこの頃、Reconカンファレンスに出展しようとして いた – Reconでコンテストを出すことを考え – クラウドソースの脆弱性検証をしてみることになった • 我々が見つけたShockwaveのバグから10個選んだ – … そしてカンファレンス参加者に配布した – これらの脆弱性を最も悪用できた人に$2500 USDが与えられた – – TPTI-10 -12 - Adobe Shockwave Text. Xtra Allocator Integer Overflow Remote Code Execution Vulnerability TPTI-10 -11 - Adobe Shockwave t. SAC Chunk Pointer Offset Memory Corruption Remote Code Execution Vulnerability TPTI-10 -10 - Adobe Shockwave t. SAC Chunk Invalid Seek Memory Corruption Remote Code Execution Vulnerability TPTI-10 -09 - Adobe Shockwave CSWV Chunk Memory Corruption Remote Code Execution Vulnerability
インジェクション + ファジング = 勝利(続き) • MSDNより: typedef struct _EXCEPTION_RECORD { DWORD Exception. Code; DWORD Exception. Flags; struct _EXCEPTION_RECORD *Exception. Record; PVOID Exception. Address; DWORD Number. Parameters; ULONG_PTR Exception. Information[EXCEPTION_MAXIMUM_PARAMETERS]; } EXCEPTION_RECORD, *PEXCEPTION_RECORD; • もし意図する範囲のアドレスが読み込まれたら… – Virtual. Allocの呼び出しを挿入し、バッファをインラインでmemsetす る – その後、何事もなかったかのようにプロセスに実行を返す – これによりかなりの数の読み込み違反を見つけることができた – この違反は悪用可能な脆弱性の存在を示している
DIRファイルのファジング • 4000ものクラッシュの解析には時間がかかる – 推定: 最初のゼロデイのバグには 4日、全部で 44年かかる – はい。これはちょっと大げさかな • ありがたいことに、Loganのcrash binningによって解析の 目途がついた – 明確に悪用可能なバグをリバースすることに成功 – そして以下を公表した: – – – – TPTI-10 -13 - Adobe Shockwave Director t. SAC Chunk Remote Code Execution Vulnerability TPTI-10 -14 - Adobe Shockwave Director rcs. L Chunk Pointer Offset Remote Code Execution Vulnerability TPTI-10 -15 - Adobe Shockwave Director mmap Trusted Chunk Size Remote Code Execution Vulnerability TPTI-11 -01 - Adobe Shockwave dirapi. dll IFWV Trusted Offset Remote Code Execution Vulnerability TPTI-11 -02 - Adobe Shockwave Text. Xtra Invalid Seek Remote Code Execution Vulnerability TPTI-11 -03 - Adobe Shockwave Font Xtra String Decoding Remote Code Execution Vulnerability TPTI-11 -05 - Adobe Shockwave PFR 1 Font Chunk Parsing Remote Code Execution Vulnerability
Shockwave メモリマネージャ再考 Breakpoint 0 hit eax=0000 ebx=0000 ecx=0000 edx=00004008 esi=00004008 edi=7 c 80 fdcd eip=7 c 80 fdcd esp=025 dd 470 ebp=00004000 iopl=0 nv up ei pl zr na pe nc cs=001 b ss=0023 ds=0023 es=0023 fs=003 b gs=0000 efl=00000246 kernel 32!Global. Alloc: 7 c 80 fdcd 6 a 1 c push 1 Ch 0: 008> kv Child. EBP Ret. Addr Args to Child 025 dd 46 c 690148 aa 00000030 00004008 kernel 32!Global. Alloc 025 dd 480 69009071 00004008 00000001 00009100 IML 32!Ordinal 1218+0 x 2 a 025 dd 49 c 690804 e 0 00004000 00009100 00000001 IML 32!Ordinal 9233+0 x 9071 00000000 0000 IML 32!Ordinal 2064+0 x 64 d 0 0: 008> dd @esp L 14 025 dd 470 690148 aa 00000030 00004008 025 dd 480 00000001 69009071 00004008 00000001 025 dd 490 00009100 00008000 0000 025 dd 4 a 0 690804 e 0 00004000 00009100 00000001 025 dd 4 b 0 00000000 6900966 f 0: 008> ub 6900966 f L 3 IML 32!Ordinal 1135+0 x 287: 69009667 52 push edx 69009668 6 a 20 push 20 h 6900966 a e 8 f 16 f 0700 call IML 32!Ordinal 2064+0 x 6650 (69080660)
Shockwave メモリマネージャ再考 Breakpoint 0 hit eax=0000 ebx=0000 ecx=0000 edx=00004008 esi=00004008 edi=7 c 80 fdcd eip=7 c 80 fdcd esp=025 dd 470 ebp=00004000 iopl=0 nv up ei pl zr na pe nc cs=001 b ss=0023 ds=0023 es=0023 fs=003 b gs=0000 efl=00000246 kernel 32!Global. Alloc: 7 c 80 fdcd 6 a 1 c push 1 Ch 0: 008> kv Child. EBP Ret. Addr Args to Child 025 dd 46 c 690148 aa 00000030 00004008 kernel 32!Global. Alloc @ebp fail 025 dd 480 69009071 00004008 00000001 00009100 IML 32!Ordinal 1218+0 x 2 a 025 dd 49 c 690804 e 0 00004000 00009100 00000001 IML 32!Ordinal 9233+0 x 9071 00000000 0000 IML 32!Ordinal 2064+0 x 64 d 0 0: 008> dd @esp L 14 025 dd 470 690148 aa 00000030 00004008 025 dd 480 00000001 69009071 00004008 00000001 025 dd 490 00009100 00008000 0000 025 dd 4 a 0 690804 e 0 00004000 00009100 00000001 025 dd 4 b 0 00000000 6900966 f 0: 008> ub 6900966 f L 3 IML 32!Ordinal 1135+0 x 287: 69009667 52 push edx 69009668 6 a 20 push 20 h 6900966 a e 8 f 16 f 0700 call IML 32!Ordinal 2064+0 x 6650 (69080660)
Py. Dbg. Ext(続き) 0: 008> !load pydbgext 0: 008> !help Help for pydbgext. dll [Environment] Extension Image Python Version : 0. 1. 0. 48 : 2. 6. 6 rc 1 [Usage] eval import from print exec help py : Evaluate a python expression : Import a python module : Import a list of symbols from a python module : Evaluate and then print a python expression : Execute a python script : Shows this help : Evaluate a python expression
アロケータのデバッグ • 序数 1111の関数は、常に既存の構造体のポインタを返して いる – その要素を更新している 001 ee 218 001 ee 204 baadf 00 d < 未アロケート 001 ee 22 c 001 ee 218 baadf 00 d < 未アロケート 001 ee 240 001 ee 22 c baadf 00 d. . . 001 ee 254 001 ee 240 baadf 00 d 001 ee 268 001 ee 254 baadf 00 d 001 ee 27 c 001 ee 268 baadf 00 d 001 ee 290 001 ee 27 c baadf 00 d 001 ee 2 a 4 001 ee 290 baadf 00 d. . . 001 ee 2 b 8 001 ee 2 a 4 baadf 00 d < 未アロケート 001 ee 2 cc 045 cffe 0 00000030 baad 0001 baadf 001 < アロケート済み 001 ee 2 e 0 abababab 00002774 0000 080403 a 2 001 ee 2 f 4 00 ee 14 ee 00150178 00163018 feeefeee
アロケータのデバッグ • 序数 1111の関数は、常に既存の構造体のポインタを返して いる – その要素を更新している 001 ee 218 001 ee 204 baadf 00 d < 未アロケート 001 ee 22 c 001 ee 218 baadf 00 d < 未アロケート 001 ee 240 001 ee 22 c baadf 00 d. . . 001 ee 254 001 ee 240 baadf 00 d 001 ee 268 001 ee 254 baadf 00 d 001 ee 27 c 001 ee 268 baadf 00 d 001 ee 290 001 ee 27 c baadf 00 d 001 ee 2 a 4 001 ee 290 baadf 00 d. . . 001 ee 2 b 8 001 ee 2 a 4 baadf 00 d < 未アロケート 001 ee 2 cc 045 cffe 0 00000030 baad 0001 baadf 001 < アロケート済み 001 ee 2 e 0 abababab 00002774 0000 080403 a 2 001 ee 2 f 4 00 ee 14 ee 00150178 00163018 feeefeee 序数 1111の関数が返すポインタ
アロケータのデバッグ • 序数 1111の関数は、常に既存の構造体のポインタを返して いる – その要素を更新している 001 ee 218 001 ee 204 baadf 00 d < 未アロケート 001 ee 22 c 001 ee 218 baadf 00 d < 未アロケート 001 ee 240 001 ee 22 c baadf 00 d. . . 001 ee 254 001 ee 240 baadf 00 d 001 ee 268 001 ee 254 baadf 00 d 001 ee 27 c 001 ee 268 baadf 00 d 001 ee 290 001 ee 27 c baadf 00 d 001 ee 2 a 4 001 ee 290 baadf 00 d. . . 001 ee 2 b 8 001 ee 2 a 4 baadf 00 d < 未アロケート 001 ee 2 cc 045 cffe 0 00000030 baad 0001 baadf 001 < アロケート済み 001 ee 2 e 0 abababab 00002774 0000 080403 a 2 001 ee 2 f 4 00 ee 14 ee 00150178 00163018 feeefeee アロケートされたバッファのポインタ
Smart. Heap向けの !heap を実装 • ハンドルテーブルの横断は有益 – Smart. Heap向けの !heap の実装の最初の一歩 – 具体的には, !heap –a <アドレス> – “指定アドレスを含んでいるチャンクの検索” 0: 008> !exec S: researchsmartheapsheap. py –a 0 x 043 d 0529 [*] Handle table starts at 0 x 001 eb 140 [*] Handle table ends at 0 x 001 ef 0 dc [*] Searching for chunk containing address 0 x 043 d 0529. . . [*] Found address inside handle table entry at 0 x 001 ef 0 f 0 <class '__main__. Handle. Entry'> [1 ef 0 f 0] (Handle. Entry)'> prev '(x 05=x 04' [1 ef 0 f 4] size 'x 04x 08x 00' [1 ef 0 f 8] alloc_flag 'x 01x 00xadxba' [1 ef 0 fc] flag 1 'x 00xf 0xadxba' [1 ef 100] flag 2 'x 00xf 0xadxba'
ユーザーモードのスタックトレースDB(続き) 0: 008> !exec S: researchsmartheapsheap. py –p –a 0 x 04560529 [*] Handle table starts at 0 x 001 ed 038 [*] Handle table's last free entry at 0 x 001 f 0 fd 4 [*] Searching for chunk containing address 0 x 04560529. . . [*] Found address inside handle table entry at 0 x 001 f 0 fe 8 [*] Searching for stack trace for allocation at 0 x 04560528 [*] Found call stack for allocation starting at 0 x 04560528: 0 x 6900 a 295 0 x 6901 b 4 b 0 0 x 690 aa 518 0 x 6901 b 54 e 0 x 69000000 0 x 69019 ab 9 0 x 69000000 0 x 0000
コールスタックの再構築(続き) • 完全なコールスタックであっても、情報が欠落 – 未知のシンボルが多すぎる 0: 010> k Child. EBP Ret. Addr 025 dd 8 a 4 69010 c 03 IML 32!Ordinal 1218+0 x 230 025 dd 8 bc 68091520 IML 32!Ordinal 1130+0 x 13 025 dd 8 ec 69009 f 30 DIRAPI!Ordinal 418+0 x 49450 025 dd 8 f 8 6800 c 492 IML 32!Ordinal 1113+0 x 20 025 dd 900 680 dac 1 a DIRAPI!Ordinal 967+0 xc 2 025 dd 908 680 fecc 1 DIRAPI!Ordinal 418+0 x 92 b 4 a 025 dd 924 6811459 e DIRAPI!Ordinal 418+0 xb 6 bf 1 025 dd 948 68114 d 55 DIRAPI!Ordinal 418+0 xcc 4 ce 00000000 DIRAPI!Ordinal 418+0 xccc 85
Turbo. Diff
関数の特徴(続き) • 最初のステップ – 最も大きな“手ごたえ”は、既知のlibc関数の呼び出しにあった – これで前述の特徴を用いて先に進むことができる • 成功! – – – – – im. Mem. Handle. New im. Mem. Handle. Lock/Unlock im. Mem. Handle. Get. Size im. Buffer. New im. Mem. Copy im. Stream. Read Mem. Pool. Init. FS Mem. Pool. Set. Block. Size. FS Mem. Pool. Pre. Allocate. Handles …
Smart. Heapの解析に戻って(続き) • Heap. Agentはヘッダーファイルを含んでいる – いくつかの有用なデータを発見(デバッグに利用できる) /* Flags passed to Mem. Pool. Init, Mem. Pool. Init. FS */ #define MEM_POOL_SHARED 0 x 0001 u /* == TRUE for SH 1. 5 compatibility */ #define MEM_POOL_SERIALIZE 0 x 0002 u /* pool used in more than one thread */ #define MEM_POOL_VIRTUAL_LOCK 0 x 0004 u /* pool is locked in physical memory */ #define MEM_POOL_ZEROINIT 0 x 0008 u /* malloc/new from pool zero inits */ #define MEM_POOL_REGION 0 x 0010 u /* store pool in user supplied region*/ #define MEM_POOL_FILEMAPPING 0 x 0020 u /* pool in user supplied file mapping*/ #define MEM_POOL_DEFAULT 0 x 8000 u /* pool with default characteristics */
Smart. Heapの攻略(続き) Error MEM_ALLOC_ZERO MEM_BAD_BLOCK MEM_BAD_FREE_BLOCK MEM_BAD_BUFFER MEM_BAD_FLAGS MEM_BAD_HANDLE MEM_BAD_POINTER MEM_BAD_MEM_POOL MEM_BLOCK_TOO_BIG MEM_DOUBLE_FREE MEM_EXCEEDED_CEILING MEM_EXCEEDED_PROCESS_LIMIT MEM_FREE_BLOCK_READ MEM_FREE_BLOCK_WRITE MEM_INTERNAL_ERROR MEM_LEAKAGE MEM_LOCK_ERROR MEM_OUT_OF_BOUNDS_READ MEM_OVERWRITE MEM_UNDERWRITE MEM_NOFREE MEM_NOREALLOC MEM_NOT_FIXED_SIZE MEM_OUT_OF_MEMORY MEM_READONLY_MODIFIED MEM_RESIZE_FAILED MEM_UNINITIALIZED_READ MEM_UNINITIALIZED_WRITE … Debug Release • • • • • • •
Questions? aaron. portnoy logan. p. brown @ hp. com
- Slides: 119