问题标签 [buffer-overflow]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 为什么gets函数如此危险以至于不应该使用它?
当我尝试gets()
通过 GCC 编译使用该函数的 C 代码时,我收到以下警告:
(.text+0x34): 警告:“gets”功能很危险,不应使用。
我记得这与堆栈保护和安全性有关,但我不确定为什么。
我怎样才能删除这个警告,为什么会有这样一个关于 using 的警告gets()
?
gets()
既然如此危险,为什么我们不能删除它?
windows - 如何在 Visual C++ 运行时禁用缓冲区溢出检查?
我和其他几千人收到 Microsoft Visual C++ 运行时抛出的错误:
为了搜索引擎的利益,说:
现在我明白了缓冲区溢出是什么,以及为什么它是一件坏事。鉴于微软新强调“它刚刚坏了”, MSVCRT中的额外缓冲区检查可能是一件好事。
另一方面,我不在乎。不是程序不能继续,而是程序不能安全地继续。好吧,我宁愿不安全,因为它总比没有好。我喜欢危险地生活。
那么任何人都可以提出任何建议吗?我在想这样的事情:
- 防止 MSVCRT 停止执行的注册表项
- 在与以前的操作系统(Windows 7 之前)兼容的情况下运行应用程序
- 将程序集清单添加到可执行文件夹,以便它使用旧版本的 MSVCRT,它不执行此溢出检查
- 没有溢出检查的 MSVCRT 副本的版本号或下载位置
我尝试搜索编写Microsoft Visual C++ 运行时库的公司的支持站点,但他们没有提及哪些函数可能溢出,或者如何禁用溢出检查。
c - 内存覆盖问题
我有一个 C 代码应用程序。我正在使用 MS-VS2005 构建。我有一个使用 malloc 动态分配的输出数据缓冲区。
对于某些测试用例,正在 malloc 的内存大小低于生成的实际输出大小(以字节为单位)。较大的输出被写入较小的缓冲区,导致缓冲区溢出。结果,测试运行崩溃,MSVS-2005 显示一个窗口“堆损坏......”
我知道这与一些动态内存分配有关,但我花了很长时间才真正找到根本原因,因为我不怀疑内存分配,因为我分配了足够大的输出所需的大小。但是一个特定的测试用例产生的输出比我计算的要多,因此导致了崩溃。
我的问题是:
1.) 我可以使用哪些工具来检测这种动态内存缓冲区溢出情况。它们还可以帮助检测任何缓冲区溢出情况(无论缓冲区/数组是否位于堆、堆栈、全局内存区域)?
2.) 内存泄漏工具(比如 Purify)或 lint、klocworks 等代码分析工具在特定情况下会有所帮助吗?我相信它们必须是运行时分析工具。
谢谢你。
-广告。
c - scanf("%8s", string) 溢出?
我知道普通代码有可能溢出:
字符字符串[9];
scanf("%s", 字符串)。
但是是否有可能溢出 scanf("%8s", string)?8只是一个例子。
我知道“%8s”就像一个分隔符,但我也注意到当我输入超过 8 个字符的字符串时,程序将因以下原因终止:
* 检测到堆栈粉碎 * : ./a.out 终止
======= 回溯:=========
...
显然,默认情况下,有一个标志可以检测 GCC 打开的堆栈粉碎。既然这是一个堆栈粉碎,那么我的猜测是仍然有可能溢出并执行任意代码。
与破坏 scanf("%s") 调用者的正常溢出相反,如果 scanf("%8s") 可以溢出,它将在 scanf 函数内溢出,以便当 scanf 尝试返回时,获得控制权。
但是 scanf 是一个需要模式切换(从用户模式切换到内核模式)的系统调用,并且在内部它会调用诸如读取到标准输入等的东西。所以不确定我们是否可以在内核模式下溢出或其他东西..
欢迎评论!!
更新>>
char string[9] 假设在上面的例子中。以下实际代码中的 char string[8]。
问题实际上是关于安全 scanf("%8s") 和由于堆栈粉碎导致的 GCC 中止之间看似矛盾的故事。
简化代码:
笔记:
- foo 被其他人调用。
- 尽管字符串在带有“%8s”的实际代码中是 8 个字节,但我认为这不会导致崩溃。
c - This form of use of printf api makes it safer?
** Of course, their buffers, strings yet to be properly targeted
c++ - 为什么在访问整数时缓冲区溢出会导致分段错误?
在从函数 A() 调用函数 B() 期间,B() 分配一个 100 字符的数组并多次填充,包括一次使用 101 字符的字符串和一次使用 110 字符的字符串。这是一个明显的错误。
后来,函数 A() 尝试访问完全不相关的 int 变量 i,并发生分段错误。
我明白为什么会发生缓冲区溢出,但是为什么我在访问这个整数时会出现分段错误?为什么我不简单地获取垃圾数据?
c - 缓冲区溢出内存映射解释
我正在处理一个微不足道的缓冲区溢出问题(是的,利用;但与问题无关)当启用 GCC 的堆栈保护器时,我试图找出内存映射中的字段。举例说明:
所以,如您所见;有回溯,然后是内存映射,有 5 个字段,然后是可选的第六个字段,其中可能包括 .so.1(共享库?)我在问这些字段是什么,它们的含义,比如十六进制字段,以及 rw-p 的含义等。
我在谷歌上搜索过,但没有出现这样的情况。
谢谢。
c++ - sprintf(buf, "%.20g", x) // buf 应该有多大?
我正在将双精度值转换为这样的字符串:
我已将缓冲区大小硬编码为 30,但不确定这对于所有情况是否足够大。
- 如何找出我需要的最大缓冲区大小?
- 从 32 位切换到 64 位时,精度是否会更高(因此缓冲区需要增加)?
PS:我不能使用ostringstream
或boost::lexical_cast
出于性能原因(见此)
c - 编写安全 C 和安全 C 习语
“普通人不想自由。他只是想安全。” - HL 门肯
我正在尝试编写非常安全的 C。下面我列出了我使用的一些技术,并询问它们是否像我认为的那样安全。请不要犹豫,将我的代码/成见撕成碎片。任何能找到最微不足道的漏洞或教给我新想法的答案都将受到高度重视。
从流中读取:
根据GNU C Programming Tutorial getline:
getline 函数将通过 realloc 函数根据需要自动扩大内存块,因此永远不会出现空间短缺——这是 getline 如此安全的原因之一。[..] 请注意,无论输入多长,getline 都可以安全地处理您的输入行。
我假设 getline在所有输入下都应该防止从流中读取时发生缓冲区溢出。
- 我的假设正确吗?是否存在可能导致漏洞利用的输入和/或分配方案?例如,如果流中的第一个字符是一些奇怪的控制字符,可能是 0x08 BACKSPACE (ctl-H)。
- 有没有做任何工作来从数学上证明 getline 是安全的?
Malloc 在失败时返回 Null:
如果 malloc 遇到错误 malloc 返回一个 NULL 指针。这带来了安全风险,因为仍然可以将指针算术应用于 NULL (0x0) 指针,因此维基百科建议
安全 sscanf:
使用sscanf时,我养成了将要提取的字符串大小分配给输入字符串的大小的习惯,希望避免出现溢出的可能性。例如:
因为 str1 和 str2 是 inputStr 的大小,并且不能从 inputStr 读取超过 strlen(inputStr) 的字符,所以考虑到 inputStr 的所有可能值导致缓冲区溢出,这似乎是不可能的?
- 我对么?有没有我没有想到的奇怪的角落案例?
- 有没有更好的方法来写这个?已经解决的库?
一般的问题:
虽然我已经发布了大量问题,但我不希望任何人都能回答所有问题。这些问题更像是我正在寻找的各种答案的指南。我真的很想学习安全的 C 思维方式。
- 还有哪些其他安全的 C 习惯用法?
- 我需要经常检查哪些极端情况?
- 如何编写单元测试来强制执行这些规则?
- 如何以可测试性或可证明正确的方式强制执行约束?
- 任何推荐的 C 静态/动态分析技术或工具?
- 您遵循哪些安全的 C 实践,您如何向自己和他人证明它们的合理性?
资源:
许多资源都是从答案中借来的。
- David Wheeler的 Linux 和 Unix 安全编程 HOWTO
- 安全 C 编程 - SUN Microsystems
- 通过示例进行不安全编程
- 添加更多 NOPS - 涵盖这些问题的博客
- CERT 安全编码倡议
- 探伤器- 静态分析工具
- Yannick Moy使用 Thm Provers 证明安全性
- 安全库