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

3.7 KiB
Raw Blame History

Relro

ゼロからヒーローまでAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricks をサポートする他の方法:

Relro

RELRORelocation Read-Only の略で、GOTGlobal Offset Table の上書きに関連するリスクを緩和するためにバイナリで使用されるセキュリティ機能です。この概念を明確にするために、Partial RELROFull RELRO の2つの異なるタイプに分解してみましょう。

Partial RELRO

Partial RELRO は、バイナリのパフォーマンスに大きな影響を与えることなくセキュリティを向上させるシンプルなアプローチを取ります。メモリ内のプログラムの変数よりもGOTを上に配置することで、Partial RELRO はバッファオーバーフローがGOTに到達して破損させるのを防ぐことを目指します

これにより、任意の書き込み脆弱性からGOTが悪用されることはありません。

Full RELRO

Full RELRO は、GOT と .fini_array セクションを完全に 読み取り専用 にすることで保護を強化します。バイナリが開始すると、すべての関数アドレスが解決され、GOTにロードされます。その後、GOT は読み取り専用としてマークされ、ランタイム中にそれに対する変更を防ぎます。

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

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

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

バイパス

完全なRELROが有効になっている場合、GOTテーブルに書き込む必要がない別の方法を見つけることで任意の実行を得ることができます。

LIBCのGOTは通常Partial RELROであるため、任意の書き込みで変更できます。詳細はTargetting libc GOT entriesを参照してください。