CpawCTF - Main page
結論
fileコマンドでファイルの中身を確認し、実行する。
解法
拡張子のないファイルを実行する為には、先ずそのファイルがどの環境ように作られたものなのかを調べる必要がある。それには、fileコマンドが必要になる。
だがその前に、調べたいファイルをLinux上にコピーする。コピーする為には、以下のように書く。cpはcopyの略。
cp ファイルのパス
fileコマンド
ファイルのコピーができたらファイルコマンドを使う。
file 調べたいファイルのパス
ファイルコマンドを使うと、このように出力された。
exec_me: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550, not stripped
分解して読んでいく。
exec_me: ELF 64-bit LSB executable
- ELF: LinuxやUnix系で使われる実行ファイルフォーマット (Executable and Linkable Format)
- 64-bit: 64ビットCPU向けのバイナリであることを表す
- LSB: Little Endian(Intel系CPUのバイト順序)
x86-64, version 1 (SYSV)
- x86-64: Intel/AMDの64ビット命令セット
- SYSV: System V ABIというUNIX系の標準規格に準拠
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2
- dynamically linked: 実行時に共有ライブラリ(.so)をリンクして使う方式
- interpreter: 実行時に使われるローダのパス。このプログラムは
/lib64/ld-linux-x86-64.so.2
を通して起動されます
for GNU/Linux 2.6.24
- 2.6.24以降のLinuxカーネルで動くことを想定してビルドされている
BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550
- ビルド時に自動付与されるハッシュ値。デバッグやシンボルサーバで同じバイナリを特定するために使う
not stripped
- 実行ファイル内にデバッグシンボル(関数名や変数名)が残っている状態。
- 逆に
stripped
ならそれらの情報は削除済みということ。
ファイルを実行する
課題のファイルがELFファイルだと分かったので、Linux上で実行する。
chmod +x exec_me
./exec_me
- chmodはchange modeの略。ファイルのアクセス権限を設定するコマンド。
- +xは実行権限(excute permission)の追加
- 「.」は現在いるディレクトリ(カレントディレクトリ)を表す。
- シェルはコマンドを実行する際、環境変数(${PATH})に登録されたディレクトリからプログラムを探す。
- 通常カレントディレクトリはパスに含まれていないので、./なしにexec_meとだけ書いても、シェルはexec_meのファイルを見つけれない。
- ./と書けば、「今いるディレクトリにあるファイルを実行して」と明示的に指示できる。
.
がPATH
にあると、意図しないファイル(例:ディレクトリに攻撃者が置いた同名バイナリ)を実行してしまうリスクがある。./
を使うことで、実行したいファイルを明確に指定しているとシェルに教えることになり、安全性が増す。
コメント