CTF問題集問2 メモ
問題に対してのアプローチ方法をまとめた。
「事象」に対して「正しい反応とその結果」という形でまとめてみる。
====こんな感じ====
(事象を説明)→(正しい反応と結果)
改行
(事象を説明)→(正しい反応と結果)
改行
・
・
・
================
zipファイルが存在→zipファイルを解凍してls -la
ファイルが存在→「ファイルなのでとりあえず」fileコマンドで分析。実行形式を見ると32ビット実行ファイル。
・実行ファイルが存在→実行権限つけて実行してみる。usageが見えた。
・usageがわかっている→とりあえず実行してみる。flagって見えたけど、何も見えない。
・usageがわかっている→ltraceコマンドでちょっと詳しく実行してみる。実行される関数が丸見え。
・実行される関数が丸見え→じっくり動作を確認する。利用されている関数の種類、引数の使い方、引数がアドレスのどこにマッピングされているのか、が判明。
・ある程度ファイルの動作がわかった→1命令ずつ詳しくデバッグ実行していく。そういうことができる道具gdb-padaを使う。関数呼び出し部分、条件分岐、文字列あたりの内容を確認する。関数呼び出しの後のeaxレジスタの値(戻り値)はその関数が利用するために確保したメモリの先頭アドレスという前提から、calloc関数によって確保したメモリの先頭アドレスをチェックする。先頭アドレスを見つけた。
※gdb-pedaについてまとめてくれているブログ
CTFのための gdb/gdb-peda 頻出コマンドのメモ - teriyaki note
・先頭アドレスが判明→そのアドレスを利用している箇所を探す。関数が利用しているだろう(atoi関数)
・atoi関数が関係している→atoiの中身を分析する。check関数が利用されている。
・check関数が利用されていることが判明→check関数を分析する。sum関数が利用されていることが判明
・sum関数が利用されていることが判明→sum関数を分析する。動作がわかった。
・sum関数の動作条件を理解→動作条件を満たす数値を創りだす。ライブラリを使う(z3)。数値を創りだした。
・数値を入れてみて動作させる→フラグをゲットした。
・フラグをゲットした→ltraceで数値をいれてみて正常終了したかどうかを確認する。正常終了した。これが正解!
用語:
充足問題:与えられた制約(条件)を満たす解が存在する問題のこと。
この問題でわかったこれからしなければならないこと:
よく使われるライブラリ関数に精通すること(calloc,malloc,atoi,exit等)
gdb,gdb-pedaの基本操作(全部知る必要はないかな。まずは基本だけ。)
ツールを手足のように使えるように集中的に時間をかける。
その他所感:
デバッガの最低限の操作は、1命令ずつの実行と、特定のアドレスに飛ぶ動作、特定の関数に飛ぶ動作(関数内部をディスアセンブルして表示)。
それらをした時の、スタックとレジスタの内容の観察をする。