繁体   English   中英

Notesearch利用异常(黑客:剥削艺术)

[英]The Notesearch Exploit anomalies (Hacking: Art of Exploitation)

这个问题是关于“黑客:剥削艺术”第二版第121页上的程序笔记研究的漏洞利用。

在漏洞利用中有一些我不理解的东西:

当系统执行./notesearch'xyz ....'时,参数'xyz ...'溢出子程序中的字符串缓冲区,从而覆盖返回地址....这很清楚。

这里的假设是notesearch程序的堆栈帧位于调用exploit的Stack帧之上。 当编译版本存在于同一系统上时,这也适用。

我的第一个问题是1.这是否会像远程黑客一样工作?

我的第二个问题是2.由于缓冲区已用于覆盖包括返回地址在内的所有变量,因此notesearch程序如何按预期工作? 像“打印”等变量位于这个堆栈框架中并决定是否打印消息似乎都能正常工作。 即使调用函数位于相关堆栈帧的顶部,其中正在被泛洪的字符串缓冲区位于其中,也存在某些将被覆盖的关键变量。

问题没有。 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

你写了:

这里的假设是notesearch程序的堆栈帧位于调用exploit的Stack帧之上。

不,那是错的。 这里只有一个堆栈框架相关: notesearch main()函数的堆栈框架。 我们调用的事实./notesearch xyz...通过一个system()内调用exploit_notesearch是无关紧要的; 我们也可以直接在bash命令行上调用./notesearch xyz... ,或者欺骗其他一些进程(例如,你知道, bash )代表我们执行它。

  1. 即使是远程黑客,这还能工作吗?

当然。

  1. 由于缓冲区已被用于覆盖包括返回地址在内的所有变量,因此notesearch程序如何按预期工作?

嗯,它并没有真正按预期工作。 再看一下输出:

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#

明确给你一个壳不算“按预期工作”。 但即便在此之前,该程序声称在/var/notes找到了用户ID 999的/var/notes ,这可能表明它有点混乱。 在我们作为恶意黑客的角色中,我们并不关心来自notesearch程序的垃圾输出; 我们关心的是它最终到达main()的末尾并返回我们的shellcode,让我们可以访问shell。

但是,如果您想知道我们如何设法覆盖返回地址而不覆盖本地变量useridprintingfd ,那么至少有三种显而易见的可能性:

searchstring 可能这些变量是在堆栈上的searchstring下面分配的。

B.也许这些变量是在寄存器中而不是在堆栈中分配的。

C.很大可能,这些变量覆盖,但其初始值根本无关紧要的程序。 例如, userid可以获取任何值,因为该垃圾值将立即被下一行的getuid()覆盖。 初始值很重要的唯一变量是printing 甚至printing只有在碰巧得到值0时才改变程序的行为 - 它不能得到值0 ,因为我们复制的数据完全由非零字节组成。

我想你真的不明白什么是缓冲区溢出。 该searchstring变量最初位于堆栈上100个字节。 现在,您将一大块缓冲区复制到searchstring中,而不检查它的长度。 因此缓冲区溢出到notesearch主函数的堆栈帧的其他部分。 返回地址也会被覆盖。 这就是它的工作原理。

我认为这里最重要的假设是notesearch堆栈类似于 exploit_notesearch 这就是为什么他使用exploit_notesearch局部变量(unsigned int i)来计算ret 他假设(当然,知道notesearch的源代码),当两个程序都加载到内存中时,它们将具有相似的帧地址(大约为0xffff7 ..)当然,2个程序不共享内存,它们是不同的进程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM