コース目次 / 第2章

文字列は、コンパイルされても消えない

コンパイル済みバイナリからstringsで印字可能な文字列を抽出し、ソースコードに書いた文字列リテラルがそのまま残っていることを確認します。

第2章 / 全5章目安 約8分この章のゴール: stringsでバイナリから文字列を抽出し、その意味を理解できるようになる

hello.cには、“SECRET_MESSAGE_INSIDE_THE_BINARY”という文字列リテラルが書かれていました。コンパイルすると、この文字列はどうなるでしょうか。

stringsで、抜き出す

strings hello

出力は長いですが、その中に次の行があります。

SECRET_MESSAGE_INSIDE_THE_BINARY
Hello, World!
hello.c

ソースコードに書いた文字列が、そのまま実行ファイルの中に残っていました。stringsは、ファイルの中から印字可能な文字が一定の長さ以上連続している部分を機械的に拾い出すだけの、単純なコマンドです。それでも、コンパイルによって文字列が暗号化されたり消えたりするわけではないので、そのまま読めてしまいます。

絞り込んで、探す

strings hello | grep -i secret
SECRET_MESSAGE_INSIDE_THE_BINARY

実務で配布される実行ファイルには、開発中のデバッグ用文字列、内部APIのURL、あるいは(あってはならないことですが)ハードコードされたパスワードやAPIキーが、こうしてそのまま残っていることがあります。mini-ctf-webで見た「HTMLコメントの消し忘れ」と同じ根の問題が、バイナリの世界にもあります。配布前にstringsで確認するのは、基本的な確認作業の一つです。

持ち帰る一言

バイナリになっても、文字列はそのまま残る。 strings一つで、そのファイルが何をするために作られたか、何を知っているかの手がかりが得られます。次は、ファイルの先頭にある「ELFヘッダー」を、もう少し詳しく読みます。

こうなっていればOK

卒業まであと2章です。

この章はまだ完了していません。