
このPOCは、バイナリの実行不可とされる領域に存在するバイトの実行を実証し、実行可能領域保護を完全にバイパスするものです。
この根本原因は、以下の場所で確認できます: https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/elf.h#L280
実際には、NXを持たないシステム、またはNXを持つIA32システム上でビルドされ、PT_GNU_STACKヘッダーを含まないバイナリファイルは、exec-allとマークされます。
これにより、バイナリ内のあらゆる場所に対して完全なRWXが可能になります。
これを実現するために、私たちは「歴史的な」ビルドツールを使用します。
この場合、Linux 2.4.20を搭載したx86 Slackware9上で動作するgcc 3.2.2を使用します。
最終的に、現代のLinuxシステムで実行可能なバイナリファイルが得られます。この場合、Linux 5.16.1です。
まったく同じ効果は、特定のリンカ引数やスクリプトによって達成できる可能性がありますが、私はこれを検証していません。
次のコードは、関数dummy()のアセンブル済みバイトを文字配列harmless_str_bufにコピーし、その宛先配列を関数として実行します。
このデモンストレーションは、教育目的のみのために提供されます。 いかなる状況においても、このコードの作者は、提供されたコードおよび/または情報の誤用によって生じた直接的または間接的な損害について責任を負うことはできません。
詳細については、LICENSEを参照してください。