【问题标题】:What are the benefits to use const pointers or const data?使用 const 指针或 const 数据有什么好处?
【发布时间】:2020-05-11 09:40:20
【问题描述】:

如何利用非 const 指针(允许访问附近的内存)或非 const 数据?

我研究了一个非常量指针可以被利用来访问附近的计算机内存。

但我的问题是:如何?

我的意思是,如果我已经启动了我的编译程序,如果它已经编译并运行,攻击者如何利用它?

这是一个危险的漏洞吗?还是没那么重要?

【问题讨论】:

  • >如果需要,您可以随时转换指针来删除 const。但是如果程序已经编译并使用 const 指针/数据运行呢?
  • C 不是解释语言,而是编译语言。您可能遇到的主要问题是编译器是否为常量内存分配了一些存储空间,或者它假设某些内容没有更改,而实际上您已经绕过类型系统并对其进行了更改。同样,这些都不是“利用”。你能做的最坏的事情基本上等同于取消引用一个错误的指针值。你可能会崩溃你的程序,或者得到意想不到的结果,但仅仅因为你的代码中可能有错误并不意味着你会突然能够以某种方式利用它。
  • @TomKarzes: const 不应用作或依赖函数不会更改指向数据的文档,因为 C 不需要这样做,并且在某些情况下函数必须删除const 内部。
  • @TomKarzes:不,您不必做出假设。作者可以记录他们的代码,用户可以阅读文档。
  • @TomKarzes:(a) 手册页是某种方式这一事实并不意味着它必须是那种方式。如果它缺少信息,那是其作者身份的缺陷,而不是逻辑必要性的证据。提交缺陷报告。 (b) 文档被理解为告诉您某个功能的作用,而省略某些行为意味着它不执行该行为。例如,如果一个函数的文档没有说它设置errno,那么它不应该设置errno。虽然这可能被归类为假设,但我会将其描述为文档中的约定而不是假设。

标签: c security pointers constants buffer-overflow


【解决方案1】:

常量指针 C 中的常量指针不能更改它所指向的变量的地址,即地址将保持不变。因此,我们可以说,如果一个常量指针指向某个变量,那么它就不能指向任何其他变量。

恒定数据

  1. 代码维护 假设我需要在整个项目中使用光速进行计算。光速不会改变,因此不需要变量。只要我需要光速(以米/秒为单位),我就可以简单地复制和粘贴 300,000,000(显然没有逗号)。这目前可以正常工作,但以后我的计算可能需要更高的精度,所以如果我想将 300,000,000 更改为 299,792,458,如果我在代码中大量使用这个值,这将是一个相当痛苦的过程。如果我使用 const,我可以在整个代码中使用这个 const 的名称,所以如果我需要更改它的值,我可以在代码的开头更改一次。
  2. 内存 考虑到现代设备的计算能力,这通常无关紧要,但对于嵌入式设备上的软件,可能没有用于变量的 RAM 空间,并且通过使用 const,它的值在编译代码时被放入程序中。这允许使用存储空间(在 HDD/SSD 上)而不是 RAM。
  3. 意外更改 如果您需要一个值来保持不变,请使用 const,这样您以后就不会因为忘记需要它的值保持不变而意外更改它的值。这样想,如果它的值不会在整个代码中改变,为什么不使用 const。

【讨论】:

    【解决方案2】:

    C 中的指针是最危险的实体,可能会利用您的 RAM。如果您以某种方式知道它所指向的指针的基地址,请使用该地址在内存中向前或向后移动并做任何您想做的事情,因为在 C 中没有 OutofBoundException 的异常处理。

    为此,您需要对指针有一个很好的理解。

    【讨论】:

    • 这个问题没有答案。
    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多