Stack Shellcode
基本情報
スタックシェルコードは、バイナリエクスプロイテーションで使用される技術で、攻撃者が脆弱なプログラムのスタックにシェルコードを書き込み、その後 命令ポインタ(IP) または 拡張命令ポインタ(EIP) をこのシェルコードの場所を指すように変更することで、実行させることを意味します。これは、不正なアクセスを得たり、ターゲットシステムで任意のコマンドを実行するために使用される古典的な方法です。ここでは、このプロセスの詳細と、簡単なCの例、および pwntools を使用して対応するエクスプロイトをPythonで書く方法を紹介します。
Cの例: 脆弱なプログラム
まず、脆弱なCプログラムの簡単な例から始めましょう:
このプログラムは、gets()
関数の使用によりバッファオーバーフローの脆弱性があります。
コンパイル
このプログラムをコンパイルする際に、さまざまな保護を無効にして(脆弱な環境をシミュレートするために)、次のコマンドを使用できます:
-fno-stack-protector
: スタック保護を無効にします。-z execstack
: スタックを実行可能にし、スタックに保存されたシェルコードを実行するために必要です。-no-pie
: 位置独立実行可能ファイルを無効にし、シェルコードが配置されるメモリアドレスを予測しやすくします。-m32
: プログラムを32ビット実行可能ファイルとしてコンパイルし、しばしばエクスプロイト開発のためにシンプルに使用されます。
Pwntoolsを使用したPythonエクスプロイト
以下は、pwntoolsを使用してPythonでエクスプロイトを記述し、ret2shellcode攻撃を実行する方法です。
このスクリプトは、NOPスライド、シェルコード、そしてEIPをNOPスライドを指すアドレスで上書きして、シェルコードが実行されるようにペイロードを構築します。
NOPスライド (asm('nop')
) は、実行が正確なアドレスに関係なくシェルコードに「スライド」する可能性を高めるために使用されます。p32()
の引数を、NOPスライドに着地するためのバッファの開始アドレスにオフセットを加えて調整してください。
保護
ASLR は無効にする必要があります。そうしないと、関数が格納されるアドレスが常に同じでなくなり、win関数がどこにロードされているかを特定するためには何らかのリークが必要になります。
スタックキャニオン も無効にする必要があります。そうしないと、侵害されたEIP戻りアドレスは決して実行されません。
NX スタック保護は、その領域が実行不可能であるため、スタック内のシェルコードの実行を防ぎます。
他の例と参考文献
64ビット、ASLRとスタックアドレスリーク、シェルコードの書き込みとその実行
32ビット、ASLRとスタックリーク、シェルコードの書き込みとその実行
32ビット、ASLRとスタックリーク、exit()への呼び出しを防ぐための比較、変数の上書きとその値の書き込み、シェルコードの書き込みとその実行
arm64、ASLRなし、スタックを実行可能にするROPガジェット、スタック内のシェルコードへのジャンプ
Last updated