今天和 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 年前的内存对齐 的相关文章

  • 隐式将 string 转换为 string_view

    void Foo1 string view view string str one two three Foo1 one two three Implicitly convert char to string view Foo1 str I
  • C++ - 错误 C3646:未知的覆盖说明符

    我修改了我的项目 编译后弹出一些奇怪的错误 ifndef BART RAY TRACER MESH H define BART RAY TRACER MESH H include
  • 输出 objdump -t 的输出中的“.hidden”是什么意思?

    Example objdump Logger cpp o t 00000000 g F text 00000000 hidden sti 10 Logger cpp 0b2ae32b 这意味着符号的可见性被隐藏 https develope
  • 返回带有列表对象的列表对象

    我有三个表 汽车品牌 汽车型号 和 CarsandModel 我有 Carsand 模型表 因为一个模型可以由多个制造商构建 我想返回包含汽车型号列表的汽车品牌列表 我现在的长篇大论不是过滤汽车型号的汽车制造商列表 我尝试添加一个 wher
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 计算序列而无法存储值?

    问题陈述 here http www spoj com problems EC SER 令 S 为无限整数序列 S0 a S1 b Si Si 2 Si 1 对于所有 i gt 2 你有两个整数 a 和 b 您必须回答有关序列中第 n 个元
  • pybind11 返回 numpy 对象数组

    使用 pybind11 C API 和 python3 我们如何在 C 实现中正确创建一个 numpy 对象数组 即 unicode 字符串 并将其返回给 python 传递到 pybind11 array 的底层数据数组的确切内存布局是什
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • c++ 最大 std::string 长度由堆栈大小或堆大小决定?

    正如问题中所问 std string myVar 它可以容纳的最大字符是由堆栈还是堆决定的 谢谢 默认情况下 分配的内存为std string是动态分配的 注意std string has a max size 函数返回实现支持的最大字符数
  • 如何防止打印屏幕

    我有一个要求 我正在开发的应用程序阻止用户轻松捕获屏幕内容 我已经表示 没有可行的方法可以完全防止这种情况发生 但我正在寻找方法来为这一过程引入一些障碍 我正在使用 C NET 2 0 和 WinForms 你不能 您能做的最好的事情就是在
  • 在.NET MVC中,有没有一种简单的方法来检查我是否在主页上?

    如果用户从主页登录 我需要采取特定的操作 在我的 LogOnModel 中 我有一个隐藏字段 Html Hidden returnUrl Request Url AbsoluteUri 在我的控制器中 我需要检查该值是否是主页 在下面的示例
  • 确定所选电子邮件是来自收件箱还是已发送邮件

    我正在编程Outlook 插件并需要确定所选电子邮件是否来自Inbox or Sent Items这样当我将电子邮件保存到数据库中时 我可以使用文件夹 收件箱 或 已发送 来标记电子邮件 我知道我可以将文件夹名称与 收件箱 或 已发送邮件
  • 传输数据的 Symbol.WPAN.Bluetooth 示例

    我正在尝试将 EMDK 附带的 Symbol WPAN Bluetooth 用于 Symbol 设备 有人碰巧有一个传输数据的工作示例吗 Symbol 的示例只是将设备配对 他们显然认为在个人局域网示例中并不真正需要传输数据 不管怎样 我知
  • 我们还需要迭代器设计模式吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Web Api 2 在 OWIN 中间件中获取控制器和操作名称?

    如何在自定义 OWIN 中间件中检索 api 控制器名称和 api 操作名称 我可以在消息处理程序内部执行此操作 如下所示 var config request GetConfiguration var routeData config R
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • Linq 表达式树 Any() 问题

    您好 我在使用 Any 扩展方法的表达式树时遇到问题 这是我的代码 IQueryable
  • 防止使用不完整类型实例化模板类

    我正在写一个库 它的布局看起来类似于 A h include
  • 我的 Visual Studio 2008 模板有什么问题?

    我正在尝试为 Visual Studio 创建自己的类模板 称为 公共类 我跟着有关如何手动创建项目模板的官方 MSDN 说明 http msdn microsoft com en us library ms247113 aspx几乎一字不
  • C++ 中带逗号的表达式的执行顺序 [重复]

    这个问题在这里已经有答案了 我的理解是这个词j i将在之前执行 i在声明中 j i i C 标准是否保证j i将在之前执行 i在循环 for auto i std next begin j begin i end j i i 逗号运算符引入

随机推荐

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

    我想使用仅包含 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