HN6439
GCCで実行可能スタックなしにネストされた関数を間接呼び出しする方法
Indirect Calling of Nested Functions on GCC Without Executable Stack
uecker・約15時間前
Indirect Calling of Nested Functions on GCC Without Executable Stack
GCCにおいて、ネストされた関数(Nested Functions)を間接的に呼び出す際、通常は実行可能スタック(Executable Stack)が必要となります。しかし、セキュリティや設計上の理由でスタックを実行不可能にする必要がある場合、工夫が必要です。本投稿では、スタックを許可せずにネストされた関数を呼び出すための技術的なアプローチや回避策について解説します。
自己書き換えコードってかっこいいよね。セキュリティのために無効化しなきゃいけなくなったのは残念だけど。
関連情報として、このシリーズの前の記事はこちら: https://news.ycombinator.com/item?id=49308685 (103ポイント、47コメント)
最初はAT&T構文を読まされることにイライラしてたんだけど、その次のスニペットがレジスタの '%' 記号なしのAT&T構文だと気づいて混乱したよ。でも、このテクニック自体は面白いね。
実行可能なスタックって何のために必要なの? 関数ポインタを使えば呼び出せるし、関数ポインタを使うのに実行可能な読み書きメモリなんて関与しないはずだけど。
前々から思ってたんだけど、ネストされた関数って名前空間内の普通の関数じゃダメなの? たった一つの関数内でしか使わない小さなヘルパーを、コンパイル単位全体に見えるようにするのは馬鹿げている気がするんだけど…