这个问题是关于《黑客:剥削的艺术》第二版第121页上的程序notesearch的利用。
漏洞利用中有些我不明白的地方:
这里的假设是notesearch程序的堆栈框架位于调用漏洞利用程序的堆栈框架之上。当编译版本存在于同一系统上时,这适用。
我的第一个问题是1.即使作为远程hack,这也可以工作吗?
我的第二个问题是
2.由于缓冲区已用于覆盖所有变量,包括返回地址以外的所有变量,因此notesearch程序如何按预期工作?
诸如“printing”之类的变量位于此堆栈框架中,并决定是否打印消息,所有这些似乎都工作正常。
即使调用函数位于相关堆栈帧的顶部(正在泛洪的字符串缓冲区位于该堆栈帧的顶部),但某些关键变量会被覆盖。
问题编号3。
假定String缓冲区是在执行notesearch开始后插入的新堆栈帧的一部分,则该缓冲区将覆盖该notesearch程序中的所有给定变量。缓冲区也是搜索字符串的值。根据程序逻辑,由于搜索字符串与消息不匹配,因此程序不应输出用户消息的详细信息。在这种情况下,将显示消息。我想知道为什么吗?
最佳答案
(供引用:这本书是http://www.tinker.tv/download/hacking2_sample.pdf,可从http://www.nostarch.com/hacking2.htm免费下载该代码。)
继续看书;第122页给出了另一个示例,然后有很多说明性文字,全面介绍了该漏洞利用程序。
这是notesearch
的代码的相关部分:
int main(int argc, char *argv[]) {
int userid, printing=1, fd; // file descriptor
char searchstring[100];
if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]); // that is the search string
else // otherwise
searchstring[0] = 0; // search string is empty
userid = getuid();
fd = open(FILENAME, O_RDONLY); // open the file for read-only access
你写了:
不,那是错的。这里只有一个相关的堆栈框架:
main()
中的notesearch
函数的堆栈框架。我们通过./notesearch xyz...
内部的system()
调用来调用exploit_notesearch
的事实是无关紧要的。我们也可以直接在bash命令行上调用./notesearch xyz...
,或者欺骗其他一些进程(例如bash)代表我们执行它。当然。
好吧,它实际上并没有按预期工作。再次查看输出:
reader@hacking:~/booksrc $ gcc exploit_notesearch.c
reader@hacking:~/booksrc $ ./a.out
[DEBUG] found a 34 byte note for user id 999
[DEBUG] found a 41 byte note for user id 999
-------[ end of note data ]-------
sh-3.2#
给您一个 shell 显然不算作“按预期工作”。但即使在此之前,该程序仍声称在
/var/notes
中为用户ID 999找到注释,这可能表明它有点困惑。作为恶意黑客,我们不在乎关于notesearch程序的垃圾输出的信息;我们只关心它最终到达main()
的末尾并返回到我们的shellcode,从而使我们能够访问shell。但是,如果您想知道我们如何在不覆盖局部变量
userid
,printing
和fd
的情况下覆盖返回地址,则至少有三种明显的可能性:A. 也许这些变量分配在堆栈上的
searchstring
下面。B. 也许这些变量是在寄存器中分配的,而不是在堆栈中分配的。
C. 绝大多数情况下,这些变量被覆盖,但是它们的初始值与程序无关紧要。例如,
userid
可以获取任何值,因为该垃圾值将立即在下一行被getuid()
覆盖。唯一的初始值重要的变量是printing
。甚至printing
仅在碰巧获得值0
时也改变了程序的行为,而它也无法获得值0
,因为根据设计,我们要复制的数据完全由非零字节组成。关于c - Notesearch漏洞利用异常(Hacking : Art of Exploitation),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21074333/