【picogym】Static ain’t always noise WriteUP【picoCTF2021】

2025年9月12日

問題カテゴリ

  • 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記法が読みやすいので定番。

 

CTF

Posted by tyokio