ASLR 和 PIE

前言

ASLR(Address Space Layout Randomization,地址空间随机化)是一种内存攻击缓解技术,是一种操作系统用来抵御缓冲区溢出攻击的内存保护机制。这种技术使得系统上运行的进程的内存地址无法被预测,使得与这些进程有关的漏洞变得更加难以利用。
它最早于 2001 年出现在 PaX 项目中,于 2005 年正式成为 Linux 的一部分,如今已经广泛使用在各类操作系统中。

在 Linux 上,ASLR 的全局配置 /proc/sys/kernel/randomize_va_space 有三种情况:
0 表示关闭 ASLR;
1 表示部分开启(将 mmap 的基址、stack 和 vdso 页面随机化);
2 表示完全开启(在部分开启的基础上增加 heap 的随机化)
在这里插入图片描述

实例

环境:ARM Linux 32bit,qemu

test.c

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main()
{
	int stack;
	int *heap;
	void *libc;

	heap = malloc(sizeof(int));
	libc = dlopen("libc.so.6", RTLD_NOW | RTLD_GLOBAL);

	printf("executable : %p\n", &main);
	printf("system@plt : %p\n", &system);
	printf("heap       : %p\n", heap);
	printf("stack      : %p\n", &stack);
	printf("1ibc       : %p\n", libc);

	free(heap);

	return 0;
}

Makefile

TARGET=test

CC=/home/liyongjun/project/board/buildroot/Vexpress_2/host/bin/arm-linux-gcc

all:
	${CC} ${TARGET}.c -o ${TARGET}.out -Wall -no-pie

cp:
	cp ${TARGET}.out ~/tftp/

clean:
	rm *.out

注意,编译时使用 -no-pie 选项关闭了 PIE,因为开启 PIE 会影响 heap 随机化(原因未追查)。

测试

从 host 机下载 test.out 到 ARM Linux 系统,然后针对 ASLR 不同配置,进行测试对比
一、关闭 ASLR

# tftp -gr test.out 192.168.31.223
# echo 0 > /proc/sys/kernel/randomize_va_space
# ./test.out 
executable : 0x105ac
system@plt : 0x10484
heap       : 0x13190
stack      : 0x7efffcf0
1ibc       : 0x76fd7380
# ./test.out 
executable : 0x105ac
system@plt : 0x10484
heap       : 0x13190
stack      : 0x7efffcf0
1ibc       : 0x76fd7380

发现两次执行 test.out,程序执行时所有地址都是不变化的

二、部分开启 ASLR

# echo 1 > /proc/sys/kernel/randomize_va_space
# ./test.out 
executable : 0x105ac
system@plt : 0x10484
heap       : 0x13190
stack      : 0x7ed35cf0
1ibc       : 0x76f68380
# ./test.out 
executable : 0x105ac
system@plt : 0x10484
heap       : 0x13190
stack      : 0x7e81ccf0
1ibc       : 0x76ee1380

两次执行 test.out,只有 stack、动态库地址随机化

三、完全开启 ASLR

# echo 2 > /proc/sys/kernel/randomize_va_space
# ./test.out 
executable : 0x105ac
system@plt : 0x10484
heap       : 0x1828190
stack      : 0x7ec97cf0
1ibc       : 0x76f4d380
# ./test.out 
executable : 0x105ac
system@plt : 0x10484
heap       : 0x1724190
stack      : 0x7ec41cf0
1ibc       : 0x76efe380

增加了 heap 地址随机化

PIE

由于 ASLR 是一种操作系统层面的技术,而二进制程序本身是不支持地址随机化加载的,便出现了一些绕过方式,例如 ret2plt、GOT 劫持、地址爆破等。于是,在 2003 年引入了位置无关可执行文件(Position-Independent Executable, PIE),它在应用层的编译器上实现,通过将程序编译为位置无关代码(Position-Independent Code, PIC),使程序可以被加载到任意位置运行,就像是一个特殊的共享库
在 PIE 和 ASLR 同时开启的情况下,攻击者将对程序的内存布局一无所知,大大增加了利用难度。当然凡事有利也有弊,在增加安全性的同时,PIE 也会一定程度上影响性能,因此在大多数操作系统上 PIE 仅用于一些对安全性要求比较高的程序。

gcc 支持的 PIE 选项如下所示,-fpie 是代码生成选项,其生成的位置无关代码可以被 -pie 选项链接到可执行文件中。

  • -fpic,为共享库生成位置无关代码
  • -pie,生成动态链接的位置无关可执行文件,通常需要同时指定 -fpie
  • -no-pie,不生成动态链接的位置无关可执行文件
  • -fpie,类似于 -fpic,但生成的位置无关代码只能用于可执行文件,通常同时指定 -pie
  • -fno-pie,不生成位置无关代码

修改 Makefile 文件

TARGET=test

CC=/home/liyongjun/project/board/buildroot/Vexpress_2/host/bin/arm-linux-gcc

all:
	${CC} ${TARGET}.c -o ${TARGET}.out -Wall -pie -fpie

cp:
	cp ${TARGET}.out ~/tftp/

clean:
	rm *.out

重新编译、下载、执行

# tftp -gr test.out 192.168.31.223
# ./test.out 
executable : 0x49c6dc
system@plt : 0x76e8fc40
heap       : 0xb7f190
stack      : 0x7ee06ce8
1ibc       : 0x76f90380
# ./test.out 
executable : 0x4436dc
system@plt : 0x76de8c40
heap       : 0x17db190
stack      : 0x7ea81ce8
1ibc       : 0x76ee9380

发现程序运行的所有地址都随机化了

EXEC & DYN

如何查看一个二进制程序是 pie 的,还是 no-pie 的?使用 readelf 工具查看 ELF 文件类型

no-pie:

$ readelf -h test.out | grep Type
  Type:                              EXEC (Executable file)

pie:

$ readelf -h test.out | grep Type
  Type:                              DYN (Shared object file)

关闭 ASLR 的几种方法

在调试程序时,开启 ASLR 会增加调试难度,下面是几种临时关闭 ASLR 的方法
一、修改 /proc/sys/kernel/randomize_va_space

# echo 0 > /proc/sys/kernel/randomize_va_space
# ./test.out 
executable : 0x4006dc
system@plt : 0x76ed6c40
heap       : 0x403190
stack      : 0x7efffce8
1ibc       : 0x76fd7380
# ./test.out 
executable : 0x4006dc
system@plt : 0x76ed6c40
heap       : 0x403190
stack      : 0x7efffce8
1ibc       : 0x76fd7380

二、使用 setarch 命令
-R 选项即为关闭地址空间随机化

# setarch --help
BusyBox v1.36.1 (2024-01-04 00:19:02 CST) multi-call binary.

Usage: setarch PERSONALITY [-R] PROG ARGS

PERSONALITY may be:
	linux32	Set 32bit uname emulation
	linux64	Set 64bit uname emulation

	-R	Disable address space randomization
# setarch linux32 -R ./test.out
executable : 0x4006dc
system@plt : 0x76ed6c40
heap       : 0x403190
stack      : 0x7efffce8
1ibc       : 0x76fd7380
# setarch linux32 -R ./test.out
executable : 0x4006dc
system@plt : 0x76ed6c40
heap       : 0x403190
stack      : 0x7efffce8
1ibc       : 0x76fd7380

三、gdb
在 gdb 场景下,使用 set disable-randomization on 命令关闭地址随机化
不过,很明显,在我的测试环境中,该方案没起作用。(有知道内幕的小伙伴请在评论区告知)

# gdb test.out 
GNU gdb (GDB) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "arm-buildroot-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test.out...
(No debugging symbols found in test.out)
(gdb) set disable-randomization on
(gdb) show disable-randomization
Disabling randomization of debuggee's virtual address space is on.
(gdb) run
Starting program: /root/test.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
executable : 0x4c46dc
system@plt : 0x76e9fc40
heap       : 0x8e5190
stack      : 0x7eee0cc8
1ibc       : 0x76fa0380
[Inferior 1 (process 254) exited normally]
(gdb) run
Starting program: /root/test.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
executable : 0x4066dc
system@plt : 0x76e9cc40
heap       : 0x12aa190
stack      : 0x7e8eecc8
1ibc       : 0x76f9d380
[Inferior 1 (process 256) exited normally]
(gdb) 

总结

ASLR 不负责代码段以及数据段的随机化工作,这项工作由 PIE 负责。但是只有在开启 ASLR 之后,PIE 才会生效。
无论是 ASLR 还是 PIE,由于颗粒度问题,被随机化的都只是某个对象的起始地址,而在该对象的内部依然保持原来的结构,也就是说相对偏移是不会变的。

附录

Documentation/admin-guide/sysctl/kernel.rst

randomize_va_space
==================

This option can be used to select the type of process address
space randomization that is used in the system, for architectures
that support this feature.

==  ===========================================================================
0   Turn the process address space randomization off.  This is the
    default for architectures that do not support this feature anyways,
    and kernels that are booted with the "norandmaps" parameter.

1   Make the addresses of mmap base, stack and VDSO page randomized.
    This, among other things, implies that shared libraries will be
    loaded to random addresses.  Also for PIE-linked binaries, the
    location of code start is randomized.  This is the default if the
    ``CONFIG_COMPAT_BRK`` option is enabled.

2   Additionally enable heap randomization.  This is the default if
    ``CONFIG_COMPAT_BRK`` is disabled.

    There are a few legacy applications out there (such as some ancient
    versions of libc.so.5 from 1996) that assume that brk area starts
    just after the end of the code+bss.  These applications break when
    start of the brk area is randomized.  There are however no known
    non-legacy applications that would be broken this way, so for most
    systems it is safe to choose full randomization.

    Systems with ancient and/or broken binaries should be configured
    with ``CONFIG_COMPAT_BRK`` enabled, which excludes the heap from process
    address space randomization.
==  ===========================================================================

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高性能 Kafka 及常见面试题

Kafka 是一种分布式的&#xff0c;基于发布/订阅的消息系统&#xff0c;原本开发自 LinkedIn&#xff0c;用作 LinkedIn 的事件流&#xff08;Event Stream&#xff09;和运营数据处理管道&#xff08;Pipeline&#xff09;的基础。 基础原理详解可见 Kafka 基本架构及原理 基础…

事件循环解析

浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有了进程后&…

Java根据excel模版导出Excel(easyexcel、poi)——含项目测试例子拿来即用

Java根据excel模版导出Excel&#xff08;easyexcel、poi&#xff09;——含项目测试例子拿来即用 1. 前言1.1 关于Excel的一般导出2.2 关于easyexcel的根据模版导出 2. 先看效果2.1 模版2.2 效果 3. 代码实现&#xff08;核心代码&#xff09;3.1 项目代码结构3.2 静态填充例子…

全域增长方法论:帮助品牌实现科学经营,助力长效生意增长

前两年由于疫情反复、供给需求收缩等条件制约&#xff0c;品牌业务均受到不同程度的影响。以双十一和618电商大促为例&#xff0c;就相比往年颇显“惨淡”&#xff0c;大多品牌营销都无法达到理想预期。 随着市场环境不断开放&#xff0c;2023年营销行业开始从低迷期走上了高速…

RPA中国 x UiPath | 第六届RPA极客挑战赛,3月16日上海开赛!

随着人工智能技术的不断进步以及数字化转型的深入&#xff0c;企业对于高效、精准、自动化的业务流程需求日益迫切。RPA技术作为连接人类工作与机器操作的桥梁&#xff0c;正逐渐从规则驱动发展为智能决策的助手。 由RPA中国联合UiPath共同主办的【第六届RPA极客挑战赛】将于2…

高性能API云原生网关 APISIX安装与配置指南

Apache APISIX是Apache软件基金会下的顶级项目&#xff0c;由API7.ai开发并捐赠。它是一个高性能的云原生API网关&#xff0c;具有动态、实时等特点。 APISIX网关可作为所有业务的流量入口&#xff0c;为用户提供了丰富的功能&#xff0c;包括动态路由、动态上游、动态证书、A…

【LeetCode每日一题】938. 二叉搜索树的范围和

2024-2-26 文章目录 [938. 二叉搜索树的范围和](https://leetcode.cn/problems/range-sum-of-bst/)思路&#xff1a;写法一&#xff1a;在中间累加写法二&#xff1a;在最后累加 938. 二叉搜索树的范围和 思路&#xff1a; 1.在二叉搜索树中&#xff1a;左子树的结点都小于根节…

【Excel PDF 系列】POI + iText 库实现 Excel 转换 PDF

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言转换前后效果引入 pom 配置代码实现 前言 最近遇到生成 Excel 并转 pdf 的需求&#xff0c;磕磕碰碰总…

UE5 C++ Widget练习 Button 和 ProgressBar创建血条

一. 1.C创建一个继承Widget类的子类&#xff0c; 命名为MyUserWidget 2.加上Button 和 UserWidget的头文件 #include "CoreMinimal.h" #include "Components/Button.h" #include "Blueprint/UserWidget.h" #include "MyUserWidget.genera…

2步破解官方sublime4

sublime简要破解流程 1.下载sublime官方最新版2. 破解流程 1.下载sublime官方最新版 打开 官方网站下载 portable version 版&#xff0c;省的安装。。解压到任意位置&#xff0c;备份 sublime_text.exe 文件 2. 破解流程 打开网址把文件 sublime_text.exe 拖入网页搜索替换…

飞书公式留存

飞书公式留存 if(and(month([完成日期])>7,month([完成日期])<9),"Q3季度"&#xff0c;if(and(month([完成日期])>10,month([完成日期])<12),"Q4季度"&#xff0c;""))

基于YOLOv5+PySide6的火灾火情火焰检测系统设计深度学习

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;225火灾 获取完整源码源文件已标注的数据集&#xff08;1553张&#xff09;配置跑起来说明 可有偿49yuan一对一远程操作&#xff0c;在你电脑跑起来 效果展示&#xff1a; ​数据集在下载的文件夹&#xff1a;yolov5-5.0\…

抽象的后端

Connection refused: no further information 出现这条代码的核心是你使用redis&#xff0c;但是本地没有开启redis服务 如何启动redis服务 第一步&#xff1a;确定你安装了对应的框架 以spring为例 <dependency><groupId>org.springframework.boot</group…

详解POCV/SOCV的时序报告

​POCV/SOCV的时序报告中有如下变量&#xff1a; Mean: 高斯分布中的μ值&#xff08;平均值&#xff09; Sensit: sensitivity&#xff0c;也就是1个Sigma的值&#xff1b; Corner: Sigma边界的最差值 cell的delay Delay mean N * Delay sigma; cell 的Transition Sl…

十一、Qt自定义Widget组件、静态库与动态库

一、自定义Widget组件 1、自定义Widget组件 使用步骤采用提升法&#xff08;promotion&#xff09;重新定义paintEvent事件 2、实现程序 &#xff08;1&#xff09;创建项目&#xff0c;基于QWidget &#xff08;2&#xff09;添加类&#xff0c;为Widget组件提升类 #inclu…

嵌入式C语言(三)

typeof() 使用typeof可以获取一个变量或表达式的类型。 typeof的参数有两种形式&#xff1a;表达式或类型。 int i;typeof(i) j 20; --> int j 20;typeof(int *) a; -->int *a; int f(); -->typeof(f()) k;--? int k我们可以看出通过typeof获取一个变量的…

【iOS ARKit】ARWorldMap

ARWorldMap 用于存储 ARSession 检测扫描到的空间信息数据&#xff0c;包括地标&#xff08;Landmark&#xff09;、特征点&#xff08;Feature Point&#xff09;、平面&#xff08;Plane&#xff09;等&#xff0c;以及使用者的操作信息&#xff0c;如使用者添加的 ARAnchor …

LabVIEW高精度闭式微小型循环泵性能测试

LabVIEW高精度闭式微小型循环泵性能测试 开发了一套基于LabVIEW的高精度闭式微小型循环泵性能测试系统&#xff0c;旨在通过先进的测试技术和虚拟仪器技术&#xff0c;对微小型循环泵的性能进行精确测量和分析&#xff0c;从而优化泵的设计和性能&#xff0c;提高其在航空、机…

助力智能化农田作物除草,基于DETR(DEtection TRansformer)模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中&#xff0c;关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了&#xff0c;结合智能化的设备可以实现只能除草等操作&#xff0c;玉米作物场景下的杂草检测我们则少有涉及&#xff0c;这里本文的主要目的就是想要基于DETR模型来开发构建玉米…

Vue-3

自定义指令 全局注册指令 文件路径&#xff1a;src/main.js import Vue from vue import App from ./App.vue Vue.config.productionTip false// 全局注册指令 Vue.directive(myFocus, {// inserted 会在指令所在的元素&#xff0c;被插入到页面中时触发inserted(el) {el.f…