当前位置:  开发笔记 > 编程语言 > 正文

0xDEADBEEF等效于64位开发?

如何解决《0xDEADBEEF等效于64位开发?》经验,为你挑选了8个好方法。

对于32位系统(无论是Linux,Mac OS或Windows,PowerPC还是x86)的C++开发,我已经初始化了指针,否则这些指针将被定义(例如,它们无法立即获得正确的值),如下所示:

int *pInt = reinterpret_cast(0xDEADBEEF);

(为了节省打字和DRY,右侧通常是常数,例如BAD_PTR.)

如果在获得正确值之前取消引用pInt,那么它将在大多数系统上立即崩溃(而不是在某些内存被覆盖或进入非常长的循环时崩溃).

当然,行为取决于底层硬件(从用户进程获取奇数地址0xDEADBEEF的4字节整数可能完全有效),但崩溃对于我迄今为止开发的所有系统都是100%可靠的( Mac OS 68xxx,Mac OS PowerPC,Linux Redhat Pentium,W​​indows GUI Pentium,W​​indows控制台Pentium).例如,在PowerPC上,从奇数地址获取4字节整数是非法的(总线故障).

在64位系统上,这有什么好处呢?



1> chaos..:

0xBADC0FFEE0DDF00D


@Joshua:1.无论我喜欢哪里,我都可以将我的页面映射出来.2.这是一个非常危险的假设(也许它与你在x86设置上的当前操作系统一样,但这是依赖于实现的),如果堆栈从0xBADCOFFEE0DFOOD-0x1000开始怎么办?堆栈已经在随机的地方开始,这样做是为了尝试使开发更加困难,除了技术原因之外.
这个特殊的优势在于,当用户堆增长时,随着内核堆的增长,你需要使用yottabytes的内存来实现这个值.

2> Thomas Owens..:

根据Wikipedia,BADC0FFEE0DDF00D用于IBM RS/6000 64位系统,以指示未初始化的CPU寄存器.



3> zwol..:

目前大多数64位系统只允许使用地址空间最低的2 48 -2 52位; 地址的高位必须为全零.一些芯片(例如amd64)也让你使用最高的 2 48 -2 52.超出这些范围的地址不能映射到可访问的内存; 硬件根本不允许它.

因此,我建议你使用一个接近2 63的值,这是一个可能可用的空间.如果前四个十六进制数字是7ff8,则该值将是双精度浮点NaN,这很方便.所以我建议的可爱的十六进制短语是0x7FF8BADFBADFBADF.

顺便说一句,你真的不想使用接近于0的值,因为这使得很难分辨出NULL 的偏移解引 - 例如结构成员访问 - 来自对毒物模式的取消引用.


每个感兴趣的CPU的体系结构手册将告诉您可以使用多少位地址空间.例如,[AMD64体系结构程序员手册,第2卷(系统编程)](http://support.amd.com/us/Processor_TechDocs/24593.pdf)在1.1.3节中说明并非所有64位的地址空间必须是可用的,并且不可用的高位必须为全零或全一,然后在5.3.3节中向您显示当前实现仅允许使用低48位.

4> Noah Watkins..:

一般不要紧究竟什么模式,你写的,它很重要,你可以识别以确定在问题发生的格局.碰巧在Linux内核中经常选择这些,以便在解除引用地址时可以捕获它们.

看一下include/linux/poison.h中的Linux内核.此文件包含许多不同内核子系统的不同中毒值.没有一种合适的毒药价值.

此外,您可以检查Linux内核源代码树中的每个体系结构包含文件,以获取有关特定体系结构上使用的内容的信息.



5> Michael Kova..:

我假设你已经打折了NULL(即没有类型转换的0).这绝对是最安全的选择,因为理论上,有效指针可以指向内存地址0xDEADBEEF(或任何其他非NULL内存地址).


对于指针,应使用Always NULL/0.0xDEADBEEF和其他十六进制值用于填充由堆管理器函数处理的最近分配但未初始化的,最近释放的,不应该被访问的任何更多内存区域(这也可能是真的)对于堆栈)...
NULL/0指针不一定在内存中表示为0字节.虽然我不知道任何系统哪里有什么不同.
没有人见过NULL的内存映射,因为编译器保证永远不会使用NULL内存位置:"......空指针明确指向无处;它不是任何对象或函数的地址." 请参阅:http://c-faq.com/null/null1.html
@Mike Koval,嗯,这根本不是真的.我已将内存映射为NULL.事实上,这并不罕见,快速搜索"空指针解除引用漏洞"应该给你很多例子.这看起来可能有一些高级信息:http://blog.cr0.org/2009/06/bypassing-linux-null-pointer.html
@Mike:这是事实,但是C规范没有定义尝试取消引用NULL指针的行为.因此,平台接受读取和写入*NULL是合法的(尽管是非典型的).

6> Joshua..:

0xDEADBEEFBAADF00D 可能有用.



7> Ned Batcheld..:

我没有一个很好的选择,但这里有一个可用于制作短语的十六进制单词列表.



8> LostMohican..:

我认为两个0xDEADBEEF应该足够了..

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有