查找堆栈缓冲区溢出

Finding stack buffer overflows

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

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

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

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

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