今天和 20 年前的内存对齐

2024-02-22

在著名论文“Smashing the Stack for Fun and Profit”中,其作者采用了一个 C 函数

void function(int a, int b, int c) {
  char buffer1[5];
  char buffer2[10];
}

并生成相应的汇编代码输出

pushl %ebp
movl %esp,%ebp
subl $20,%esp

作者解释说,由于计算机以字大小的倍数对内存进行寻址,因此编译器在堆栈上保留了 20 个字节(8 个字节用于 buffer1,12 个字节用于 buffer2)。

我尝试重新创建这个示例并得到以下结果

pushl   %ebp
movl    %esp, %ebp
subl    $16, %esp

不一样的结果!我尝试了 buffer1 和 buffer2 大小的各种组合,似乎现代 gcc 不再将缓冲区大小填充到字大小的倍数。相反,它遵守-mpreferred-stack-boundary option.

作为一个例子——使用本文的算术规则,对于 buffer1[5] 和 buffer2[13],我会在堆栈上保留 8+16 = 24 字节。但实际上我得到了 32 个字节。

这篇论文已经很老了,从那以后发生了很多事情。我想知道,到底是什么促使了这种行为的改变?这是向 64 位机器发展的趋势吗?或者是其他东西?

Edit

该代码是在 x86_64 机器上使用 gcc 版本 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 编译的,如下所示:

$ gcc -S -o example1.s example1.c -fno-stack-protector -m32


改变的是SSE http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions,这需要 16 字节对齐,这在旧的 gcc 文档中进行了介绍-mpreferred-stack-boundary=num https://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/i386-and-x86-64-Options.html其中说(强调我的):

在 Pentium 和 PentiumPro 上,double 和 long double 值应与 8 字节边界对齐(请参阅 -malign-double),否则会遭受严重的运行时性能损失。在 Pentium III 上,如果流 SIMD 扩展 (SSE) 数据类型 __m128 不是 16 字节对齐,则会遭受类似的损失。

这也得到了论文的支持粉碎现代堆栈以获得乐趣和利润 https://www.ethicalhacker.net/columns/heffner/smashing-the-modern-stack-for-fun-and-profit其中涵盖了其他打破的现代变化粉碎堆栈以获得乐趣和利润.

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

今天和 20 年前的内存对齐 的相关文章

随机推荐

  • 使用新标签微调模型的分类器层

    我想使用仅包含 1 个模型之前未见过的附加标签的新数据集来微调已经微调的 BertForSequenceClassification 模型 这样 我想向模型当前能够正确分类的标签集添加 1 个新标签 此外 我不希望随机初始化分类器权重 我想
  • php对对象的属性进行排序

    我想对对象的属性进行排序 以便可以按定义的顺序循环遍历它们 例如 我有一个对象 book 具有以下属性 id title author date 现在我想像这样循环访问这些属性 foreach book as prop gt val do
  • 将字符串严格格式化为大写字母,然后将数字分成两半[重复]

    这个问题在这里已经有答案了 我有几个格式的字符串 AA11 AAAAAA1111111 AA1111111 我需要分离字符串的字母和数字部分 如果它们都是一系列字母 后跟一系列数字 没有非字母数字字符 那么sscanf http www p
  • 在 while 循环中使用文本作为条件

    我在使用文本作为 while 循环的条件时遇到一些问题 目前的基本编码是 result struct val yes while result val yes result val input more digits end 正如您所看到的
  • Canvas 中同一动画 GIF 的多个实例 (Java)

    所以我正在制作一款游戏 你可以在角色的位置放置炸弹 当炸弹显示并最终爆炸时 每个炸弹都与一个 GIF 图像相关联 想想炸弹人 问题是 当我尝试在屏幕上绘制多个炸弹时 它是从 GIF 的最后一帧绘制的 经过调查 我找到了 image flus
  • CSS DOM 遍历优于 JavaScript DOM 遍历?

    JavaScript and CSS两者在遍历 HTML 元素时都使用自己的 DOM 树 In JavaScript 我们可以使用它自己的DOM遍历方法比如 element parentNode element nextSibling 然而
  • 是否可以将 JavaScript 变量保存为文件? [复制]

    这个问题在这里已经有答案了 有没有办法将 JavaScript 变量中的字符串转换为用户可以在单击按钮时下载的可下载文件 感谢您的任何建议 div Lorem Ipsum div br
  • 如何在 C# 中动态添加字段到类中

    有什么办法可以添加Field or FieldInfo 也许这与运行时的类是一样的 您无法在运行时更改类定义 但是 您可以创建一个继承自原始类的新类 如果它不是sealed 并声明该字段 您可以通过使用发出适当的 IL 代码来做到这一点Sy
  • 有没有办法使用 glom 库将字典列表合并为单个字典? [复制]

    这个问题在这里已经有答案了 我在用着glom https github com mahmoud glom项目 有没有办法转换 id 1 name foo id 2 name bar to 1 foo 2 bar New glom版本 19
  • Nextjs getStaticProps 将对象作为 prop 而不是纯字符串传递时出错

    我希望你一切都好 在使用新的内部化 NextJS 功能时 我发现了一个我根本没有预料到的错误 如果我传递一个纯字符串作为 prop 从getStaticProps to the Page Component一切正常default local
  • 滚动到 SwiftUI 中的 TextEditor 光标位置

    是否可以滚动到TextEditor的当前光标位置 我有一个List with a TextEditor作为最后一行 我正在滚动到最后一行List以确保TextEditor位于键盘上方 问题是因为我将滚动锚设置为 bottom 在编辑长文本时
  • Spring Data solr 正在将字段类型创建为 text_general,即使我们提到为 string

    我正在尝试将 Spring Data solr 集成到我的 spring 应用程序中 但遇到了以下问题 即使我在 Indexed 属性中添加了 type string 它仍然将字段类型创建为 text general 有任何输入吗 Solr
  • 为 Flutter/React-Native/Android-Native 应用程序生成 SHA-1

    我正在尝试为 Flutter 应用程序生成 SHA 1 以便 Android studio 支持 Google Sign in 但我不知道该怎么做 我看到一些帖子表明要运行命令 但我需要我猜是一个 jks 文件 而 flutter 不会创建
  • 如何在tableview单元格中添加Webview并在ios中使用webview获取单元格的动态高度

    大家好 我想在 tableview 单元格中添加 webview 请建议如何在 tablview 单元格中添加 webview 并在 ios 中使用 web 视图获取 tableview 单元格的动态高度 提前致谢 这是一个非常重要的问题
  • C++ 中的结构继承与类继承

    我刚刚从这个发现Q A https stackoverflow com questions 979211 struct inheritance in c结构在 C 中是可继承的 但是这是一个好的实践 还是最好使用类 在哪些情况下是可取的 在
  • 如何将 NewRelic 用于我的 Meteor 应用程序?

    我在 Heroku 上托管我的 Meteor 应用程序 并且希望拥有更多的监控功能 而不是heroku logs tail NewRelic 可能是一个不错的选择 尽管它的 Node js 代理仍处于测试阶段 有人尝试过将它与 Meteor
  • C++ 是否有无堆栈或无堆实现?

    C 标准没有提及任何有关堆栈或堆的内容 它们是特定于实现的 这是事实 尽管它们不是 C 标准的一部分 但我们最终还是会使用它们 以至于它们就像是语言本身的一部分 并且必须考虑内存或性能目的 因此我的问题是否有不使用堆栈和堆的 C 实现 其他
  • 无需外部依赖的 Windows GNU 编译器套件

    是否有任何免费的 与 GCC 兼容的 Windows 套件可以生成独立的可执行文件而无需外部依赖项 以下是一些不符合要求的内容 按不受欢迎程度排序 MinGW http mingw org MSVCRT DLL Cygwin http cy
  • 变换:缩放 - 处理初始大小的剩余“边距”

    我使用 iframe 元素作为混合视频和图像内容的预览窗口 缩小的 iframe 效果很好 因为它允许我们的客户查看与电视屏幕上显示的图像接近的图像 我想在 iframe 下方添加一些按钮 但是该按钮显示在 iframe 下方 符合 ifr
  • 今天和 20 年前的内存对齐

    在著名论文 Smashing the Stack for Fun and Profit 中 其作者采用了一个 C 函数 void function int a int b int c char buffer1 5 char buffer2