ASLR 和 PIE

news2024/12/28 20:42:25

前言

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.
==  ===========================================================================

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

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

相关文章

Spring Cloud学习

1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…

【Java设计模式】二、单例模式

文章目录 1、懒汉式2、双重检查3、静态内部类4、饿汉式5、枚举6、单例模式的破坏&#xff1a;序列化和反序列化7、单例模式的破坏&#xff1a;反射 单例模式即在程序中想要保持一个实例对象&#xff0c;让某个类只有一个实例单例类必须自己创建自己唯一的实例&#xff0c;并对外…

mysql的增删改查(常用)

增(insert) 语法&#xff1a; insert into 表名&#xff08;字段&#xff09; values( 字段对应的值) 案例&#xff1a; 创建一个学生表 结构如下&#xff1a; create table student(id int ,name varchar(20),age int); 向表中插入2条数据 create table student(id int ,n…

802.11局域网的 MAC 层协议、CSMA/CA

目录 802.11 局域网的 MAC 层协议 1 CSMA/CA 协议 无线局域网不能使用 CSMA/CD 无线局域网可以使用 CSMA 协议 802.11 的 MAC 层 分布协调功能 DCF 点协调功能 PCF CSMA/CA 协议的要点 2 时间间隔 DIFS 的重要性 SIFS DIFS 3 争用信道的过程 时隙长度的确定 退避…

Java+SpringBoot+Vue+MySQL构建银行客户管理新平台

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)

D - Square Pair 题目大意 给一长为的数组&#xff0c;问有多少对&#xff0c;两者相乘为非负整数完全平方数 解题思路 一个数除以其能整除的最大的完全平方数&#xff0c;看前面有多少个与其余数相同的数&#xff0c;两者乘积满足条件&#xff08;已经是完全平方数的部分无…

2-22 方法、面向对象、类、JVM内存、构造方法

文章目录 方法的重载面向对象类、属性和方法成员变量默认值属性JVM简单内存分析栈空间堆空间 构造方法执行过程构造器注意点 方法的重载 一个类中名称相同&#xff0c;但是参数列表不同的方法 参数列表不同是指&#xff1a; 形参类型形参个数形参顺序 面向对象 field —— …

JAVA工程师面试专题-《JVM篇》

目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用&#xff1f; 2、说一下 JVM 运行时数据区 &#xff1f; 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方&#xff1f; 5、类常量池、运行时常量池、字符串常量池有什么区别&#xff1f;…

Amazon Generative AI | 基于 Amazon 扩散模型原理的代码实践之采样篇

以前通过论文介绍 Amazon 生成式 AI 和大语言模型&#xff08;LLMs&#xff09;的主要原理之外&#xff0c;在代码实践环节主要还是局限于是引入预训练模型、在预训练模型基础上做微调、使用 API 等等。很多开发人员觉得还不过瘾&#xff0c;希望内容可以更加深入。因此&#x…

软件设计师软考题目解析05 --每日五题

想说的话&#xff1a;要准备软考了。0.0&#xff0c;其实我是不想考的&#xff0c;但是吧&#xff0c;由于本人已经学完所有知识了&#xff0c;只是被学校的课程给锁在那里了&#xff0c;不然早找工作去了。寻思着反正也无聊&#xff0c;就考个证玩玩。 本人github地址&#xf…

132.乐理基础-快速识别音程(二)

上一个内容&#xff1a;131.乐理基础-快速识别音程&#xff08;一&#xff09;-CSDN博客 上一个内容里练习的答案&#xff1a; 无论哪两个音&#xff0c;也就是无论升降记号多么离谱&#xff0c;该怎样去判断它是什么音程&#xff0c;首先就要记住&#xff08;现在只需要只需要…

es6 中的生成器 generator / 迭代器 / async /await 到底是个啥,使用场景

生成器 generator 到底是个啥 是一个函数 可以用来遍历数据结构是解决异步编程的一种方案进行数据流的生成和控制协程和状态机返回一个生成器对象/可迭代对象 生成器对象&#xff1a; 生成器对象是由生成器函数返回的对象&#xff0c;它符合迭代器协议&#xff08;Iterator Pr…

车规级MCU的行业走向

1 主要厂家 车规级MCU&#xff08;车用微控制器单元&#xff09;的主要厂家包括&#xff1a; NXP半导体&#xff1a;NXP是全球领先的车规级MCU提供商之一&#xff0c;提供广泛的产品用于汽车控制和管理系统。英飞凌科技&#xff1a;作为汽车半导体的领导者之一&#xff0c;英飞…

现代化数据架构升级:毫末智行自动驾驶如何应对年增20PB的数据规模挑战?

毫末智行是一家致力于自动驾驶的人工智能技术公司&#xff0c;其前身是长城汽车智能驾驶前瞻分部&#xff0c;以零事故、零拥堵、自由出行和高效物流为目标&#xff0c;助力合作伙伴重塑和全面升级整个社会的出行及物流方式。 在自动驾驶领域中&#xff0c;是什么原因让毫末智行…

Spring Session:Redis序列化配置|Session事件监听

Spring Session是可配置的。 Redis Configuration JSON序列化配置 Spring Session默认使用Java对象序列化机制对Session属性值进行序列化。 预定义类SysUser 先来定义一个SysUser类&#xff0c;在下面的演示案例中会用到。 package com.example.demo.model.entity;import j…

Linux环境下的性能分析 之 CPU篇(二)

2、CPU的使用情况分析 a、类似任务管理器的top & htop 说到对CPU的性能分析&#xff0c;大家一定不会忘记windows下那个最熟悉的工具&#xff1a;任务管理器。 有了这个玩意儿&#xff0c;我们就可以看到CPU的利用率&#xff0c;以及每一个进程所占用的CPU资源。那在Linu…

C++类和对象篇

1.类的定义 在C语言结构体中&#xff0c;只能定义变量&#xff0c;C扩展了类的概念&#xff0c;能够在类定义函数&#xff1b;同时&#xff0c;struct仍然可以使用&#xff0c;但更常用class来表示类 1.1类中函数的两种定义方式 函数的声明和定义都在类中 class Date { public:…

【前端素材】推荐优质后台管理系统Space平台模板(附源码)

一、需求分析 综上所述&#xff0c;后台管理系统在多个层次上提供了丰富的功能和细致的管理手段&#xff0c;帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 当我们从多个层次来详细分析后台…

【c语言】字符函数和字符串函数(上)

前言 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 1. 字符分…

代码随想录刷题第43天

第一题是最后一块石头的重量IIhttps://leetcode.cn/problems/last-stone-weight-ii/&#xff0c;没啥思路&#xff0c;直接上题解了。本题可以看作将一堆石头尽可能分成两份重量相似的石头&#xff0c;于是问题转化为如何合理取石头&#xff0c;使其装满容量为石头总重量一半的…