解密虚拟内存0x400000以下的地方

2024-09-05 04:58

本文主要是介绍解密虚拟内存0x400000以下的地方,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 前言

  最近看CSAPP时,对以前没有仔细注意的一处知识盲区产生了兴趣,所以进行了深入研究,并写下此文一记录。

二. 问题

  二话不说直接上图。下图是CSAPP第七章的虚拟内存分析图。书中提到

在X86-64位Linux系统中,代码段总是从地址0x400000处开始,后面是数据段。堆在数据段之后,通过调用malloc向上增长…

在这里插入图片描述
  但是0X400000以下呢?为什么没有提到呢?翻遍全书,都没有一处提到0至0X400000处的空间是做什么用的。实际运行以下cat /proc/self/maps,发现结果的确如此

在这里插入图片描述

经过大量的搜索、查阅文献,最终找到了答案,下面就整理一下,由于Linux和Windows存在不同的情况,因此分开整理。

三. Linux

  先来看看这个0X400000的地址在哪儿规定的。实际上在源码/usr/lib/ldscripts/elf_x86_64.x中可以找到如下定义

PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); \. = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;

  同时,对于X86-64位Linux系统而言,空出低端内存最重要的作用是为了保证空指针可以触发访问缺失页的异常SIGSEGV,而不是访问了不该访问的资源从而导致了奇奇怪怪的问题。可能你回好奇,为什么这里不直接从0x0000001开始做数据段呢?理论上说一个0就够用了呀?
  这可以归结为以下几点原因:

  • 考虑到多级页表的分配,省一点点不如多省一点,反正64位空间足够用,不再乎几页
  • 默认页大小一般是4KB,但是实际会存在很多大页机制,而大页的大小默认是4MB

  再追问一个问题,是否能少分配一点呢?答案是当然可以,只要大于65536即可。65536的规定来自于mmap_min_addr,可以通过/proc/sys/vm/mmap_min_addr查看。

四. Windows

  事情到了windows这里一下就变得不一样了。下图摘自《程序员的自我修养:链接、装载和库》。由图可见,windows操作系统的内存分配十分之奔放,相对于Linux,有着以下特色

  • 有多个栈空间供于多线程使用,栈的分布不像Linux一样死板,所以0x400000以下的地方很可能是在使用的
  • HeapCreate管理的堆不一定向上增长,而是甚至可能向下增长
  • 堆最大的大小应如heap5所示,大约为1.5GB-1.7GB

在这里插入图片描述

总结

  总结一下,对于Linux而言,0X400000以下的空间默认不映射,从而起到保护程序安全的作用。对于windows而言,程序安全交由操作系统保证,因此最大限度利用资源,地址可以低到0X400000以下。

参考文献

[1] CSAPP
[2] 程序员的自我修养:链接、装载和库
[3] /usr/lib/ldscripts/elf_x86_64.x
[4] https://wiki.debian.org/mmap_min_addr

这篇关于解密虚拟内存0x400000以下的地方的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138011

相关文章

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

【C#生态园】解密C# Web框架:选对框架,事半功倍

探秘C# Web开发利器:六款高性能框架与库详细解读 前言 在当今的软件开发领域,C#作为一种多用途编程语言,被广泛应用于各种类型的应用程序开发。特别是在Web开发领域,有许多优秀的C# Web框架和库,本文将对其中一些备受关注的框架进行介绍和比较,帮助读者更好地选择适合其项目需求的工具。 欢迎订阅专栏:C#生态园 文章目录 探秘C# Web开发利器:六款高性能框架与库详细解

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个 嫌疑犯的一个。以下为4个嫌疑犯的供词。

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个 嫌疑犯的一个。以下为4个嫌疑犯的供词。 A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。  static void Main()         {             int killer = 0;             fo

二分猜数易错的地方

今天做简单的二分猜数问题,while循环总是跳不出去,搞了好久才弄好了。。。好几次都这样,总结一下吧 while(left <= right){int mid = (left+right)/2;if(ok(mid)) left = mid+1,ans = mid;//记录结果,要不然跳不出循环,视题目而定,ans也可以写在下面else right = mid-1;}

详解BitLocker模式及加密数据和解密方法及无法访问解决之道

BitLocker主要有两种工作模式:TPM模式和U盘模式,同时为了实现更高程度的安全,我们还可以同时启用这两种模式。 BitLocker 自动设备加密在全新安装体验 (OOBE) 期间启动。 但是,只有在用户使用 Microsoft 帐户或 Azure Active Directory 帐户登录后,才会启用(提供)保护。 在此之前,保护已暂停,数据不受保护。 使用本地帐户不会启用 BitLoc

RC4加密解密算法123

RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码。 RC4是流密码streamcipher中的一种,为序列密码。RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇。起初该算法是商业机密,直到1994年,它才公诸于众。由于RC4具有算法简单,运算速度快,软硬件实现都

如何为 MongoDB 3.0.4 以下版本选择合适的 PyMongo 版本

在使用 MongoDB 时,开发者通常会使用 Python 的 pymongo 库来与 MongoDB 进行交互。然而,不同版本的 MongoDB 需要匹配相应版本的 pymongo 才能正常运行。如果你的 MongoDB 版本较低(例如 3.0.4 以下),而使用了不兼容的 pymongo 版本,就会遇到连接失败或功能异常的问题。 在这篇文章中,我们将介绍如何为 MongoDB 3.0.4 以