Pwn De Ring

初心者がPwnを勉強していくために使っている標準出力先です。

実行ファイルのセキュリティ機構[RELRO/SSP/Nxbit/ASLR/PIE]

実行ファイルのセキュリティ機構

gcc等のコンパイラで,ソースコードコンパイルする際に脆弱性を生まないための様々なセキュリティ機構が実行ファイルに付加される.

RELRO(RELocation ReadOnly)

これはメモリ上に配置されるデータの各セクションにはReadOnly属性を付けるためのもの.

  • No RELRO
  • Partial RELRO(Lazy)
  • Full RELRO(Now)

の3種類がある.Full RELROだとGOT Overwriteという攻撃手法を行うことができない.

Stack Smash Protection

これはスタック上でBuffer Overflowの検出を行うもの.もしBuffer Overflowしていた際にはプログラムを強制終了する. 仕組みとしては,低アドレスから高アドレス順にスタックフレームに [局所変数][canary][ebp][戻り番地][次のスタックフレーム] となるようになり局所変数でBuffer Overflowするとcanaryの値が変化してしまう.関数の終了時にその値が書き換えられているかどうかでBuffer Overflowの検出を行っている.gccコンパイルする際には以下のようにオプション指定をすると意図的に無効化することができる.勉強する際にはよく使う.

$ gcc hoge.c -fno-stack-protector

Nx bit(No eXecute bit)

WindowsではDEP(Data Execution Prevention)と呼ばれており,メモリ上にある実行する必要のないデータを実行不可能にしてしまうもの.これで攻撃者がシェルコードを使うのを防いでいる.gccコンパイルする際には以下のようにオプションを指定すると意図的に無効化することができる.

$ gcc hoge.c -z execstack

ASLR(Address Space Layout Randomization)

スタック領域,共有ライブラリ領域などをメモリに配置する際にアドレスの一部をランダム化するもの.これで攻撃者はアドレスの予測が難しくなる.最近のCTFではほとんどASLRが有効らしい. 私の使っている環境Ubuntu 14.04 LTSでは以下のようにすることでON/OFFを切り替えることができる

$ sudo sysctl -w kernel.randomize_va_space=0 #OFF
$ sudo sysctl -w kernel.randomize_va_sapce=2 #ON

PIE(Position Independent Executable)

ASLRでは行われることがない,実行ファイルの配置アドレスもランダム化される.これが有効になっている場合には,既知アドレスがないためアドレスリークを探すことから始める.