---
# System prepended metadata

title: PWN 保護機制
tags: [pwn]

---

# PWN 保護機制
###### tags: `pwn`

## 全部關閉
```gcc test.c -fno-stack-protector -zexecstack -no-pie -o test```
## Canary
```
gcc $Source -fno-stack-protector -o $Binary
```
##  NX (No eXecute) 
全名為 Data Execution Prevention，又稱 DEP

可以寫的，不可以執行。
可以執行的，不可以寫。
主要防範 Shell Code 造成的安全問題。

關閉方式：

``` =bash
gcc $Source -zexecstack -o $Binary

```
## ALSR
- 位址空間組態隨機化（ASLR, Address space layout randomization），主要是作業系統上對於 Process 的防護機制，會使每次執行 Stack、Heap、library 位址隨機化，進而達到一些保護效果。不過並非真正隨機，最後12bits 是固定的。

關閉方式：
``` =bash
# echo 0 > /proc/sys/kernel/randomize_va_space
```
## PIE　
全名為 Position-Independent Executable，主要影響的範圍為 Program Structure 的 Data、Code 段，讓該地方的記憶體位置隨機化，來增加被利用的難度。Ubuntu 16.04 預設關閉。

關閉方式：

``` 
gcc $Source -no-pie -o $Binary
```

## RELRO (RELocation Read Only)
- No RELRO - Link Map、GOT 可寫
- Partial RELRO - Link Map 不可寫、GOT 可寫
- Full RELRO - Link Map、GOT 皆不可寫
主要適用於防範 Lazy Binding 所造成的延伸問題。

關閉方式：

- ```gcc $Source -o $Binary ``` 
- 默認情况下，是 Partial RELRO
```gcc -z norelro $Source -o $Binary```
- No RELRO
```gcc -z lazy $Source -o $Binary ```
- Partial RELRO
```gcc -z now $Source -o $Binary``` 
- Full RELRO
## 各型態大小
``` c=
BYTE = 8 BIT
CHAR = 1 BYTE
INT = 4 BYTE
DOUBLE = 8 BYTE
LONG = 4 BYTE
SHORT = 2 BYTE
WORD = 2 BYTE
DWORD = 4 BYTE = 32BIT
```