linux程序保护机制gcc编译选项

预备知识:

计算机内存的结构通常包括以下几个主要部分:
1.代码段(Code Segment):也称为文本段,存储程序的可执行指令。代码段是被标记为可执行的,程序从代码段中获取指令并执行。

2.数据段(Data Segment):也称为全局数据段,存储全局变量和静态变量的数据。数据段在程序加载时被初始化,其大小在编译时确定。

3.堆(Heap):堆是用于动态分配内存的区域。在堆上分配的内存由程序员手动管理,可以通过函数(如malloc(0和free0)进行申请和释放。堆的大小可以根据需要动态增长或缩小。

4.栈(Stack):栈是用于管理函数调用和局部变量的内存区域。栈上的内存由编译器自动管理,存储函数调用过程中的局部变量、函数参数、返回地址等数据。栈的大小是固定的,并且在程序运行期间是动态变化的。

5.常量区(Constant Area):常量区存储常量值,如字符串常量和全局的const修饰的变量。这些常量在程序运行期间是不可修改的。

6.未初始化数据段(BSS Segment):也称为bss段,存储未初始化的全局变量和静态变量。在程序加载时,未初始化的变量会被初始化为0或空值。

example code:

#include <stdio.h>int main() {printf("Hello, World!\n");return 0;
}
gcc hello.c -o hello

得到hello可执行文件

1. -pie

作用: -pie是一个编译器选项,用于在生成可执行文件时将其编译为位置无关可执行文件(Position Independent Executable,PIE)。PIE是一种可执行文件格式,它可以在内存中加载的任何地址上执行,而不依赖于固定的基地址。适用于需要增加代码执行的安全性的场景。

-pie参数与动态链接有密切的关系。具体来说,-pie参数用于生成位置无关的可执行文件,而位置无关的可执行文件通常与动态链接配合使用。

在动态链接中,可执行文件在运行时,需要依赖于动态链接器(ld.so或ld-linux.so)加载共享库(例如.so文件),以填充程序中的符号引用。这种方式允许多个可执行文件共享同一个共享库,减少内存使用并提高可执行文件的灵活性。

使用方法:

gcc -pie hello.c -o hello

验证-pie参数是否生效:

objdump -x hello

(objdump主要用于静态分析和反汇编目标文件、可执行文件和共享库)
若查找到与重定位相关的节,例如.rela.dyn和.rela.plt。如果这些节存在,则说明-pie参数已经生效,并且程序是以位置无关的方式编译的。
在这里插入图片描述
还可以查找DYNAMIC标志,以验证是否启用了动态链接。
使用readelf命令查看可执行文件的头部信息。

readelf -l hello

在输出中查找INTERP字段。如果该字段存在,并且显示了动态链接器的路径(如/lib/ld-linux.so.2),则说明可执行文件启用了动态链接。
在这里插入图片描述

2. -z noexecstack

-z noexecstack 是一个用于在Linux系统上编译可执行文件时的安全特性选项。当启用此选项时,它将堆栈标记为不可执行,意味着无法从堆栈中执行代码。这有助于防止某些类型的安全漏洞,如缓冲区溢出攻击。

使用方法:

要在编译过程中启用 -z noexecstack 选项,您需要使用兼容的编译器,如GCC,并将选项作为命令行参数传递。以下是一个使用此选项编译C程序的示例:

gcc -z noexecstack hello.c -o hello

验证 -z noexecstack 参数是否生效:

使用 readelf 命令来检查生成的可执行文件的头部信息。readelf 是一个用于查看和分析 ELF (Executable and Linkable Format) 格式文件的工具。
运行以下命令来查看可执行文件的头部信息:

readelf -l hello

在输出中查找 GNU_STACK 部分。如果 GNU_STACK 部分中存在 RWE(可读可写可执行)标志,则表示 -z noexecstack 选项未生效。如果 GNU_STACK 部分中存在 RW(可读可写)标志,则表示 -z noexecstack 选项生效。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录day01

数组理论基础 ● 思维不难&#xff0c;主要是考察对代码的掌控能力 ● 内存中的存储方式&#xff1a;存放在连续内存空间上的相同类型数据的集合 ● 数组可以通过下标索引获取到下标对应的数据 ● 数组下标从0开始 ● 因为内存空间地址连续&#xff0c;因此删除或增加元素的时…

现代C++中的从头开始深度学习:【4/8】梯度下降

一、说明 在本系列中&#xff0c;我们将学习如何仅使用普通和现代C编写必须知道的深度学习算法&#xff0c;例如卷积、反向传播、激活函数、优化器、深度神经网络等。 在这个故事中&#xff0c;我们将通过引入梯度下降算法来介绍数据中 2D 卷积核的拟合。我们将使用卷积和上一个…

大数据技术之Hadoop:HDFS集群安装篇(三)

目录 分布式文件系统HDFS安装篇 一、为什么海量数据需要分布式存储 二、 分布式的基础架构分析 三、 HDFS的基础架构 四 HDFS集群环境部署 4.1 下载安装包 4.2 集群规划 4.3 上传解压 4.4 配置HDFS集群 4.5 准备数据目录 4.6 分发hadoop到其他服务器 4.7 配置环境变…

OpenStack监控工具

OpenStack是一个开源的云计算管理平台项目&#xff0c;是一系列软件开源项目的组合。由NASA和Rackspace合作研发并发起&#xff0c;以Apache许可证&#xff08;Apache软件基金会发布的一个自由软件许可证&#xff09;授权。 OpenStack为私有云和公有云提供可扩展的弹性的云计算…

rancher证书过期,更新操作

看着比其他的都靠谱&#xff0c;我这里转载一下&#xff0c;以变下次找不到了 http://t.csdn.cn/p1QLU

Cadvisor+InfluxDB+Grafan+Prometheus(详解)

目录 一、CadvisorInfluxDBGrafan案例概述 &#xff08;一&#xff09;Cadvisor Cadvisor 产品特点&#xff1a; &#xff08;二&#xff09;InfluxDB InfluxDB应用场景&#xff1a; InfluxDB主要功能&#xff1a; InfluxDB主要特点&#xff1a; &#xff08;三&#…

·[K8S:使用calico网络插件]:解决集群节点NotReady问题

文章目录 一&#xff1a;安装calico&#xff1a;1.1&#xff1a;weget安装Colico网络通信插件&#xff1a;1.2&#xff1a;修改calico.yaml网卡相关配置&#xff1a;1.2.1&#xff1a;查看本机ip 网卡相关信息&#xff1a;1.2.2&#xff1a;修改calico.yaml网卡interface相关信…

深度解读|一站式ABI平台 Smartbi Insight V11 能力再升级

纵观过去&#xff0c;我们发现汽车和BI的发展有异曲同工之妙。 100来年&#xff0c;汽车的动力从蒸汽到燃油再到新能源&#xff0c;汽车的操控方式从手动到自动再到智能无人驾驶。而在BI领域&#xff0c;自1958年BI的概念提出后&#xff0c;底层数据准备从报表开发、Cube多维模…

【CI/CD】Git Flow 分支模型

Git Flow 分支模型 1.前言 Git Flow 模型&#xff08;本文所阐述的分支模型&#xff09;构思于 2010 年&#xff0c;也就是 Git 诞生后不久&#xff0c;距今已有 10 多年。在这 10 多年中&#xff0c;Git Flow 在许多软件团队中大受欢迎。 在这 10 多年里&#xff0c;Git 本身…

最大子数组和【力扣53】

一、解题思路 Max[i]表示&#xff1a;以nums[i]为开头的所有连续子数组和的最大值。 由此可以推出Max[i-1]和Max[i]的关系&#xff1a; 若Max[i]>0&#xff1a;Max[i-1]nums[i-1]Max[i]&#xff1b; 否则&#xff1a;Max[i-1]nums[i-1]&#xff1b; 则ansMAX&#xff0…

java try-with-resources自动关闭资源

try-with-resources 是 Java 7 引入的一种语法&#xff0c;用于自动关闭实现了 AutoCloseable 接口的资源。它可以简化代码中关闭资源的操作&#xff0c;确保资源得到正确释放&#xff0c;避免内存泄漏。 使用 try-with-resources 的语法如下&#xff1a; try (资源的声明和初…

RISC-V走向开放服务器规范

原文&#xff1a;RISC-V Moving Toward Open Server Specification 作者&#xff1a;Agam Shah 转载自&#xff1a;https://www.hpcwire.com/2023/07/24/risc-v-moving-toward-open-server-specification/ 中文翻译&#xff1a; 2023年7月24日 RISC-V International目前正…

亚马逊 EC2服务器下部署java环境

1. jdk 1.8 安装 1.1 下载jdk包 官网 Java Downloads | Oracle tar.gz 包 下载下来 1.2 本地连接 服务器 我用的是亚马逊的ec2 系统是 ubuntu 的 ssh工具是 Mobaxterm , 公有dns 创建实例时的秘钥 链接 Mobaxterm 因为使用的 ubuntu 所以登录的 名称 就是 ubuntu 然后 …

ts项目中引入js包,如vue-simple-uploader

有些包如vue-simple-uploader&#xff0c;使用npm下载后&#xff0c;npm仓库中没有对应的types类型声明&#xff0c;会报错&#xff0c;没有找到对应的types类型文件。 解决&#xff1a; 在项目根目录下&#xff0c;创建自定义的类型声明文件&#xff0c;如&#xff0c;self-…

【Ubuntu】简化反向代理和个性化标签页体验

本文将介绍如何使用Docker部署Nginx Proxy Manager和OneNav&#xff0c;两个功能强大且易用的工具。Nginx Proxy Manager用于简化和管理Nginx反向代理服务器的配置&#xff0c;而OneNav则提供个性化的新标签页体验和导航功能。通过本文的指导&#xff0c;您将学习如何安装和配置…

vue组件通信的方式?

父子通信&#xff1a; 1、父传子&#xff1a;在父组件的子组件标签绑定一个自定义属性&#xff0c;子组件通过props获取父组件传递的数据。 //父 <child :data"list" del"idx > list.splice(idx, 1)" ref"child" :isShow.sync"isS…

Redis可以用作数据库吗?它的适用场景是什么?

是的&#xff0c;Redis可以用作数据库。虽然Redis通常被认为是一个内存数据库&#xff08;in-memory database&#xff09;&#xff0c;但它也可以通过持久化机制将数据保存在磁盘上&#xff0c;以便在重启后恢复数据。 Redis的适用场景包括但不限于以下几个方面&#xff1a; …

程序使用Microsoft.XMLHTTP对象请求https时出错解决

程序中使用Microsoft.XMLHTTP组件请求https时出现如下错误&#xff1a; 出错程序代码示例&#xff1a; strUrl "https://www.xxx.com/xxx.asp?id11" dim objXmlHttp set objXmlHttp Server.CreateObject("Microsoft.XMLHTTP") objXmlHttp.open "…

电脑关机程序

//关机程序 1、电脑运行起来后&#xff0c;1分钟内关机。 2、如果输入&#xff1a;我是猪。就取消关机。 #include<stdio.h> #include<string.h> int main() { char input[20] { 0 }; system("shutdown -s -t 60"); again: printf(&quo…

Cesium相机理解

关于cesium相机&#xff0c;包括里面内部原理网上有很多人讲的都很清楚了&#xff0c;我感觉这两个人写的都挺好得&#xff1a; 相机 Camera | Cesium 入门教程 (syzdev.cn) Cesium中的相机—setView&lookAtTransform_cesium setview_云上飞47636962的博客-CSDN博客上面这…