我被要求维护一个充满内存泄漏的大型C++代码库.在探索时,我发现我们有很多缓冲区溢出导致泄漏(它如何变坏,我不想知道).
我决定先删除缓冲区溢出.为了使我的bug更容易找到,可以使用哪些工具来检查缓冲区溢出?
我被要求维护一个充满内存泄漏的大型C++代码库.在探索时,我发现我们有很多缓冲区溢出导致泄漏(它如何变坏,我不想知道).
我决定先从危险函数开始删除缓冲区溢出.哪些C/C++函数最常使用不正确并可能导致缓冲区溢出?
对于用于帮助查找缓冲区溢出的编译器和/或工具,我创建了另一个处理此问题的问题
完全托管的asp.net Web门户网站中是否存在缓冲区溢出/溢出漏洞.如果可以,则可以对其进行测试.
如果您是使用C或C++编程的人,没有内存管理的托管语言优势,类型检查或缓冲区溢出保护,使用指针算法,您如何确保您的程序是安全的?您是否使用了大量的单元测试,或者您只是一个谨慎的编码器?你有其他方法吗?
我刚发现有一个STATUS_STACK_BUFFER_OVERRUN和一个STATUS_STACK_OVERFLOW.那两个有什么区别?我刚刚发现堆栈溢出(堆栈耗尽)与堆栈缓冲区溢出不同,但要么它没有解释它,要么我不理解它.你能帮我吗?
关心托比亚斯
来自stackalloc的C#参考:
stackalloc的使用自动启用公共语言运行库(CLR)中的缓冲区溢出检测功能.如果检测到缓冲区溢出,则会尽快终止该过程,以最大程度地降低恶意代码执行的可能性.
具体来说,为.NET实现了什么样的保护机制?
它还会检测缓冲区欠载吗?对已知攻击的保护力较弱?
对于上下文,例如对于MS C++编译器,此处提供了以下信息:
Windows ISV软件安全防御:
堆栈缓冲区溢出检测功能已引入Visual Studio .NET 2002中的C/C++编译器,并在后续版本中进行了更新./ GS是一个编译器开关,指示编译器添加启动代码,函数epilog和prolog代码,以生成和检查放置在函数堆栈中的随机数.
请注意,Visual C++ 2005(及更高版本)也会重新排序堆栈上的数据,以便更难以预测地破坏该数据.示例包括:
•将缓冲区移动到比非缓冲区更高的内存.此步骤可以帮助保护驻留在堆栈上的函数指针.
•在运行时将指针和缓冲区参数移动到较低的内存,以缓解各种缓冲区溢出攻击.
我只有一行代码,这是:
pcrecpp::RE re("abc");
Run Code Online (Sandbox Code Playgroud)
在一个函数内部OnBnClickedButtonGo().此功能在发布模式下失败,但在调试模式下可以正常工作.
(我在Windows XP上使用Visual Studio 8.)
错误消息是:
A buffer overrun has occurred in testregex.exe which has corrupted the program's
internal state. Press Break to debug the program or Continue to terminate
the program.
For more details please see Help topic 'How to debug Buffer Overrun Issues'.
Run Code Online (Sandbox Code Playgroud)
我怀疑它是它的析构函数,它是隐形的和隐含的......但我真的不知道.
PS:我静态链接到PCRE lib版本7.8.PS2:不太相关,但可以帮助一些链接到PCRE库的人(我花了几个小时来解决它):包括该行#define PCRE_STATIC.
来自man gets:
永远不要使用gets().因为在不事先知道数据的情况下无法判断get()将读取多少个字符,并且因为gets()将继续存储超出缓冲区末尾的字符,所以使用它是非常危险的.它已被用来打破计算机安全.请改用fgets().
几乎无处不在我看到scanf的应该有同样的问题(一个方式使用缓冲区溢出/缓冲区溢出)scanf("%s",string).这种情况存在这个问题吗?为什么scanf手册页中没有关于它的引用?为什么gcc在编译时不会发出警告-Wall?
ps:我知道有一种方法可以在格式字符串中指定字符串的最大长度scanf:
char str[10];
scanf("%9s",str);
Run Code Online (Sandbox Code Playgroud)
编辑:我不是要求确定前面的代码是否正确.我的问题是:如果scanf("%s",string)总是错的,为什么没有警告,手册页中没有任何关于它的内容?
我们有一些 C 代码偶尔会抛出STATUS_STACK_BUFFER_OVERRUN错误 ( )。0xC0000409我可以使用下面的 C 代码重现该错误。我在 Windows 7 上使用 Visual Studio 2013 Update 4,并使用/EHa和/GS标志进行编译。但是,我无法以编程方式捕获错误。代码永远不会进入我的__except块;相反,Visual Studio 会弹出几个对话框,通知我堆栈损坏。我意识到,一旦出现这个错误,程序的状态就受到怀疑;我只是试图捕获错误,希望找到它在我们的生产代码中发生的位置。有没有办法以编程方式处理这个错误?
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#pragma warning(disable: 4996) // strcpy
void vulnerable(const char* str)
{
char buffer[10];
strcpy(buffer, str); // overrun the buffer
}
int main()
{
__try
{
char large_buffer[] = "This string is longer than 10 characters.";
vulnerable(large_buffer);
}
__except (GetExceptionCode() == STATUS_STACK_BUFFER_OVERRUN)
{
printf("error"); // never getting …Run Code Online (Sandbox Code Playgroud) buffer-overrun ×10
c ×4
c++ ×3
c# ×2
.net ×1
asp.net ×1
destructor ×1
gets ×1
java ×1
memory-leaks ×1
pcre ×1
pointers ×1
scanf ×1
seh ×1
stackalloc ×1
windows ×1