ELF64を自前で生成する方法がわかったので、それを使って[クワイン](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AF%E3%82%A4%E3%83%B3_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%29)をさせてみたら面白かろう、と思ってやってみた。
結論からいうと、まるで面白味のないものになった。
プログラミング言語でのクワインの場合、プログラムのソースコードをデータとして持っておいてそれ自身を埋め込んだ文字列を出力するという方法を取るみたいなんだけど、 ソースコードを文字列データとして持つときにクォーテーションをエスケープする必要があって、そこがちょっとトリッキーになる。
だけどELF、バイナリの場合にはプログラム=データ=バイト列なのでそもそもクォーテーションがないのでエスケープする必要もなく、データをそのまま出力できてしまう。
さらにLinuxのELF読み込み時にヘッダもろともメモリに読み込んでいるので、データを別に持つ必要がなくて実行しているプログラムそのものがデータとして直接使用できる。 なので自分自身を埋め込むために2回出力する必要もない。 (コード自体の参照を無効としても、データとして保持して2回出力するだけなので難しさは変わらない。)
というわけで、生成するためのCコードは”Hello, world!”とあまり変わらない内容だった:
|
実行結果:
$ gcc -m64 -Wall -o elf_quine elf_quine.c |