#######################################################################

                             Luigi Auriemma

Application:  GenStat
              http://www.vsni.co.uk/software/genstat/
Versions:     <= 14.1.0.5943
Platforms:    Windows
Bugs:         A] array overflow with write2
              B] heap overflow
Exploitation: file
Date:         01 Oct 2011
Author:       Luigi Auriemma
              e-mail: aluigi@autistici.org
              web:    aluigi.org


#######################################################################


1) Introduction
2) Bugs
3) The Code
4) Fix


#######################################################################

===============
1) Introduction
===============


From vendor's homepage:
"all embracing data analysis tool, offering ease of use via our
comprehensive menu system reinforced with the flexibility of a
sophisticated programming language."
"For over 30 years we have employed, and continue to work with, leading
statisticians and scientists who help to create a package that succeeds
for both novice and expert users in academia, research and industry."


#######################################################################

=======
2) Bugs
=======

-----------------------------
A] array overflow with write2
-----------------------------

Array overflow during the handling of the GWB (GenStat book) files with
possibility of placing a NULL word in an arbitrary memory location:

  00630399  |> 8B46 24        MOV EAX,DWORD PTR DS:[ESI+24] ; EAX controlled
  0063039C  |. 8B4E 08        MOV ECX,DWORD PTR DS:[ESI+8]
  0063039F  |. 8D0481         LEA EAX,DWORD PTR DS:[ECX+EAX*4]
  006303A2  |. 3938           CMP DWORD PTR DS:[EAX],EDI
  006303A4  |. 74 12          JE SHORT GenStat.006303B8
  006303A6  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
  006303A8  |. 05 A4040000    ADD EAX,4A4
  006303AD  |. 0FB708         MOVZX ECX,WORD PTR DS:[EAX]
  006303B0  |. 894D FC        MOV DWORD PTR SS:[EBP-4],ECX
  006303B3  |. 33C9           XOR ECX,ECX
  006303B5  |. 66:8908        MOV WORD PTR DS:[EAX],CX      ; write2


----------------
B] heap overflow
----------------

Through the text strings in the final part of the GSH (GenStat
SpreadSheet) files it's possible to cause a heap overflow with
consequent freeing of arbitrary memory (write4):

  0064D1C7  |> 3BBE 78040000 /CMP EDI,DWORD PTR DS:[ESI+478]
  0064D1CD  |. 7F 74         |JG SHORT GenStat.0064D243
  0064D1CF  |. FF75 08       |PUSH DWORD PTR SS:[EBP+8]
  0064D1D2  |. 8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
  0064D1D5  |. 6A 01         |PUSH 1
  0064D1D7  |. 6A 04         |PUSH 4
  0064D1D9  |. 50            |PUSH EAX
  0064D1DA  |. E8 2F3B2600   |CALL GenStat.008B0D0E             ; read 32bit
  0064D1DF  |. 83C4 10       |ADD ESP,10
  0064D1E2  |. 85C0          |TEST EAX,EAX
  0064D1E4  |.^0F84 06FFFFFF |JE GenStat.0064D0F0
  0064D1EA  |. 66:837D 0C 00 |CMP WORD PTR SS:[EBP+C],0
  0064D1EF  |. 74 0A         |JE SHORT GenStat.0064D1FB
  0064D1F1  |. 8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
  0064D1F4  |. 50            |PUSH EAX
  0064D1F5  |. E8 DD6AFFFF   |CALL GenStat.00643CD7
  0064D1FA  |. 59            |POP ECX
  0064D1FB  |> 837D F4 00    |CMP DWORD PTR SS:[EBP-C],0
  0064D1FF  |. 7E 1E         |JLE SHORT GenStat.0064D21F        ; I use the first one equal to -1
  0064D201  |. FF75 08       |PUSH DWORD PTR SS:[EBP+8]
  0064D204  |. 8B46 58       |MOV EAX,DWORD PTR DS:[ESI+58]
  0064D207  |. 6A 01         |PUSH 1
  0064D209  |. FF75 F4       |PUSH DWORD PTR SS:[EBP-C]         ; 0x61616161
  0064D20C  |. 03C7          |ADD EAX,EDI
  0064D20E  |. 50            |PUSH EAX
  0064D20F  |. E8 FA3A2600   |CALL GenStat.008B0D0E             ; overflow/corruption
  0064D214  |. 83C4 10       |ADD ESP,10
  0064D217  |. 85C0          |TEST EAX,EAX
  0064D219  |.^0F84 D1FEFFFF |JE GenStat.0064D0F0
  0064D21F  |> FF86 74040000 |INC DWORD PTR DS:[ESI+474]
  0064D225  |. 8B45 F4       |MOV EAX,DWORD PTR SS:[EBP-C]
  0064D228  |. 43            |INC EBX
  0064D229  |. 3B5D F8       |CMP EBX,DWORD PTR SS:[EBP-8]
  0064D22C  |. 8D7C07 01     |LEA EDI,DWORD PTR DS:[EDI+EAX+1]  ; 0 + -1 + 1 = 0
  0064D230  |.^7C 95         \JL SHORT GenStat.0064D1C7


#######################################################################

===========
3) The Code
===========


http://aluigi.org/poc/genstat_1.zip
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/17931.zip

A] modified 32bit field at offset 0x46
B] modified 32bit field at offset 0x302 and added 'a's


#######################################################################

======
4) Fix
======


No fix.


#######################################################################