Vulnerability - TK-CTF/CTF GitHub Wiki
ELF セキュリティ機構
あまり丁寧な説明じゃないので、先に黒猫を見て何となく掴んだ方がいいかと。
DEP (Data Execution Prevention)
- IP (Instruction Pointer) がメモリ領域 (HeapやStack) に入ったとたんに強制終了させる。
- 厳密には、NXbitでexecutableでない領域 (/proc/pid/maps 参照) に移されたときに強制終了されます。
- shellcodeのメモリ領域での実行阻止を目的とする
- 対策:Ret2系, ROP, Overwrite 等
- 逆に言えばDEPがなければROPとかしなくていい。
- 参考:DEPの仕組みとその回避手法
Partial / Full RELRO (RELocation Read-Only)
Partial RELRO
- 共有ライブラリのある関数が呼び出された初回に、その位置を表すアドレスを格納するテーブル (.got) が設定される
(.pltは.gotを参考にしてjumpする)- これを遅延バインド (Lazy binding) という
- そのため.plt.gotを書き換えれば (GOT overwrite) その関数が呼ばれる際に別の任意の関数 (system() 等) にjumpさせられるという脆弱性が存在する。
Full RELRO
- 遅延リンクを止め、.gotをファイル実行時にすべて設定し、NXbitで書き込み禁止権限が付与する。
- GOT overwriteができなくなる。
- 参考:RELROとformat string attackによるリターンアドレス書き換え
ASLR (Address Space Layout Randomization)
- stack,heap,libc (共有ライブラリ) 等アドレスがランダムになる。
- .text (コード領域), .bss (静的データ) 等heapよりも上位の領域に確保されるメモリのアドレスはランダム化されない。
- 通常のheapの開始アドレスは、0x0804XXXXとかになるが、ASLRだと0xfXXXXXXX (x64では 0x7ffffXXXXXXX) で始まるアドレスになる。
- Information leak で対策可能
PIE (Position-Independent Executable)
- 実行可能ファイル全体のベースアドレスがランダム (通常は0x400000 とか 0x800000) になる。
- アドレスがすべて相対アドレスになるので、disassemblerで見た時小さな値になる。 - "...share object"となってる実行ファイルはPIE有効 - "... executable"となってる実行ファイルはPIE無効
- 処理に余計な関数を挟む必要がある (しかも、call毎に!!) ので、処理速度がかなり低下する
- Information leak で対策可能 (だけど結構きつい)
ASCII-armor
- 共有ライブラリのアドレスが0x00を含むようになる。
- system()のアドレスとかを送れなくなる。
- そのため最後はshellcodeの実行になるかな?
SSP (Stack Smashing Protector)
- canaryという値でStack Smashingを防ぐ。
- 関数呼び出し時にcanaryという値がpushされる。
- canaryの最初のbyteは0x00
- __stack_chk_fail() とかいう関数が、retの直前にcanaryチェックをする。
- 何とかしてcanaryの値を入手するか、__stack_chk_fail() の前にIPを奪うとかしないと厳しい
確認方法
- chesec.shでセキュリティ機構は確認できるらしい
- gdb-pedaのchecksecコマンドでも代用可
コードに潜む脆弱性
Standard I/O 系
- FSB (Format String Bug)
malloc,Heap系
glibc malloc exploit techniques