c-查找堆栈缓冲区溢出



我已经阅读了关于堆栈缓冲区溢出和堆溢出的5篇论文/文章和2段视频。我写了一个易受攻击的程序,溢出并利用了它,在7777端口上运行了一台易受攻击、溢出并利用它的服务器。但我不明白的是如何在Windows(或其他操作系统)或软件中发现漏洞。我使用gcc和gdb进行调试,以找到编写该漏洞所需的一切。如何在其他程序/软件上发现堆栈缓冲区溢出漏洞,如何调试有漏洞的程序或使用gdb?

查找堆栈缓冲区溢出有两种主要方法:

黑盒测试测试应用程序堆栈溢出漏洞的关键是提供与预期相比过大的输入数据。然而,将应用程序置于任意大的数据之下是不够的。有必要检查应用程序的执行流和响应,以确定是否实际触发了溢出。因此,定位和验证堆栈溢出所需的步骤将是将调试器附加到目标应用程序或进程,为应用程序生成格式错误的输入,使应用程序受到格式错误输入的影响,以及在调试器中检查响应。调试器允许测试人员在漏洞触发时查看执行流和寄存器的状态

灰盒测试手动检查代码(反汇编)。在检查代码是否存在堆栈溢出时,建议搜索对不安全库函数的调用,如gets()、strcpy()、trcat()等,这些函数不验证源字符串的长度,并盲目地将数据复制到固定大小的缓冲区中。除了手动检查代码是否存在堆栈溢出外,静态代码分析工具也可以提供很大帮助。尽管它们往往会产生很多误报,并且几乎无法定位一小部分缺陷,但它们肯定有助于减少与发现低挂果实相关的开销,如strcpy()和sprintf()错误。RATS、Flawfinder和ITS4等多种工具可用于分析C风格语言。

用于这些测试的最佳工具是:OllyDbg和IDA Pro(用于静态和动态调试)。