GCCで実行可能スタックなしにネスト関数を間接呼び出しするハック
Indirect Calling of Nested Functions on GCC Without Executable Stack
GCCのネスト関数は通常、実行可能スタック上にトランポリンを生成して呼び出しを実現しますが、セキュリティ上の懸念があります。この記事では、トランポリンからコードアドレスと静的チェーンを抽出し、`__builtin_call_with_static_chain`を使って直接呼び出すことで、実行可能スタックを回避する手法を紹介します。また、トランポリンを関数ディスクリプタとして解釈する別のアイデアも提示します。
トランポリンを呼び出す代わりに、呼び出し側でトランポリンのコードを解釈していると言えるでしょう。
HNでの議論
60- inigyou
自己書き換えコードはクールだ。セキュリティのために無効にしなければならなくなったのは残念だ。
- mananaysiempre
関連: このシリーズの前回の記事、https://news.ycombinator.com/item?id=49308685 (103ポイント、47コメント)
- gue5t
最初はAT&T構文を読まなければならないことにイライラした。次に、次のスニペットがレジスタに'%'記号がないAT&T構文であることに気づいて混乱した。だが、そのテクニックはクールだ。
- Dwedit
実行可能スタックが何に必要なんだ? 関数ポインタを使って呼び出すのに、関数ポインタの使用には実行可能な読み書きメモリは関与しない。