用户态程序的5保护

本文最后更新于 2022年2月25日 中午

ASLR 与 PIE 的同与异

作用位置 归属 作用时间
ASLR 1:栈基地址(stack)、共享库(.so\libraries)、mmap 基地址
2:在1基础上,增加随机化堆基地址(chunk)
系统功能 作用于程序(ELF)装入内存运行时
PIE 代码段( .text )、初始化数据段( .data )、未初始化数据段( .bss ) 编译器功能 作用于程序(ELF)编译过程中

因为 ASLR 技术的出现,攻击者在 ROP 或者向进程中写数据时不得不先进行 leak,或者干脆放弃堆栈,转向 bss 或者其他地址固定的内存块。这个基本上所有机器都开启。

而 PIE(position-independent executable, 地址无关可执行文件)技术就是一个针对代码段.text, 数据段.*data,.bss 等固定地址的一个防护技术。同 ASLR 一样,应用了 PIE 的程序会在每次加载时都变换加载基址,从而使位于程序本身的 gadget 也失效

没有 PIE 保护的程序,每次加载的基址都是固定的,64 位上一般是 0x400000。
  与 eip 有关的固定下来了,也就是代码段和数据段,但堆栈、libc 还是随机的


bypass PIE:
1、partial write(部分写入)就是一种利用了 PIE 技术缺陷的 bypass 技术。由于内存的页载入机制,PIE 的随机化只能影响到单个内存页。通常来说,一个内存页大小为 0x1000,这就意味着不管地址怎么变,某条指令的后 12 位,3 个十六进制数的地址是始终不变的。因此通过覆盖 EIP 的后 8 或 16 位 (按字节写入,每字节 8 位)就可以快速爆破或者直接劫持 EIP。
2、泄露地址 bypass PIE
3、使用 vdso/vsyscall bypass PIE


Canary

绕过 canary:
1、泄露 canary
2、劫持__stack_chk_fail


The NX bits(the No-eXecute bits)

通过在内存页的标识中增加执行位,表示是否可以执行,开启后使栈区的数据不可执行

开启 nx 保护下,常用的手段为向 bss 段写入 shellcode 或堆区写入并使用 mprotect 赋予可执行权限


RELRO (RELocate Read-Only)

只读化,未开启可实现 got 覆盖攻击,fini_array 挟持到 main

Partial RELRO:部分 RELRO: 在程序装入后, 将其中一些段(如.dynamic)标记为只读, 防止程序的一些重定位信息被修改,仍然可实现 got 覆盖攻击

Full RELRO:完全 RELRO: 在部分 RELRO 的基础上, 在程序装入时, 直接解析完所有符号并填入对应的值, 此时所有的 GOT 表项都已初始化, 且不装入 link_map 与_dl_runtime_resolve 的地址

RWX 存在可读可写可执行段,即栈为可读可写可执行


用户态程序的5保护
https://k3ppf0r.github.io/2022/02/04/基础/用户态程序的5保护/
作者
k3ppf0r
发布于
2022年2月4日
许可协议