C 缓冲区溢出 - 为什么有恒定数量的字节会引发段错误? (Mac OS 10.8 64 位,clang)

2023-12-29

我正在试验 C 中的缓冲区溢出,发现一个有趣的怪癖:

对于任何给定的数组大小,似乎有一定数量的溢出字节可以在 SIGABRT 崩溃之前写入内存。例如,在下面的代码中,10 字节数组可以溢出到 26 字节,然后在 27 处崩溃。同样,20 字节数组chars 可以溢出到 40char41 日中止之前。

谁能解释这是为什么吗?另外,SIGABRT 是否与“分段错误”相同(或由“分段错误”引起)?

Mac OS 10.8 - Xcode 4.6、clang 和 lldb。谢谢!

#include <stdio.h>

int main(int argc, const char * argv[])
{
  char aString[ 10 ];
  char aLetter = 'a';

  printf("The size of one array slot sizeof( aString[0] ) is %zu\n", sizeof(aString[0]));
  printf("The size of one letter     sizeof( aLetter )    is %zu\n", sizeof(aLetter));

  // Overflow the aString array of chars
  // lldb claims aString is initialized with values \0 or NULL at all locations

  // Substitute i<27 and this code will crash regularly
  for (int i=0; i<26; i++) {
    aString[i]= aLetter;
  }

return 0;
}

编辑 - 我已经在反汇编中逐步完成它,并在 for 循环之后发现了这种保护:

0x100000f27:  movq   226(%rip), %rax           ; (void *)0x00007fff793f24b0: __stack_chk_guard
0x100000f2e:  movq   (%rax), %rax
0x100000f31:  movq   -8(%rbp), %rcx
0x100000f35:  cmpq   %rcx, %rax
0x100000f38:  jne    0x100000f49               ; main + 121 at main.c:26
.
.
.
0x100000f49:  callq  0x100000f4e               ; symbol stub for: __stack_chk_fail

这是由于堆栈的对齐mac os.

这不是什么大新闻,如果你用谷歌搜索一下,你会找到答案:

为什么 Mac ABI 要求 x86-32 进行 16 字节堆栈对齐? https://stackoverflow.com/questions/612443/why-does-the-mac-abi-require-16-byte-stack-alignment-for-x86-32


很高兴看到您实际上可以以小于 16 字节的块写入堆栈,而不会产生任何副作用。

如果您多次利用它,您可能会进入一种状态,所有恶意代码都可以被放下,并且您可以在堆栈上跳转执行它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 缓冲区溢出 - 为什么有恒定数量的字节会引发段错误? (Mac OS 10.8 64 位,clang) 的相关文章

  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 错误:Redis 连接到 127.0.0.1:6379 失败 - 连接 ECONNREFUSED 127.0.0.1:6379

    我试图允许我的nodeJs docker 映像与我的redis docker 映像 Mac OS X 环境 之间进行通信 NodeJs Dockerfile FROM node 4 7 0 slim EXPOSE 8100 COPY nod
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • Mac 操作系统屏幕上的 Git 自动补全

    我在 mac 上使用 git 并配置了自动完成功能 如下所示http www codethatmatters com 2010 01 git autocomplete in mac os x http www codethatmatters

随机推荐

  • 从 List.map() 获取迭代索引

    我在字母列表上编写了一个迭代 并使用 地图 类将内部卡片放在屏幕上 在代码中 您可以看到我做了一行 并使用 map 将卡片上的所有用户板打印到屏幕上 我想在里面添加一些逻辑 所以我需要获取元素的 id 用于录制事件 有什么办法可以做到这一点
  • 为什么 android:buttonStyle 不设置按钮样式?

    所以 我有一个奇怪的问题 我的应用程序非常简单 主要活动只有一个按钮 并且清单中设置的活动的自定义主题 我可以确认主题有效并被选中 因为我可以更改活动背景或字体颜色 例如 但是当我尝试为我的活动中的所有按钮设置样式时 它不起作用 这是样式
  • 在 Bukkit 中设置原理图的块数据?

    我正在尝试加载并粘贴 schematicbukkit 中的文件 不挂钩 MCEdit API 下面是我用来粘贴原理图的函数 方法 粘贴时 我不断收到NullPointerException在粘贴过程中 当我记录放置的物品时 我看到草块 石头
  • 从控制台禁用/更改 Spring Boot 的 ApplicationContext 的时间戳

    每次我们启动 Spring Boot 应用程序时 Spring Boot 都会打印以下行 2017 07 20 00 43 53 605 INFO 3857 main ationConfigEmbeddedWebApplicationCon
  • 目前是否有适用于 iOS4 和 Xcode4 的 BDD 解决方案?

    所以我一直在努力寻找 iOS4 和 Xcode4 的可靠 BDD 替代品 但一切似乎要么很久以前就被放弃了 要么sortof工作但相当混乱 我找到的最好的解决方案称为 Cedar 主要文章 http pivotallabs com user
  • FileSystemWatcher - 目标目录所需的最低权限?

    使用 NET FileSystemWatcherhttp msdn microsoft com en us library system io filesystemwatcher aspx http msdn microsoft com e
  • 使用 Google 登录时的服务条款和隐私政策链接不起作用

    我已经实现了 firebase 身份验证 UI 包括电子邮件和 Google 作为提供商 我还提供了服务条款和隐私政策链接 如下所示 List
  • Jaxrs 多部分

    我正在尝试向 jaxrs 服务执行请求 该服务的媒体类型设置为multipart form data 该请求包含实体列表 xml 和图像 png 二进制 我已按照中所述创建了请求this https stackoverflow com qu
  • 从派生类对象调用基类方法

    如何从派生类对象调用被派生类重写的基类方法 class Base public void foo cout lt lt base class Derived public Base public void foo cout lt lt de
  • 使用不同的值作为列创建 MySQL 视图

    我搜索了一段时间 找不到我的问题的答案 我有一个看起来像这样的表 date name status 2011 01 01 m1 online 2011 01 01 m2 offline 2011 01 01 m3 online 2011 0
  • 为什么是替换而不是替换!对于红宝石中的字符串?

    replace更改当前字符串而不是返回新实例 为了与 Ruby 中的其他方法保持一致 似乎应该调用replace 这是一个错误 不一致还是我错过了什么 来自 matz 的帖子https www ruby forum com topic 17
  • 如何在gradle中的测试任务中指定@category?

    我想了解是否可以在 gradle 测试任务中指定 category 所以 我可以单独运行集成 junit 和正常的 junit 测试 http weblogs java net blog johnsmart archive 2010 04
  • 使用 async 函数作为 EventEmitter 监听器有什么问题吗?

    我正在编写一个 Node js v10 应用程序 我想使用await在事件监听器函数中 所以我做了一个async监听器功能 根据下面的代码 它似乎有效 但我很好奇注册时是否有隐藏的缺点或我应该注意的事情async功能作为EvenEmitte
  • 尽管提供了接受属性,Antd 上传程序仍然接受所有文件

    我正在使用 antd 拖放组件https ant design components upload components upload demo drag https ant design components upload compone
  • Flexbox 顺序和选项卡导航

    我想用显示 柔性改变order的 div 与line类 但我想保持这个 TAB 导航顺序 A B C D 正如您在代码片段中看到的 第一个示例工作正常 DOM 序列与 Order 相同 但在第二个示例中 选项卡遵循 DOM 序列 不使用 j
  • 编译一个快速修复程序

    我正在尝试使用 QuickFix 库通过 FIX 协议连接到代理 我刚刚使用他们提供的文档构建了库 并立即使用他们的示例代码 include quickfix FileStore h include quickfix FileLog h i
  • MongoDB 获取聚合查询的executionStats

    我正在寻找一种方法来检索executionStats用于聚合 当使用 find 时 我可以通过使用轻松检索它们explain https docs mongodb com manual reference explain results 输
  • 防止浏览器缓存 AJAX 调用结果

    看起来如果我使用加载动态内容 get 结果缓存在浏览器中 在 QueryString 中添加一些随机字符串似乎可以解决这个问题 我使用new Date toString 但这感觉就像是黑客攻击 还有其他方法可以实现这一目标吗 或者 如果唯一
  • 如何使用Java读取带有部分的配置文件[重复]

    这个问题在这里已经有答案了 给定一个包含以下内容的文件 upper a A b B words 1 one 2 two 如何参考它们的标头访问这些键 值 Java 的 Properties 类仅处理无节文件 使用 ini4j 库 链接教程
  • C 缓冲区溢出 - 为什么有恒定数量的字节会引发段错误? (Mac OS 10.8 64 位,clang)

    我正在试验 C 中的缓冲区溢出 发现一个有趣的怪癖 对于任何给定的数组大小 似乎有一定数量的溢出字节可以在 SIGABRT 崩溃之前写入内存 例如 在下面的代码中 10 字节数组可以溢出到 26 字节 然后在 27 处崩溃 同样 20 字节