GCCで実行可能スタックなしにネスト関数を間接呼び出しするハック

Indirect Calling of Nested Functions on GCC Without Executable Stack

GCCのネスト関数は通常、実行可能スタック上にトランポリンを生成して呼び出しを実現しますが、セキュリティ上の懸念があります。この記事では、トランポリンからコードアドレスと静的チェーンを抽出し、`__builtin_call_with_static_chain`を使って直接呼び出すことで、実行可能スタックを回避する手法を紹介します。また、トランポリンを関数ディスクリプタとして解釈する別のアイデアも提示します。

トランポリンを呼び出す代わりに、呼び出し側でトランポリンのコードを解釈していると言えるでしょう。
  1. inigyou

    自己書き換えコードはクールだ。セキュリティのために無効にしなければならなくなったのは残念だ。

  2. mananaysiempre

    関連: このシリーズの前回の記事、https://news.ycombinator.com/item?id=49308685 (103ポイント、47コメント)

  3. gue5t

    最初はAT&T構文を読まなければならないことにイライラした。次に、次のスニペットがレジスタに'%'記号がないAT&T構文であることに気づいて混乱した。だが、そのテクニックはクールだ。

  4. Dwedit

    実行可能スタックが何に必要なんだ? 関数ポインタを使って呼び出すのに、関数ポインタの使用には実行可能な読み書きメモリは関与しない。

この日のほかの記事

2026-08-29