【picogym】Static ain’t always noise WriteUP【picoCTF2021】
問題カテゴリ
- General Skills
- Easy
問題を理解
Can you look at the data in this binary: static? This BASH script might help!
バイナリの問題なのかな。
staticというファイルとltdis.shというシェルスクリプトがもらえるので、
sh使うとstaticの中身が見れるのかなという問題。
脆弱性を見つける
入手できたファイルを調査する
ファイルコマンドで調べてみます。
static:
- ELF 64-bit LSB pie executable,
- x86-64,
- version 1 (SYSV),
- dynamically linked,
- interpreter /lib64/ld-linux-x86-64.so.2,
- for GNU/Linux 3.2.0,
- BuildID[sha1]=9f1762ab580608bef0d251f5fdfaad3d19ae0963,
- not stripped
最後のnot strippedは、関数名・変数名などのシンボルが残っている状態のことのようです。
ltdis.sh
- ltdis.sh: Bourne-Again shell script, ASCII text executable
攻撃コードを作成する
解き方はいくつかありました。
解き方①:stringsコマンド
staticに対してstringsコマンドで調査したらそのままフラグゲットでした。
picoCTF{d15a5m_t34s3r_6f8c8200}
解き方②:objdump
ChatGPTに聞いてみた方法です。
objdumpとは?
GNU Binutils というツール群の一部で、
ELFやPEなどのバイナリ(実行ファイル・オブジェクトファイル・ライブラリ)を“中身の情報”として表示するコマンドです。つまり「実行せずに、中身を読むための“虫眼鏡”」です。
とのこと。
実際のコマンド。
objdump -t static
シンボルテーブルを表示するコマンドです。
関数名や変数名の一覧を見て「flag」という変数があるのを発見します。
objdump -s -j .data static
.dataセクションをダンプするコマンド。
flag変数の中身(バイト列)を直接確認しました。
出てきた文字列を結合して、フラグゲット
感想
便利なので見様見真似で使っていたStringsコマンドは、「バイナリ中から人間が読める文字列を抜き出すコマンド」のようで、実際にobjdumpでダンプした内容と比較すると、そういうことかというのがわかりました。
| コマンド例 | オプションの意味 | 出力の内容 | 使いどころ |
|---|---|---|---|
objdump -t static |
-t = symbol table を表示 | 関数名・変数名・シンボル一覧 | どんな関数/変数が入ってるか調べる。flag 変数を発見できたのもこれ。 |
objdump -d static |
-d = disassemble(逆アセンブル) | .textセクションの機械語を人間が読めるアセンブリに変換 |
プログラムの処理を追う。パスワードチェックや暗号化処理を確認する。 |
objdump -s -j .data static |
-s = full contents(内容を表示)、-j .data = .dataセクションを指定 | .dataセクションをバイト列+ASCII表示 |
グローバル変数や埋め込まれた文字列(フラグなど)を直接確認する。 |
objdump -h static |
-h = section headers | ELF内のセクション一覧(名前・サイズ・アドレス) | どのセクションに何が入ってるか把握する。.rodataや.dataの位置を確認。 |
objdump -x static |
-x = all headers | ヘッダ情報(セクション・シンボル・動的情報などまとめて) | 詳しく知りたいときに一括で出す。 |
objdump -M intel -d static |
-M intel = Intel記法指定 | Intel風の逆アセンブリ出力 | mov eax, ebx のような分かりやすい書き方。CTFではIntel記法が読みやすいので定番。 |

ディスカッション
コメント一覧
まだ、コメントがありません