Source: http://aluigi.org/adv/msreader_1-adv.txt
#######################################################################
Luigi Auriemma
Application: Microsoft Reader
http://www.microsoft.com/reader
Versions: <= 2.1.1.3143 (PC version)
the Origami 2.6.1.7169 version doesn't seem vulnerable
the non-PC versions have not been tested
Platforms: Windows, Windows Mobile, Tablet PC and UMPC devices
Bug: integer overflow
Date: 11 Apr 2011
Author: Luigi Auriemma
e-mail: aluigi@autistici.org
web: aluigi.org
#######################################################################
1) Introduction
2) Bug
3) The Code
4) Fix
#######################################################################
===============
1) Introduction
===============
Microsoft Reader is a software needed to read and catalog the ebooks in
LIT format and the Audible audio books bought via internet, indeed the
homepage acts also as online store for these protected contents.
#######################################################################
======
2) Bug
======
The software is affected by an integer overflow just during the
handling of the number of pieces of the initial ITLS header at offset
0x10:
0108306E |> 8B7B 68 MOV EDI,DWORD PTR DS:[EBX+68]
01083071 >|. 8BF7 MOV ESI,EDI
01083073 |. C1E6 04 SHL ESI,4
01083076 |. 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
0108307A |. 7C 78 JL SHORT MSReader.010830F4
0108307C |. 8BC7 MOV EAX,EDI
0108307E |. C1E0 04 SHL EAX,4
01083081 |. 50 PUSH EAX
01083082 |. E8 A1870000 CALL MSReader.0108B828 ; LocalAlloc
01083087 |. 85C0 TEST EAX,EAX
01083089 |. 59 POP ECX
0108308A |. 74 06 JE SHORT MSReader.01083092
0108308C |. 4F DEC EDI
0108308D |. 897D 08 MOV DWORD PTR SS:[EBP+8],EDI
01083090 |. EB 02 JMP SHORT MSReader.01083094
01083092 |> 33C0 XOR EAX,EAX
01083094 |> 8943 44 MOV DWORD PTR DS:[EBX+44],EAX
01083097 |. 8B43 68 MOV EAX,DWORD PTR DS:[EBX+68]
0108309A |. C1E0 02 SHL EAX,2
0108309D |. 50 PUSH EAX
0108309E |. E8 85870000 CALL MSReader.0108B828 ; LocalAlloc
010830A3 |. 837B 44 00 CMP DWORD PTR DS:[EBX+44],0
010830A7 |. 59 POP ECX
010830A8 |. 8943 48 MOV DWORD PTR DS:[EBX+48],EAX
010830AB |. 74 40 JE SHORT MSReader.010830ED
010830AD |. 85C0 TEST EAX,EAX
010830AF |. 74 3C JE SHORT MSReader.010830ED
010830B1 |. 8B4B 68 MOV ECX,DWORD PTR DS:[EBX+68]
010830B4 |. C1E1 02 SHL ECX,2
010830B7 |. 51 PUSH ECX
010830B8 |. 6A 00 PUSH 0
010830BA |. 50 PUSH EAX
010830BB |. E8 0D6DFEFF CALL MSReader.01069DCD ; memset
010830C0 |. 6A 28 PUSH 28
010830C2 |. 8B43 3C MOV EAX,DWORD PTR DS:[EBX+3C]
010830C5 |. 59 POP ECX
010830C6 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
010830C9 |. 8B38 MOV EDI,DWORD PTR DS:[EAX]
010830CB |. 52 PUSH EDX
010830CC |. 56 PUSH ESI
010830CD |. 33D2 XOR EDX,EDX
010830CF |. FF73 44 PUSH DWORD PTR DS:[EBX+44]
010830D2 |. 52 PUSH EDX
010830D3 |. 51 PUSH ECX
010830D4 |. 50 PUSH EAX
010830D5 |. FF57 0C CALL DWORD PTR DS:[EDI+C] ; ReadFile
...
01082CD8 >|. 8B5E 68 MOV EBX,DWORD PTR DS:[ESI+68]
01082CDB |> 8BC3 /MOV EAX,EBX
01082CDD |. 4B |DEC EBX
01082CDE |. 85C0 |TEST EAX,EAX
01082CE0 |. 74 1C |JE SHORT MSReader.01082CFE
01082CE2 |. 8B46 48 |MOV EAX,DWORD PTR DS:[ESI+48]
01082CE5 |. 8B3C98 |MOV EDI,DWORD PTR DS:[EAX+EBX*4]
01082CE8 |. 3BFD |CMP EDI,EBP
01082CEA |.^74 EF |JE SHORT MSReader.01082CDB
01082CEC |> 8B07 |/MOV EAX,DWORD PTR DS:[EDI]
01082CEE |. 57 ||PUSH EDI
01082CEF |. FF50 08 ||CALL DWORD PTR DS:[EAX+8] ; exploitation
...
010832D0 |> 8B4E 48 MOV ECX,DWORD PTR DS:[ESI+48]
010832D3 |. 8BD8 MOV EBX,EAX
010832D5 |. C1E3 02 SHL EBX,2
010832D8 |. 8B3C19 MOV EDI,DWORD PTR DS:[ECX+EBX]
010832DB |. 85FF TEST EDI,EDI
010832DD |. 74 0F JE SHORT MSReader.010832EE
010832DF |. 8B07 MOV EAX,DWORD PTR DS:[EDI]
010832E1 |. 57 PUSH EDI
010832E2 |. FF50 04 CALL DWORD PTR DS:[EAX+4] ; exploitation
For exploiting the vulnerability there are some things to consider.
Exists a minimal heap spray that can be performed on the memory because
the pieces (the number involved in the integer overflow) or the
secondary data block with the size specified at offset 0x14 get loaded
correctly.
So it's necessary to tune the exploit for having a chance of EAX (or
another register, because there is also another location for the
exploitation) pointing to our code.
I have provided two examples written from scratch that show the usage
of the first (number of pieces) and second field (0200000098000000...)
for loading data.
This simple technique can be used as help also for exploiting the other
vulnerabilities reported in this software.
#######################################################################
===========
3) The Code
===========
http://aluigi.org/poc/msreader_1.zip
https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/17160.zip
#######################################################################
======
4) Fix
======
No fix.
#######################################################################