WWW2Exec - GOT/PLT
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)
グローバルオフセットテーブル (GOT) は、動的リンクバイナリで外部関数のアドレスを管理するために使用されるメカニズムです。これらのアドレスは実行時まで不明であるため(動的リンクのため)、GOTはこれらの外部シンボルのアドレスを動的に更新する方法を提供します。
GOTの各エントリは、バイナリが呼び出す可能性のある外部ライブラリのシンボルに対応しています。関数が最初に呼び出されると、その実際のアドレスは動的リンカーによって解決され、GOTに保存されます。同じ関数への後続の呼び出しは、GOTに保存されたアドレスを使用し、再度アドレスを解決するオーバーヘッドを回避します。
プロシージャリンクテーブル (PLT) はGOTと密接に連携し、外部関数への呼び出しを処理するためのトランポリンとして機能します。バイナリが外部関数を初めて呼び出すと、制御はその関数に関連付けられたPLTのエントリに渡されます。このPLTエントリは、関数のアドレスがまだ解決されていない場合、動的リンカーを呼び出してアドレスを解決する責任があります。アドレスが解決された後、それはGOTに保存されます。
したがって、 GOTエントリは外部関数または変数のアドレスが解決された後に直接使用されます。PLTエントリは、動的リンカーを介してこれらのアドレスの初期解決を促進するために使用されます。
GOTテーブルのアドレスを取得するには: objdump -s -j .got ./exec
GEFで実行可能ファイルを読み込んだ後、GOTにある関数を見ることができることに注意してください: gef➤ x/20x 0xADDR_GOT
GEFを使用してデバッグセッションを開始し、**got
**を実行してGOTテーブルを表示できます:
バイナリ内のGOTには、関数のアドレスまたは関数アドレスを読み込むPLTセクションのアドレスがあります。この任意の書き込みの目的は、後で実行される関数のGOTエントリを、例えば**system
関数のPLTのアドレスで上書きすることです**。
理想的には、あなたが制御するパラメータで呼び出される関数のGOTを上書きすることになります(これにより、system関数に送信されるパラメータを制御できるようになります)。
もし**system
がバイナリで使用されていない場合、system関数はPLTにエントリを持ちません**。このシナリオでは、最初にsystem
関数のアドレスをリークし、その後GOTを上書きしてこのアドレスを指す必要があります。
PLTアドレスは**objdump -j .plt -d ./vuln_binary
**で確認できます。
libcのGOTは通常、部分的RELROでコンパイルされており、そのアドレスを特定できれば良いターゲットになります(ASLR)。
libcの一般的な関数は、他の内部関数を呼び出すことがあり、そのGOTはコード実行を得るために上書きされる可能性があります。
この技術に関する詳細情報はこちらを参照してください。
ヒープのエクスプロイトCTFでは、チャンクの内容を制御でき、時にはGOTテーブルを上書きすることが一般的です。利用可能なガジェットがない場合にRCEを得るための簡単なトリックは、free
のGOTアドレスをsystem
を指すように上書きし、チャンク内に"/bin/sh"
を書き込むことです。このようにして、このチャンクが解放されると、system("/bin/sh")
が実行されます。
もう一つの一般的な技術は、**strlen
のGOTアドレスをsystem
**を指すように上書きすることです。これにより、この関数がユーザー入力で呼び出されると、文字列"/bin/sh"
を渡してシェルを取得することが可能になります。
さらに、puts
がユーザー入力で使用される場合、strlen
のGOTアドレスをsystem
を指すように上書きし、文字列"/bin/sh"
を渡してシェルを取得することが可能です。puts
はユーザー入力でstrlen
を呼び出します。
ヒープの脆弱性からRCEを取得する一般的な方法は、ファストビンを悪用することです。これにより、GOTテーブルの一部をファストビンに追加できるため、そのチャンクが割り当てられると、通常はfree
のポインタを上書きすることが可能になります。
その後、free
をsystem
に指し、/bin/sh\x00
が書き込まれたチャンクを解放すると、シェルが実行されます。
フルRELRO保護は、この種の技術から保護するために、バイナリが起動されるときにすべての関数のアドレスを解決し、その後GOTテーブルを読み取り専用にすることを目的としています。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)