hacktricks/binary-exploitation/common-binary-protections-and-bypasses/relro.md

5.3 KiB
Raw Blame History

Relro

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Relro

RELRORelocation Read-Onlyの略で、GOT (Global Offset Table)の上書きに関連するリスクを軽減するためにバイナリで使用されるセキュリティ機能です。RELRO保護には2種類あります(1) Partial RELROと(2) Full RELROです。どちらもELFファイルからGOTBSSの順序を変更しますが、結果と影響は異なります。具体的には、GOTセクションをBSSに配置します。つまり、GOTBSSよりも低いアドレスにあり、したがってBSS内の変数をオーバーフローさせることでGOTエントリを上書きすることは不可能です(メモリへの書き込みは低いアドレスから高いアドレスに向かって行われることを思い出してください)。

この概念を明確にするために、2つの異なるタイプに分解しましょう。

Partial RELRO

Partial RELROは、バイナリのパフォーマンスに大きな影響を与えずにセキュリティを強化するためのよりシンプルなアプローチを取ります。Partial RELROは**.gotを読み取り専用にしますGOTセクションの非PLT部分。セクションの残りの部分(.got.pltなどはまだ書き込み可能であり、したがって攻撃の対象となることに注意してください。このGOT任意の書き込み**の脆弱性から悪用されるのを防ぐことはありません。

デフォルトでは、GCCはPartial RELROでバイナリをコンパイルします。

Full RELRO

Full RELROは、GOT全体.gotと.got.pltの両方および.fini_arrayセクションを完全に読み取り専用にすることで保護を強化します。バイナリが起動すると、すべての関数アドレスが解決され、GOTにロードされ、その後、GOTは読み取り専用としてマークされ、実行時にそれに対する変更を効果的に防ぎます。

ただし、Full RELROのトレードオフはパフォーマンスと起動時間にあります。GOTを読み取り専用としてマークする前に、起動時にすべての動的シンボルを解決する必要があるため、Full RELROが有効なバイナリは読み込み時間が長くなる可能性があります。この追加の起動オーバーヘッドが、すべてのバイナリでFull RELROがデフォルトで有効になっていない理由です。

バイナリでFull RELROが有効かどうかを確認することができます:

readelf -l /proc/ID_PROC/exe | grep BIND_NOW

バイパス

フルRELROが有効な場合、バイパスする唯一の方法は、任意の実行を得るためにGOTテーブルに書き込む必要のない別の方法を見つけることです。

LIBCのGOTは通常、パーシャルRELROですので、任意の書き込みで変更できます。詳細はTargetting libc GOT entriesを参照してください。

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}