pwn を解く為に必要なステップ
脆弱性の種類と,その攻略方法
| 段階 | 例 |
|---|---|
| Vulnerabilities | Stack BOF, Heap BOF, Use After Free, Format String Bug, Race Condition … |
| Exploit Techniques | ret2plt, ret2libc, ROP, GOT Overwrite, Stack pivot … |
| Anti-Exploits | NX, ASLR, RELRO, PIE, Stack Canary … |
flagを獲得する方法
- シェルコードを実行
- Exec-shell系
- Exec-shell + バックコネクト系
- shellcode - Qiita
system("/bin/sh")やexecve("/bin/sh", 0, 0)を実行- 必要に応じてdup2したりする
- open(“flag”) -> read() -> write()
- サンドボックスでexec系が禁止されているケース,chrootされているケースなどで有効
# バイナリ解析
動的解析
- gdb
- gdb-peda
- pwndbg
- rust-gdb 静的解析
- Ghidra
- v10.1.5が安定版 (プラグインも豊富だと思う)
- IDA Pro (アイダプロ)
- 専門家はデコンパイラの性能から Ghidra より IDA Pro の方を使いがち
- Binary Ninja
- WinDbg
bp <address>: ブレークポイントpr: レジスタ情報とgdbでいうnextipt: retが来るまで進めるpctr: レジスタ情報とcallとretが来るまで進めるdc <address reg>: double word単位とascii文字でデータ表示
- Immunity Debugger
- radare2
デバッグ情報
- DWARF
- gdbの自動的にやることでカバレッジを取れる
- seccomp BPF
必要なコマンド
- ld: リンク先
- patchelf: 動的ライブラリの解決
- objdump
- checksec.sh
- one_gadget
- ROPgadget
- ptrace
- strace
| |
# gccオプション
- No RELRO: RELRO無効
- Partial RELRO: RELRO有効かつ遅延バインド有効
- Full RELRO: RELRO有効かつ遅延バインド無効
| やること | オプション |
|---|---|
| SSP 無効 | -fno-stack-protector |
| SSP 有効 (default) | -fstack-protector |
| NX bit 無効 | -z execstack |
| NX bit 有効 (default) | -z |
| No RELRO | -Wl,-z,norelro |
| Partial RELRO | -Wl,-z,relro,-z lazy |
| Full RELRO (default) | -Wl,-z,relro,-z,now |
| ASLR 無効 | sudo sysctl kernel.randomize_va_space=0 |
| ASLR 有効 (default) | sudo sysctl kernel.randomize_va_space=2 |
| PIE 無効 | -fno-pie -no-pie |
| PIE 有効 (default) | -fPIE -pie |
| Exec-Shield 無効 | sudo sysctl -w kernel.exec-shield=0 |
| Exec-Shield 有効 (default) | sudo sysctl -w kernel.exec-shield=1 |