当前位置: 首页 > 知识库问答 >
问题:

使用canaries来检测bss或数据部分是否有用?

杨鸿畅
2023-03-14

在我们基于GCC的C嵌入式系统中,我们使用-ffunction-sections-fdata-sections选项来允许链接器在链接最终可执行文件时删除未使用的(未引用的)部分。多年来这一直很有效。

在同一系统中,大多数数据结构和缓冲区都是静态分配的(通常是文件作用域的static-变量)。

当然,我们有bug,有时是很糟糕的bug,我们希望快速排除缓冲区溢出的可能性。

我们的一个想法是在每个bss节和data节之间放置金丝雀--每个bss节只表示一个符号(因为-fdata-sections)。就像编译器对函数所做的那样--当Stack-Smashing和StackProtection被激活时,堆栈。检查这些金丝雀可以通过从主机“不时”读取金丝雀地址来完成。

修改链接器脚本(手动放置部分并在中间添加一个金丝雀词)似乎是可行的,但这有意义吗?

野外到底有没有项目、有没有文章?使用我的关键字,我找不到任何东西。

共有1个答案

廖琪
2023-03-14

金丝雀对堆栈很有用,因为它的扩展和折叠超出了程序员的直接控制。您在数据/BSS上拥有的东西并不是这样的。或者它们是静态变量,或者如果它们是缓冲区,它们应该保持在固定的大小内,这应该通过与算法一起进行的防御性编程来检查,而不是非正统的技巧。

此外,堆栈金丝雀专门用于基于RAM的、类似PC的系统,这些系统不知道更好的方法。在嵌入式系统中,它们并不是很有意义。您可以做一些有用的事情来代替:

  • 内存映射堆栈,使其增长到写入将产生硬件异常的内存区域。例如,如果您的MCU能够将可执行内存与数据内存分开,并且在尝试执行数据区域中的代码或写入可执行区域时产生异常。
  • 确保程序中处理缓冲区的所有内容都执行错误检查,并且不越界写入。静态分析工具通常能很好地发现越界bug。甚至有些编译器也可以这样做。
  • 添加大量带有静态断言的防御性编程。在编译时检查结构、缓冲区等的大小,这是免费的。
  • 运行时防御编程。例如if(X==good){...}else if(x==bad){...}缺少else。而开关(x)大小写a:{...}缺少默认值。“但理论上它去不了那里!”不是,但在实际操作中,当您由于错误(很有可能)、闪存的数据保留(100%有可能)或RAM上的EMI影响(很不可能)而导致代码失控时。
  • 依此类推。
 类似资料:
  • 问题内容: 我希望这些问题很简单:(NASM编译器,Linux,x86 Intel语法) 第1部分: 我试图弄清楚如何使用Assembly程序的.bss部分来找到一种将值(例如,从操作(+-* /)的值)存储到声明的变量的方法。例如: 因此,我知道有可能使用内核intterupt来读取用户输入(但这涉及字符串),但是有没有办法将此值复制到 变量 变量中,以便以后使用?这会容易得多而不是必须要在堆栈

  • 问题内容: 我想指定两种略有不同的背景颜色,一种用于Mac OS,一种用于Windows。 问题答案: 没有用于指定用于查看网页的操作系统的属性,但是您可以使用javascript进行检测,这是一些用于检测操作系统的示例: 知道了吗?,现在您可以编写特定操作系统的下载样式表了。:) 另一个示例,我假设您正在使用jquery。

  • 好吧,所以我正在做这个项目,你必须做一些来自用户的输入 让我们说如果他进入 "12 3" 但他没有输入第二个输入 如果我把它叫做 如果我打电话 我有错误。我如何检查是否没有第二次输入? 公共静态void main(String [] args)引发IOException{ 如果用户输入 "3 2" 但没有进入第二个...我得到nullpointerx0016

  • 在最近的Android版本中,自Android8.1以来,操作系统得到了越来越多的主题支持。更具体地说是黑暗主题。 尽管从用户的角度对黑暗模式有很多讨论,但几乎没有为开发人员编写的内容。 从Android8.1开始,谷歌提供了某种黑暗主题。如果用户选择有一个深色的壁纸,OS的一些UI组件会变成黑色(本文在此)。 现在在Android Q上,它似乎走得更远,但具体到什么程度还不清楚。不知何故,一个名

  • 我不熟悉使用selenium和java实现页面对象模型自动化。我使用页面对象模型,将每个页面作为一个类,并将该页面中的操作作为方法。使用excel保存读取的测试数据。我有一个测试,可以使用各种参数来搜索客户,如客户编号、政策编号、姓氏、名字、WebReference、电子邮件等等。。。。。。现在,我必须在方法签名中提供所有参数,否则测试将失败,并出现数据提供程序不匹配错误。我有一个GetData方

  • 问题内容: 我有一个必须在用户界面上显示的双精度值。现在的条件是double的十进制值= 0,例如。-14.0在这种情况下,我必须仅在UI上显示14。另外,此处字符的最大限制为5。 例如:-12.34整数值不能大于2位,所以double的十进制值也不能大于2位。 最好的方法是什么? 问题答案: 你可以做 检查是否整体。