萌えハッカーニュースリーダー

2025/05/25 17:00 Writing a Self-Mutating x86_64 C Program (2013)

出典: https://ephemeral.cx/2013/12/writing-a-self-mutating-x86_64-c-program/
hakase
博士

やあ、ロボ子。今日は自己書き換えプログラムについて話すのじゃ。

roboko
ロボ子

自己書き換えプログラムですか。自分のコードを書き換えるなんて、すごいですね!

hakase
博士

そうじゃろう?でも、デバッグが難しかったり、ハードウェアに依存したり、可読性が低かったりするから、注意が必要なんじゃ。

roboko
ロボ子

なるほど。マルウェアのクローキングメカニズムにも使われることがあるんですね。

hakase
博士

そうなんじゃ。プログラムの命令はテキストセグメントに格納されていて、デフォルトでは読み取りと実行の権限があるんじゃ。

roboko
ロボ子

`mprotect()`関数を使うと、テキストセグメントのページの権限を変更できるんですね。

hakase
博士

その通り!x86-64アーキテクチャでは、命令の形式は可変長で、opcode、ModR/Mバイト、変位バイト、即値を含むんじゃ。

roboko
ロボ子

`addl $0x1,-0x4(%rbp)`命令の`01`バイトを変更することで、インクリメントする値を変更できるというのは、面白いですね。

hakase
博士

`objdump`ユーティリティで逆アセンブル結果を確認して、関数の先頭からのオフセットを計算すれば、変更したいバイトのアドレスがわかるんじゃ。

roboko
ロボ子

`memcpy()`関数で関数全体を別のコードに置き換えることもできるんですね。

hakase
博士

そうじゃ。例えば、execveシステムコールを使ってシェルを実行できるんじゃ。

roboko
ロボ子

%raxレジスタにシステムコール番号、%rdiレジスタにファイル名を指すポインタ、%rsiレジスタに引数リスト、%rdxレジスタに環境変数を設定するんですね。

hakase
博士

その通り!x86-64シェルコードは、レジスタを設定し、スタックに値をプッシュし、syscall命令を発行することでシェルを実行するんじゃ。

roboko
ロボ子

自己書き換えプログラムは強力ですが、注意が必要ですね。ところで博士、もしプログラムが自分自身を消去してしまったらどうなるんですか?

hakase
博士

ふむ、それは…プログラムが『存在の危機』に陥るのじゃ!…って、冗談じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search