Stack Shellcode
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Stack shellcode は、binary exploitation において攻撃者が脆弱なプログラムのスタックにシェルコードを書き込み、その後 Instruction Pointer (IP) または Extended Instruction Pointer (EIP) をこのシェルコードの位置を指すように変更し、実行させる技術です。これは、ターゲットシステムに対して不正アクセスを得たり、任意のコマンドを実行させたりするために使用される古典的な方法です。以下に、プロセスの内訳と、シンプルなCの例、そしてpwntoolsを使用して対応するエクスプロイトを書く方法を示します。
脆弱なCプログラムのシンプルな例から始めましょう:
このプログラムは、gets()
関数の使用によりバッファオーバーフローに対して脆弱です。
このプログラムをコンパイルして、さまざまな保護を無効にすることで(脆弱な環境をシミュレートするために)、次のコマンドを使用できます:
-fno-stack-protector
: スタック保護を無効にします。
-z execstack
: スタックを実行可能にし、スタックに保存されたシェルコードを実行するために必要です。
-no-pie
: ポジション独立実行可能ファイルを無効にし、シェルコードが配置されるメモリアドレスを予測しやすくします。
-m32
: プログラムを32ビット実行可能ファイルとしてコンパイルし、エクスプロイト開発の簡素化に役立ちます。
ここでは、pwntoolsを使用してret2shellcode攻撃を実行するためのPythonでのエクスプロイトの書き方を示します:
このスクリプトは、NOPスライド、シェルコードで構成されるペイロードを構築し、EIPをNOPスライドを指すアドレスで上書きして、シェルコードが実行されることを保証します。
NOPスライド(asm('nop')
)は、正確なアドレスに関係なく、実行がシェルコードに「スライド」する可能性を高めるために使用されます。p32()
引数をバッファの開始アドレスにオフセットを加えた値に調整して、NOPスライドに到達させます。
ASLR は無効にするべきで、そうしないとアドレスが実行ごとに信頼できなくなり、関数が格納されるアドレスが常に同じではなくなり、win関数がどこにロードされているかを把握するために何らかのリークが必要になります。
スタックカナリアも無効にするべきで、そうしないと侵害されたEIPの戻りアドレスは決して追跡されません。
NX スタック保護は、スタック内のシェルコードの実行を防ぎます。なぜなら、その領域は実行可能ではないからです。
64ビット、スタックアドレスリークを伴うASLR、シェルコードを書き込み、そこにジャンプ
32ビット、スタックリークを伴うASLR、シェルコードを書き込み、そこにジャンプ
32ビット、スタックリークを伴うASLR、exit()への呼び出しを防ぐための比較、変数を値で上書きし、シェルコードを書き込み、そこにジャンプ
arm64、ASLRなし、スタックを実行可能にするROPガジェットを使用してスタック内のシェルコードにジャンプ
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)