从零开始的 Pwn 之旅 - PIE 和 ALSR

总结摘要
从零开始的 Pwn 之旅 - PIE 和 ALSR

前言

  • PIE(Position Independent Executable)和ASLR(Address Space Layout Randomization)是现代操作系统中常用的安全机制。通过随机化程序的内存布局,PIE和ASLR可以有效地防止攻击者利用已知的内存地址进行攻击。

ALSR 安全保护等级可以使用如下命令查看:

1
2
cat /proc/sys/kernel/randomize_va_space
2
  • 0: 禁用 ASLR。
  • 1: 启用 ASLR,但仅对共享库和栈进行随机化。
  • 2: 启用 ASLR,对所有内存区域(包括堆、栈和共享库)进行随机化。

若要禁用 ASLR,可以使用以下命令:

1
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

若程序启用 PIE 保护机制

  • 程序的加载基址由操作系统决定
  • 程序中只包含偏移地址
  • 需要先泄露代码段基址,才能够使用程序中的 gadget

PIE 下断点

使用 gdb 运行的程序默认关闭 ASLR

1
2
3
4
5
6
7
8
~/C/cpp ❯❯❯ pwn checksec ./stack
[*] '/home/lhon901/Code/cpp/stack'
    Arch:       amd64-64-little
    RELRO:      Partial RELRO
    Stack:      Canary found
    NX:         NX enabled
    PIE:        PIE enabled
    Stripped:   No

如果程序被去符号了, 需要根据地址下断点

1
2
3
4
pwndbg> start
pwndbg> b *$rebase(0x113d)
Note: breakpoint 1 also set at pc 0x55555555513d.
Breakpoint 3 at 0x55555555513d

PIE 相关编译参数

  • -fPIE:编译器选项,用于生成位置无关的代码(Position Independent Code, PIC)。这使得生成的代码可以在任意内存地址运行。
  • -no-pie:链接器选项,用于禁用位置无关可执行文件(PIE)的生成。