linux pic是什么

linux中,pic的中文意思为“位置无关代码”,是指代码无论被加载到哪个地址上都可以正常执行。PIC用于生成位置无关的共享库,所谓位置无关,指的是共享库的代码断是只读的,存放在代码段,多个进程可同时公用这份代码段而不需要拷贝副本。

linux pic是什么

本教程操作环境:linux7.3系统、Dell G3电脑。

在linux中,pic全称“Position Independent Code”,中文意思为“位置无关代码”。

一、程序虚拟地址空间及位置有关代码概述

Linux进程从磁盘加载到内存中运行的过程中,内核会为进程分配虚拟地址空间,虚拟地址空间被划分为一块块的区域(Segment),其中最重要的几个区域如下:

linux pic是什么

图1 – 应用程序虚拟地址空间说明

内核地址空间,对所有应用来说都是相同的,这部分地址空间应用无法直接访问。内核地址空间不是本文关注的重点,我们重点关注应用程序的重要的一些SEGMENT。

linux pic是什么

表1 – 应用程序重要segment描述

如果系统没有开启地址随机化(ASLR – Address Space Layout Randomization,地址随机化,后文会介绍),则Linux会将上面表格中的各个segment的地址空间放到一个固定的地址上面。

我们写一个实际的程序来看看在一个Linux X86_64的机器上各个segment的地址是如何排布的,程序如下,覆盖了我们关心的segment。

linux pic是什么

图2 – 虚拟地址空间演示程序

编译

gcc -o addr_test addr_test.c -static

(此处使用静态链接,以便演示位置相关代码的特征)

我们运行这个程序3次,会发现所有的地址都是一个固定值。这是因为在没有开ASLR特性时,系统不会随机化分配程序的虚拟地址空间,程序所有的地址都是按照固定的规则来生成。

linux pic是什么

图3 – 固定segment地址分布

通过objdump命令反汇编后可以看到,对于全局变量和函数调用的访问,汇编指令跟的地址都是固定的,这样的代码我们就称它为位置相关的。

linux pic是什么

图4 – 位置相关代码汇编语句实例

这种代码,由于地址是写死的,只能加载到指定地址上运行,一旦加载地址有变化,由于代码里访问的变量、函数地址是固定的,加载地址变化后程序无法正常执行。

固定地址的方式虽然简单,但是无法实现一些高级特性比如动态库支持。动态库的代码会通过mmap()系统调用来映射到进程的虚拟地址空间,不同的进程中,同一个动态库映射的虚拟地址是不确定的。如果动态库的实现上使用位置相关的代码,则无法达到其任意地址运行的目的,这种情况下我们就需要引入位置无关代码PIC的概念了。

另外,我们可以看到,在没有开启地址随机化特性的系统上,由于程序各个segment的地址是固定的,黑客在攻击时会更加简单(感兴趣的同学可以搜索一下Ret2shellcode或Ret2libc攻击),此时需要引入PIE的概念搭配ASLR一起来防护。

二、位置无关代码PIC和动态库的实现

PIC位置无关代码是指代码无论被加载到哪个地址上都可以正常执行。gcc选项中添加-fPIC会产生相关代码。

PIC用于生成位置无关的共享库,所谓位置无关,指的是共享库的代码断是只读的,存放在代码段,多个进程可同时公用这份代码段而不需要拷贝副本。库中的变量(全局变量和静态变量)通过GOT表访问,而库中的函数,通过PLT->GOT->函数位置进行访问。Linux下编译共享库时,必须加上-fPIC参数,否则在链接时会有错误提示(有资料说AMD64的机器才会出现这种错误,但我在Inter的机器上也出现了)。

关键点#1 – 代码段和数据段的偏移

代码段和数据段之间的偏移,在链接的时候由链接器给出,对于PIC来说非常重要。当链接器将各个目标文件的所有p组合到一起的时候,链接器完全知道每个p的大小和它们之间的相对位置。

linux pic是什么

图5 – 代码段和数据段偏移示例

如上图所示,示例中这里TEXT和DATA时紧紧挨着的,其实无论DATA和TEXT是否是相邻的,链接器都能知道这两个段的偏移。根据这个偏移,可以计算出在TEXT段内任意一条指令相对于DATA段起始地址的相对偏移量。如上图,无论TEXT段被放到了哪个虚拟地址上,假设一条mov指令在TEXT内部的0xe0偏移处,那么我们可以知道,DATA段的相对偏移位置就是:TEXT段的大小 – mov指令在TEXT内部的偏移 = 0xXXXXE000 – 0xXXXX00E0 = 0xDF20

关键点#2 – X86上指令相对偏移的计算

如果使用相对位置进行处理,可以看到代码能够做到位置无关。但在X86平台上mov指令对于数据的引用需要一个绝对地址,那应该怎么办呢?

从“关键点1”里的描述来看,我们如果知道了当前指令的地址,那么就可以计算出数据段的地址。X86平台上没有获取当前指令指针寄存器IP的值的指令(X64上可以直接访问RIP),但可以通过一个小技巧来获取。来看一段伪代码:

linux pic是什么

图6 – X86平台获取指令地址汇编

这段代码在实际运行时,会有以下的事情发生:

当cpu执行 call STUB的时候,会将下一条指令的地址保存到stack上,然后跳到标签STUB处执行。

STUB处的指令是pop ebx,这样就将 “pop ebx”这条指令所在的地址从stack弹出放到了ebx寄存器中,这样就得到了IP寄存器的值。

1.全局偏移表GOT

在理解了前面的几点后,来看看在X86上是如何实现位置无关的数据引用的,此特性是通过全局偏移表global offset table(GOT)来实现的。

GOT是一张在data p中保存的一张表,里面记录了很多地址字段 (entry)。假设一条指令想要引用一个变量,并不是直接去用绝对地址,而是去引用GOT里的一个entry。GOT表在data p中的地址是明确的,GOT的entry包含了变量的绝对地址。

linux pic是什么

图7 – 代码地址和GOT表entry关系

如上图,根据”关键点1″和“关键点2”,我们可以先获取到当前IP的值,然后计算得到GOT表的绝对地址,由于变量的地址entry在GOT表中的偏移也是已知的,因此可以实现位置无关的数据访问。

以一条绝对地址的mov指令的伪代码为例(X86平台):

linux pic是什么

图8 – 位置相关mov指令示例

如果要变成位置无关的代码,则要多几个步骤

linux pic是什么

图9 – 结合GOT实现位置无关的mov指令示例

通过上面的步骤,就可以实现代码访问变量的地址无关化。但是还有一个问题,这个GOT表里存储的VAR_ADDR值又是怎么变成实际的绝对地址的呢?

假设有一个libtest.so,有一个全局变量g_var,我们通过readelf -r libtest.so后,会看到如下的输出

linux pic是什么

图10 – rel.dyn段全局变量重定向描述字段

动态加载器会解析rel.dyn段,当它看到重定向类型为R_386_GLOB_DAT的时候,会做如下操作:将符号g_var实际的地址值替换到偏移0x1fe4处(也就是将Sym.Value的值替换为实际地址值)

2.函数调用的位置无关化实现

从理论上讲,函数的PIC实现也可以通过和数据引用GOT表相同的方式实现位置无关。不直接使用函数的地址,而是通过查GOT来找到实际的函数绝对地址。但实际上函数的PIC特性并不是这么做的,实际情况会复杂一些。为什么不按照和数据引用一样的方式,先来看一个概念:延迟绑定。

对于动态库的函数来说,在没有加载到程序的地址空间前,函数的实际地址都是未知的,动态加载器会处理这些问题,解析出实际地址的过程,这个过程称之为绑定。绑定的动作会消耗一些时间,因为加载器要通过特殊的查表、替换操作。

如果动态库有成百上千个函数接口,而实际的进程只用到了其中的几十个接口,如果全部都在加载的时候进行绑定操作,没有意义并且非常耗时。因此提出了延迟绑定的概念,程序只有在使用到对应接口时才实时地绑定接口地址。

因为有了延迟绑定的需求,所以函数的PIC实现和数据访问的PIC有所区别。为了实现延迟绑定,就额外增加了一个间接表PLT(过程链接表)。

PLT搭配GOT实现延迟绑定的过程如下:

第一次调用函数

linux pic是什么

图11 – 首次调用PIC函数时PLT,GOT关系

首先跳到PLT表对应函数地址PLT[n],然后取出GOT中对应的entry。GOT[n]里保存了实际要跳转的函数的地址,首次执行时此值为PLT[n]的prepare resolver的地址,这里准备了要解析的函数的相关参数,然后到PLT[0]处调用resolver进行解析。

resolver函数会做几件事情:

(1)解析出代码想要调用的func函数的实际地址A

(2)用实际地址A覆盖GOT[n]保存的plt_resolve_addr的值

(3)调用func函数

首次调用后,上图的链接关系会变成下图所示:

linux pic是什么

图12 – 首次调用PIC函数后PLT,GOT关系

随后的调用函数过程,就不需要再走resolver过程了

三、位置无关可执行程序PIE

PIE,全称Position Independent Executable。2000年早期及以前,PIC用于动态库。对于可执行程序来讲,仍然是使用绝对地址链接,它可以使用动态库,但程序本身的各个segment地址仍然是固定的。随着ASLR的出现,可执行程序运行时各个segment的虚拟地址能够随机分布,这样就让攻击者难以预测程序运行地址,让缓存溢出攻击变得更困难。OS在使能ASLR的时候,会检查可执行程序是否是PIE的可执行程序。gcc选项中添加-fPIE会产生相关代码。

四、Linux ASLR机制和PIE的关系

ASLR的全称为 Address Space Layout Randomization。在Linux 2.6.12 中被引入到 Linux 系统,它将进程的某些虚拟地址进行随机化,增大了入侵者预测目的地址的难度,降低应用程序被攻击成功的风险。

在Linux系统上,ASLR有三个级别

linux pic是什么

表2 – ASLR级别描述

ASLR的级别通过两种方式配置:

echo level > /proc/sys/kernel/randomize_va_space

sysctl -w kernel.randomize_va_space=level

例子:

echo 0 > /proc/sys/kernel/randomize_va_space 关闭地址随机化

sysctl -w kernel.randomize_va_space=2 最大级别的地址随机化

我们还是以文章开头的那个程序来说明ASLR在不同级别下时如何表现的,首先在ASLR关闭的情况下,相关地址不变,输出如下:

linux pic是什么

图13 – ASLR=0时虚拟地址空间分配情况

我们把ASLR级别设置为1,运行两次,看看结果:

linux pic是什么

图14 – ASLR=1时虚拟地址空间分配情况

可以看到STACK和MMAP的地址发生了变化。堆、数据段、代码段仍然是固定地址。

接下来我们把ASLR级别设置为2,运行两次,看看结果:

linux pic是什么

图15 – ASLR=2,PIE不启用时虚拟地址空间分配情况

可以看到此时堆的地址也发生了变化,但是我们发现BSS,DATA,TEXT段的地址仍然是固定的,不是说ASLR=2的时候,是完全随机化吗?

这里就引出了PIE和ASLR的关系了。从上面的实验可以看出,如果不对可执行文件做一些特殊处理,ASLR即使在设置为完全随机化的时候,也仅能对STACK,HEAP,MMAP等运行时才分配的地址空间进行随机化,而可执行文件本身的BSS,DATA,TEXT等没有办法随机化。结合文章前面讲到的PIE相关知识,我们也很容易理解这一点,因为编译和链接过程中,如果没有PIE的选项,生成的可执行文件里都是位置相关的代码。如果OS不管这一点,ASLR=2时也将BSS,DATA,TEXT等随意排布,可想而知程序根本不能正常运行起来。

明白了原因,我们在编译时加入PIE选项,然后在ASLR=2时重新运行一下看看结果如何

linux pic是什么

图16 – ASLR=2,PIE启用时虚拟地址空间分配情况

可以看到在PIE打开的情况下,搭配ASLR=2,可以实现各个段的虚拟地址完全随机化分布。

相关推荐:《Linux视频教程》

以上就是linux pic是什么的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/140071.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月30日 23:35:49
下一篇 2025年12月1日 00:10:23

相关推荐

  • LayerZero与Wormhole争霸跨链通信赛道,谁将成为Web3桥梁之王?

    本文将深入探讨两大主流跨链通信协议——LayerZero与Wormhole。通过剖析它们的技术架构、安全模型和生态系统,我们将对比分析两者的核心差异,并探讨在激烈的Web3跨链赛道竞争中,谁更有可能成为未来的领导者,从而解答标题中关于“谁将成为Web3桥梁之王”的问题。 2025主流加密货币交易所官…

    2025年12月8日
    000
  • 币安生态稳居龙头,中心化平台还能支撑Web3发展吗?

    本文将分析以币安为代表的中心化平台在当前Web3浪潮中的定位,并详细阐述它们如何通过自身优势,从资金、技术、用户教育等多个维度,为去中心化的Web3世界提供关键支撑,从而解答标题中的疑问。 2025主流加密货币交易所官网注册地址推荐: 欧易OKX: Binance币安: Gateio芝麻开门: 火币…

    2025年12月8日
    000
  • Jeep Wagoneer Super:没有豪华价格标签的豪华车?

    jeep wagoneer super 欲以奢华气质吸引目光,但其售价是否真比豪华品牌更具吸引力?我们来一探这款备受瞩目的新车。 Jeep 推出全新 Wagoneer Super 版本,标榜“精致而奢华”,却又宣称避免了“豪华品牌的高昂价格”。那么,它真的兑现了这一承诺吗?让我们用纽约式的直率来看个…

    2025年12月8日
    000
  • 到2040年HBAR价格能否达到100美元?Hedera社区热议

    hedera(hbar)能在2040年达到100美元吗?探讨其上涨逻辑、社群情绪与长期增长前景 HBAR价格将在2040年突破百元?Hedera社群热议不断 HBAR是否真有可能在2040年攀升至100美元?CryptoXAiMan提出的这一激进预测点燃了加密社区的讨论热情。本文将深入分析围绕Hed…

    2025年12月8日
    000
  • Neo Pepe Coin:2025年主导加密模因币市场

    neo pepe coin($neop)正在以全新的理念和社区主导的治理模式在模因币市场中崭露头角,成为2025年最具话题性的加密资产之一。 整个加密圈都在热议Neo Pepe Coin($NEOP),它正站在行业风口浪尖。这不仅是一种模因币,更是一场象征自由与去中心化的潮流运动。接下来,我们将一起…

    2025年12月8日
    000
  • 揭开以太坊区块链的神秘面纱|智能合约是如何运作的?

    以太坊区块链不仅仅是记录交易的账本,它的核心在于其强大的智能合约功能。本文将带您了解以太坊区块链的神秘之处,重点阐述智能合约是如何运作的,解答标题中的疑问,帮助您理解这一创新技术的工作原理。 以太坊官网:ethereum.org 什么是智能合约? 智能合约可以理解为存储在区块链上的一段代码,它定义了…

    2025年12月8日
    000
  • Coinbase Ventures支持、Binance上线,Omni能否走向下一阶段?

    本文将围绕Omni项目展开探讨,分析在获得Coinbase Ventures的支持以及成功上线Binance之后,它是否具备了迈向下一发展阶段的动力。 2025主流加密货币交易所官网注册地址推荐: 欧易OKX: Binance币安: Gateio芝麻开门: 火币htx:[ Omni的技术基石 Omn…

    2025年12月8日
    000
  • 去中心化交易所和中心化交易所有啥区别

    中心化交易所和去中心化交易所在资产托管方式、安全性、交易速度、流动性及用户体验等方面存在显著差异。 在数字资产交易领域,存在着两种主要的平台类型:中心化交易所和去中心化交易所。它们在运作模式、安全性、用户控制权以及用户体验等方面存在显著差异。理解这些不同点对于选择适合自身需求的交易平台至关重要。 2…

    2025年12月8日
    000
  • 去中心化稳定币有哪些 去中心化有什么用

    去中心化金融(defi)的兴起带来了新的金融工具和理念,其中去中心化稳定币是重要组成部分,它们旨在提供价值相对稳定的数字资产,同时避免依赖单一中心化实体。这种对中心化控制的规避体现了去中心化技术的核心价值:减少对第三方的信任需求,增强用户主权和系统的抗风险能力。在加密资产交易领域,这种中心化与去中心…

    2025年12月8日
    000
  • NALA币属于山寨币吗_NALA币是山寨币吗

    【权威推荐】2025主流%ignore_a_1%平台合集 Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网直达: 安卓安装包下载: Huobi火币️ 官网直达: 安卓安装包下载: NALA币属于山寨币吗?NALA币是山寨币吗? NALA币近年来在市场中逐渐获得关注,很多投资者会…

    2025年12月8日
    000
  • 比特币、以太坊和其他加密资产的区别

    选择安全可靠的加密货币交易平台需综合考量多个维度,本文推荐币安、欧易、Gate.io、火币和KuCoin五大交易所。1. 币安交易量最大,产品丰富,适合各类投资者;2. 欧易以合约交易和多元金融产品著称,移动端体验佳;3. Gate.io上币种类多,适合挖掘潜力项目。 选择一个安全可靠的加密货币交易…

    2025年12月8日
    000
  • 一文说清楚比特币、以太坊和Solana的区别

    比特币、以太坊和Solana在技术架构、核心目标和生态系统上存在显著差异。1. 比特币采用PoW机制,专注于价值存储,交易速度慢但安全性高;2. 以太坊通过智能合约支持dApps,使用PoS机制,生态成熟但Gas费较高;3. Solana结合PoH与PoS,追求高性能与低费用,适用于高频交易但去中心…

    2025年12月8日
    000
  • 稳定币是什么 和比特币有什么区别

    稳定币与比特币的根本区别在于价值稳定性与用途不同。1. 稳定币与法币挂钩,价值稳定,主要用于交易和保值;2. 比特币具有高波动性和稀缺性,适合作为投资品和价值储存手段;3. 稳定币由中心化机构发行,而比特币通过去中心化产生。 本文将清晰阐述稳定币与比特币之间的根本区别,帮助您理解这两种主流加密资产的…

    2025年12月8日
    000
  • 实用代币与安全代币是什么?有什么区别?

    目录 什么是实用代币?实用代币示例加密货币中的安全令牌是什么?安全令牌示例实用型代币与安全型代币:主要区别目的:获取途径与投资监管:宽松监管 vs. 严格合规法律框架:豪威测试的实际应用流动性:交易便利性与限制法规如何定义实用型代币与证券型代币如何识别代币的类型?探索加密世界中的代币 实用型代币、安…

    2025年12月8日
    000
  • 佩佩预售热潮:第五阶段及迷因币世界的狂野未来

    小佩佩(little pepe)第五阶段预售正在火热进行中,技术革新与社区热度正共同推动其发展。这枚迷因币是否会成为下一个爆点? 加密圈的玩家们注意了!小佩佩($LILPEPE)正在迅速升温。随着第五轮预售正式开启,我们一起来看看究竟是什么在推动它的热潮。 小佩佩:不只是普通的迷因币 让小佩佩脱颖而…

    2025年12月8日
    000
  • 比特币实际市值与市场总值:解读涨势背后的信念

    比特币价格突破 112,000 美元并不仅仅是炒作。通过观察“实现市值”(realized cap)和“市场市值”(market cap),我们能够洞察投资者的信心变化以及持有行为的趋势性转变。 比特币实现市值与市场市值:揭示上涨背后的真正动力 比特币价格一路攀升,成功站上 112,000 美元!这…

    2025年12月8日
    000
  • 什么是代币?与普通硬币有什么区别?一文理解2025年加密货币世界中的代币

    在区块链和web3时代,“代币”这个词无处不在。然而对于许多人来说,新加密货币用户,这仍然是一个模糊而令人困惑的概念。代币不仅仅是数字货币——它们是可编程资产,在去中心化生态系统中发挥着重要作用。本文解释了什么是代币,它与硬币的区别,以及为什么代币在2025年的加密货币经济中至关重要。 代币是什么?…

    2025年12月8日
    000
  • Chainbase($C币)是什么?怎么样?Chainbase全球最大全链数据网络的完整指南

    目录 什么是Chainbase($C代币)?Chainbase 为区块链数据和 AI 解决了哪些问题1. 区块链数据碎片化的挑战2. 缺乏人工智能数据标准3.集中数据控制和访问问题4.可扩展性和性能限制Chainbase Genesis:超数据网络背后的故事Chainbase 功能:四层架构和 AI…

    2025年12月8日 好文分享
    000
  • Solaxy(SOLX币)加密货币是什么?SOLX代币经济学、路线图及未来价格预测

    目录 什么是 Solaxy (SOLX) 加密货币?Solaxy 与 SOLX 代币:主要区别Solaxy发展历史和背景Solaxy Layer 2 的功能和优势1. 先进的 Rollup 技术2. 模块化基础设施设计3. 增强经济激励4.全面的安全审计SOLX 代币经济学和分布SOLX 代币的实用…

    2025年12月8日 好文分享
    000
  • 币圈合约交割是什么意思?季度合约和永续合约有什么区别?

    在数字货币交易市场中,合约交易是一种重要的衍生品交易方式。它允许交易者对特定数字资产的未来价格进行投机,而不必实际持有这些资产。合约交易机制的核心之一便是交割,对于不同类型的合约,交割的机制和影响也有所不同。理解这些概念对于参与合约交易至关重要。 合约交割的含义 1、合约交割是指合约到期时,交易双方…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信