问题标签 [memory-layout]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java中的内存布局
我在高中时通过了 Java 测试。一个问题让我很困扰,因为我是空白的,我将如何解决它。
考虑以下 Java 代码:
假设这要在具有 4 字节地址的机器上编译为本机代码。为计数器对象在内存中绘制布局图。显示所有虚函数表。
c++ - 为什么 sizeof(Derived4) 是 8 字节?我认为应该是 5 个字节
这是给定程序的输出:
这是程序:
Derived3 的大小为 1 个字节。那为什么 Derived 4 的大小是 8 个字节?如果对齐是答案,那么为什么在derived3 的情况下没有对齐?
c# - 1字节对齐会导致内存损坏吗?
假设您在 C++ 中有一个结构(使用 MFC,编译为 32 位),其定义如下:
现在您在 Windows 中使用创建一个内存映射文件CreateFileMapping
,然后将此结构的内容写入此内存区域。这是一个全局可访问的内存映射。
现在您有了 C# 应用程序(编译为 32 位),并创建了一个类似于此的结构:
现在,当 C# 读取内存映射数据时,它显示为已损坏。如果类型f
是double
,如上所述,则该特定成员的值是垃圾,其他成员具有正确的内容。如果将其更改为float
,则所有其他成员也包含垃圾。
我的问题,可能是 1 字节对齐导致了垃圾的读取吗?
不幸的是,我这里没有读取/写入内存映射的代码,但结构布局如上。
如果对齐在这里不是问题,什么可能导致它读取垃圾?尝试了几次改变各种成员的类型,没有任何区别。
linux - 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?
测试在 32 位 Linux 上
代码如下:
当我使用 cat /proc/pid/maps 查看内存布局时,我似乎可以看到我的代码和库的三个 文本段。
任何人都可以给我一些关于这个问题的指导吗?十分感谢!
linux - Linux x86 上的内核空间是否映射到用户空间?
似乎在 Windows 32 位上,内核会从总共 4G 的用户虚拟内存空间中预留 1G 的虚拟内存,并将部分内核空间映射到这 1G 空间中。
所以我的问题是:
- 在 32 位 Linux 上是否有类似的情况?
- 如果是这样,我们如何才能看到整个内存布局?
我认为
只能看到某个进程的用户空间布局..
谢谢!
c - N维数组的内存布局选择
我已经开始为 n 维向量编写一个库。
我想在这个库中支持几个设计功能:
- 内存布局是连续的。这样共享内存、通过网络发送和保存到文件只需要传递一个指针。
- 不同的维度可以支持不同的元素大小(即
[0][0]
可能是1
字节,[1][0]
也可能是2
字节)。
在绘制了某些维度向量的内存布局的一些表示之后,我意识到有两种布局结构的方法:
这是第一种方法。两种表示都是 [2][4][3] 数组的可视化。
这里是第二种方式。
选择一种布局而不是另一种布局是否有某些优点/缺点?
c - 覆盖返回地址简单格式字符串漏洞利用
是的,已经存在很多类似的问题(5037601、19166698、4855162、14505995、5052648、13409508、7745146、7459630;抱歉,没有足够的代表超过 2 个链接),是的,有一些很好的文章解释了这种东西(点击,点击,http://codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html)。我已经阅读了它们并且我想我明白了一般的想法,但是我仍然无法成功地利用我能想到的最简单的训练玩具示例。
是的,堆栈是可执行的,是的,内存布局随机化被禁用。每次执行都给我相同的地址a
。例如$ ruby -e 'print "AAAA"+("%08x."*16)'
,我可以喂它,结果是:
所以现在我可以看到我的输入在内存中的最终位置。我可以使用 将值写入堆栈$ ruby -e 'print "12345%n"+("%08x."*16)'
,结果如下:
显然,我的最终目标大概是这样<something><NOPs><shellcode>
的,<something>
覆盖返回地址,f
以便程序跳转到 NOP sled 并执行 shellcode。但是现在保存的返回地址的地址似乎取决于我的输入,对吧?类似于 的东西0xbfffece0 - len(input) - 12
,假设是 12 字节的序言?也许这个例子毕竟不是最简单的......
我越来越糊涂了。有任何想法吗?
linux - 计算进程内环境的内存地址
我从安全课程的讲座幻灯片中获得了以下代码。
该代码在其环境中调用带有 shellcode 的易受攻击的程序。shellcode 是外部文件中的一些汇编代码,它打开一个 shell,VULN 定义了易受攻击的程序的名称。
我的问题:shellcode地址是如何计算的
addr 变量保存 shellcode 的地址(它是环境的一部分)。谁能向我解释这个地址是如何确定的?所以:
- 0xc0000000 - 4 来自哪里?
- 为什么要减去 shellcode 的长度和程序名?
请注意,这段代码和易受攻击的程序都是这样编译的:
所以地址空间随机化被关闭。
我知道堆栈是进程内部的第一件事(最高内存地址)。堆栈按以下顺序包含:
- 环境数据。
- argv
- 氩气
- main的返回地址
- 帧指针
- main 中的局部变量
- ...ETC...
常量和全局数据不存储在堆栈中,这就是为什么我也不明白为什么 VULN 常量的长度会影响放置 shellcode 的地址。
希望你能帮我解决这个问题:-)
请注意,我们正在使用 intel x86 架构上的 unix 系统
c++ - 将基类的实例向下转换为派生类
如果它是安全的,我很感兴趣,在某些条件下将基类的实例向下转换(感谢迈克)到派生类。我认为样本是最简单的解释方法:
在我的例子中,类 BaseA 和 BaseB 实现了某种视图概念。但是,它们还包含在派生类中添加更多功能所需的所有数据成员。我知道我可以实现视图以仅保存对提供功能的类的引用。但是,这会带来一些缺点:
- 我需要重写视图类的整个界面。
- 在我的例子中,派生类拥有一个额外的模板参数(回调类型),我想在视图中删除它。因此,视图不能直接引用提供功能的类。
我测试了我的代码,它可以工作,但是,我并不真正相信这种方法。是的,我知道我可以通过虚拟等实现其中的一些功能,但它确实对性能至关重要......
欢迎任何想法,提示
马丁
对于感兴趣的人:我通过以下方式更改了我的设计:
c - linux是否在较低的堆栈端下方提供了保证的不可访问的内存区域?
Linux 是否在具有保证的最小大小的较低堆栈端下方提供不可访问的内存区域?如果存在这样的保证最小尺寸,它是什么?
或者换句话说,我什么时候应该开始担心alloca()
给我指向有效的非堆栈内存的指针?