GCC中的pie和fpie选项

CTFshow-pwn入门-前置基础pwn29-pwn31 CTFshow-pwn入门-前置基础pwn29-pwn31(绕过PIE-pwn31) 阅读详情

http://www.lingcc.com/2010/01/08/10609/

 

GCC中的pie和fpie选项

 

 

Position-Independent-Executable是Binutils,glibc和gcc的一个功能,能用来创建介于共享库和通常可执行代码之间的代码–能像共享库一样可重分配地址的程序,这种程序必须连接到Scrt1.o。标准的可执行程序需要固定的地址,并且只有被装载到这个地址时,程序才能正确执行。PIE能使程序像共享库一样在主存任何位置装载,这需要将程序编译成位置无关,并链接为ELF共享对象。

引入PIE的原因是让程序能装载在随机的地址,通常情况下,内核都在固定的地址运行,如果能改用位置无关,那攻击者就很难借助系统中的可执行码实施攻击了。类似缓冲区溢出之类的攻击将无法实施。而且这种安全提升的代价很小

谈到PIE就不得不说说Pax和Grsec内核。这两个东西都是为了构建坚不可摧到安全系统而准备的。PaX是Linux内核安全增强补丁,它能在两方面保证安全性,一是ASLR(Address Space Layout Randomization,地址空间分布随机化),这是一种将所有数据装载到内存时都随机化地址的方式,当使用PIE选项编译应用时,PaX能将应用的地址做随机加法;二是能提供不可执行的内存空间,这样就能使得攻击者放入内存中的恶意代码不可执行。不过PaX官网上能支持的最新内核是2.6.27,已经是一年前的更新了。Grsec也时类似的内核补丁,更新较为频繁能支持最新的2.6.32内核。这两种方式都能将内核完全位置无关,除了Grub和Glibc中无法位置无关的汇编码。

PIE最早由RedHat的人实现,他在连接起上增加了-pie选项,这样使用-fPIE编译的对象就能通过连接器得到位置无关可执行程序。fPIE和fPIC有些不同。可以参考Gcc和Open64中的-fPIC选项.

gcc中的-fpic选项,使用于在目标机支持时,编译共享库时使用。编译出的代码将通过全局偏移表(Global Offset Table)中的常数地址访存,动态装载器将在程序开始执行时解析GOT表项(注意,动态装载器操作系统的一部分,连接器是GCC的一部分).而gcc中的-fPIC选项则是针对某些特殊机型做了特殊处理,比如适合动态链接并能避免超出GOT大小限制之类的错误。而Open64仅仅支持不会导致GOT表溢出的PIC编译。
gcc中的-fpie和-fPIE选项和fpic及fPIC很相似,但不同的是,除了生成为位置无关代码外,还能假定代码是属于本程序。通常这些选项会和GCC链接时的-pie选项一起使用。fPIE选项仅能在编译可执行码时用,不能用于编译库。所以,如果想要PIE的程序,需要你除了在gcc增加-fPIE选项外,还需要在ld时增加-pie选项才能产生这种代码。即gcc -fpie -pie来编译程序。单独使用哪一个都无法达到效果。
你可以使用file命令来查看当前的可执行文件是不是PIE的。

下面是本博编译helloword的显示。可以看出,可执行文件属性从executable变成了shared object.
$ gcc  helloworld.c
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
$ gcc -fpie -pie helloworld.c
$ file a.out
a.out: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

接下来,我们就能实验了,使用strace命令来查看这两个a.out执行情况了。关于strace命令,可以参考strace命令介绍
在博主电脑上,有PIE时,执行第一个brk(0)系统调用时,返回的地址一直是变化的。而无PIE时,brk(O)系统调用返回地址一直不变。内容太多,不再贴出。

注:
linux系统调用brk():
linux系统内部分配内存的系统调用,malloc()其实也是调用的brk().直接修改堆的大小,返回新内存区域的结束地址。

参考:
http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html
http://www.linuxfromscratch.org/hlfs/view/unstable/glibc-2.6/chapter02/pie.html
http://www.gentoo.org/proj/en/hardened/hardened-toolchain.xml
http://www.gentoo.org/proj/en/hardened/pax-quickstart.xml
http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html
<Understanding Linux Kernel> 3rd Edition Page32 , Page395

Linux下 ASLR功能与 -no-pie 选项说明 Linux下 ASLR功能与 -no-pie 选项说明 阅读详情

相关推荐

gcc 若干安全相关选项

1. FORTIFY_SOURCE(buffer over-flow 防御) 参考:http://fedoraproject.org/wiki/Security/Features#Compile_Time_Buffer_Checks_.28FORTIFY_SOURCE.29 http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html 此

youngtiger86的专栏 5171

关于-fPIC, -fpic, -fpie, -fPIE的一点理解

最近在编译动态库文件,用到-fPIC编译选项。查了下GNU的手册: -fpic Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code accesses all constant addresses th...

huangkangying的专栏 5万+

别再死记公式了!用HFSS/CST手把手教你仿真一个2.4GHz WiFi的PIFA天线(附参数调试技巧)

本文详细介绍了使用HFSS和CST仿真软件设计2.4GHz WiFi PIFA天线的全流程,包括建模准备、分步操作指南和参数调试技巧。通过可视化结果和实战案例,帮助工程师快速掌握天线设计的关键参数优化方法,提升辐射性能和工作效率。

weixin_31682031的博客 336

【gcc】gcc编译参数-fPIC、-fPIE、-pie

动态库的编译:使用-fPIC来生成位置无关的目标文件,以便构建动态库(.so文件)。这是标准的做法,保证库可以在不同的进程地址空间中正确加载和运行。可执行文件的编译如果不使用-pie选项来链接,生成的可执行文件不需要位置无关性,可以选择-fPIC-fPIE或者不使用任何这两个选项。如果使用-pie选项来链接,必须使用-fPIC或-fPIE编译目标文件,这样才能生成位置无关的可执行文件(PIE)。-fPIE的价值:虽然-fPIE可以被-fPIC覆盖,但在生成位置无关的可执行文件时,-fPIE。

W__winter的博客 3843

国产数据库迁移必看:达梦到ES的CDC方案优化全记录(含完整代码)

本文详细记录了从达梦数据库到Elasticsearch的CDC方案优化全过程,涵盖触发器方案局限性、Debezium架构优势及完整代码实现。通过Flink集成和性能调优,实现毫秒级延迟同步,显著降低数据库负载,为国产数据库迁移提供可落地的技术方案。

weixin_29079671的博客 500

论文阅读 Quantum Convolutional neural network

在传统的局域序参量(如磁化强度 ⟨Xi⟩)无法有效区分某些拓扑相(如 Haldane 相)时,字符串序参量(SOP)提供了一种方法来识别这些相。字符串序参量的定义通常涉及多个远离的站点之间的长程关联,通常具有如下形式:Zi,Xk,Zj是泡利矩阵(Pauli operators)。指数项 eiπ∑k=ijXk表示一个相位因子。这意味着我们要计算两个远离站点 i,j 的Z 分量的关联,同时考虑它们之间的X 作用。这个非局域的字符串序参量可以用来检测对称保护拓扑(SPT)相。

m0_54373077的博客 2004

关于-fPIC, -fPIE的一点理解

查了下GNU的手册 -fpic Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code accesses all constant addresses through a global offset table (GOT). The dynamic loader resolves the GOT entries w

newbeixue的博客 2929

Claude skill-creator插件深度解析:从创建到优化的完整技能工程化体系

摘要:skill-creator是Anthropic推出的Claude技能开发插件,提供从创建到优化的全流程工程化支持。其核心架构采用渐进式披露机制和多Agent协作模式,包含Grader、Analyzer等专业评估组件。该插件支持自动化评测系统,通过测试用例管理、并行执行和结果聚合实现技能验证;提供迭代优化算法,基于数据驱动改进技能性能。典型应用场景包括标准化技能开发、自动化测试验证和触发优化,显著降低开发门槛并提升技能质量。

虚心若愚 989

【Linux】【开发】gcc中的-pie和-fPIE选项

- 本文介绍了GCC编译器中的PIE(位置无关可执行文件)特性及相关选项。

一介草民,只为生活。 1089

ESP32 双雷达融合盲区车辆接近预警系统设计与实现

/ 超声波传感器引脚// 触发引脚// 回声引脚// 预警模块引脚// 蜂鸣器引脚// LED引脚// 串口配置(毫米波雷达用UART2)#define BAUD_RATE 115200 // 雷达串口波特率(IWR6843默认配置)// 预警阈值(可根据实际需求调整)// 高危区阈值(3m)// 预警区阈值(10m)// 传感器数据存储// 毫米波雷达距离(m)// 毫米波雷达速度(km/h)// 超声波距离(m)// 融合后距离(m)

weixin_42300449的博客 746

银河麒麟V10等保加固清单:安全基线配置一篇搞定(附逐项检查表)

通过限制使用SSH直接以root身份登录,禁用公钥登录的方式加强SSH服务的安全性。更改SSH默认端口可在一定程度上防止被黑客使用大批量扫描方式攻击。通过修改SSH的配置文件限制可以使用SSH服务远程管理的主机。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 818

GCC选项pie、fPIE、fPIC的区别

FPIC用于生成位置无关的动态库代码(.so文件),通过GOT访问变量;FPIE实现可执行文件的地址随机化,需配合-pie选项;PIE是链接阶段选项,增强安全性防范ROP攻击。关键区别:FPIC针对动态库,FPIE用于主程序,PIE需与前者配合使用。

louObaichu的专栏 448

SFT看这一篇就够了!万字长文:监督微调(Supervised Fine-Tuning, SFT)技术全解析【从理论到实战】

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。分享AI算法干货、技术心得。欢迎关注,一起探索技术的无限可能!

大F子的智能小课 712

arm linux gcc fpic,【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义

【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义-fpicGenerate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code accesses all constant...

weixin_34237941的博客 817

Open3d Qt的环境配置

目前统一使用qt6配置,open3d中可视化功能目前使用vtk代替,语言为c++。

阁楼 920

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linux 内核fpic,Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义

-fpicGenerate position-independent code (PIC) suitable for use in a shared library,if supported for the target machine. Such code accesses all constant addressesthrough a global offset table (GOT). Th...

weixin_35676444的博客 2758

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android demo 的only position independent executables (PIE) are supported错误与GCC中的pie和fpie选项

在android 系统中,./ReadWriteProc.out ./fanbingbing.jpg ./fanbingbing.jpg &lt; "./ReadWriteProc.out": error: only position independent executables (PIE) are supported. 需要在编译中,设置-...

qingsong1001的专栏 1962

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

0136__应用程序设计:在动态库中如何调用外部函数?

https://www.cnblogs.com/sewain/p/14798200.html

行潇 365

gcc 安全编译选项参数

fpie‌ 主要影响编译过程中代码的位置无关性生成,而 ‌-pie‌ 则确保最终生成的可执行文件具有位置无关的特性,两者共同作用,使得程序更加安全、灵活,并提高了与不同平台兼容性。1. LDFLAGS += -Wl,-z,relro,-z,now 这个是为了防止内存越界,一旦越界,就会segmentation fault(这个是连接参数)也就是说-fpie 是编译参数, 而-pie 是连接参数。-fPIC:生成位置无关的代码,适用于动态链接。-fPIE:为可执行文件生成位置无关代码。

sdc20102010的博客 672

eclipse等IDE 增加GCC 安全编译选项

以前对于GCC的安全编译选项,一点都没有了解过,反正程序功能只要满足需求,也不会去关注是不是安全。但是这次公司的项目合作方对于安全这一块非常看重,姑且不说软硬件方面的加密,只说对于程序编译选项的要求,就有如下那么多。 C语言需开启编译选项: -Wl -z relro -z now -Wl -z noexecstack -fPIC -fPIE -pie -fstack-protector-all/-fstack-protector-strong(二选1) -D_FORTI...

u011983700的专栏 1078

relocation R_X86_64_32 against `.xxx‘ can not be used when making a PIE object; recompile with -fPIE

linux编译遇到的问题

m0_38018715的博客 3835

别再只盯着缓冲区溢出了:聊聊ASLR在Linux内核与GCC编译中的那些实战配置

本文深入探讨了ASLR(Address Space Layout Randomization)在Linux内核与GCC编译中的实战配置,揭示了其在现代系统中的复杂实现与调优技巧。通过分析内核参数、GCC编译选项及与其他安全机制的协同作用,帮助开发者与运维人员提升系统安全性并优化性能。

dengxiangbao3167的博客 341

告别GCC:用Android NDK和Android.mk为嵌入式开发板编译可执行文件

本文详细介绍了如何利用Android NDK和Android.mk为嵌入式开发板编译高效可执行文件,替代传统GCC工具链。通过分析NDK的系统级兼容保障、多架构支持和集成调试工具等优势,提供从基础配置到安全编译、多平台适配的完整解决方案,并分享实战编译流程、部署调试技巧及工程化实践建议,帮助开发者提升嵌入式开发效率。

weixin_30660027的博客 246
上一篇: 动态符号链接的细节
下一篇: GNU工具链学习笔记
ivan240
博客等级 码龄21年 39粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值