CakeCTF 2022 nimrev, zundamon writeup

参加して2問解いたのでwriteup

nimrev

Nim言語で書かれたプログラムのリバースエンジニアリング。
Nimの内部処理はわからないが、関数名から推測しつつcallを追っていくと、NimMainModuleがメイン処理であることがわかる。
さらに細かいことを考えずcallを追っていくと、

  1. 標準入力から読み込む
  2. 配列を作成して値を設定
  3. 配列をmapする
  4. 配列をjoinする
  5. eqStringsの結果で分岐して”Correct!”か”Wrong!”のどちらかを出力

という流れと推測できる。
Nim公式のリファレンスを参照してmap処理時のプロシージャの引数位置を確認、コードから該当する箇所を探すとNOTしてるだけとわかるので、2.の配列に設定された値のNOTを取ってフラグを取得。

Flag: CakeCTF{s0m3t1m3s_n0t_C}

zundamon

実行ファイルとpcapを渡される。pcapには複数のIPの通信があるので、まずはこの実行ファイルの通信先を確認する必要がある。

sink関数を覗くと通信回りの初期処理をやっており、ここで通信先が164.70.70.9:6379であることがわかる。pcapから該当する内容を確認するとこんな感じ。

$17の後にMACアドレスと思われる17バイト、$3の後に3バイトのデータを送ってることがわかる。MACアドレスは最初からずっと同じで、3バイトのデータは変化している。
3バイトのデータを送信することで何らかの情報を外部創出しているものと思われるので、ここを解析して何が送られているのか見ていく。

$17$3の送信をしている関数はexfiltrate(そのまんまだ…)で、$3の送信データになっているバッファを確認すると、3バイトのうち先の2バイトはexfiltrateの第3引数、後ろ1バイトはexfiltrateの第2引数で指定されている。

これらの出元をたどると、readで繰り返し読み込んだデータの書き込み先であることがわかる。書き込み先の先頭はrspで、そこから18バイト先からがexfiltrateでの送信データになる。

ではreadで読み込んでいるものは何か。readの第1引数fdを追いかけると、source関数の返り値であることがわかるので、source関数を読み解くと、/dev/input/event1(キーボード)を開いていることがわかる。その後のioctlの意味がわからなかったので誰かわかる人教えてほしい。

/dev/input/event1から得られるデータはinput_event構造体となる。

struct input_event {
        struct timeval time;
        __u16 type;
        __u16 code;
        __s32 value;
};

struct timevalは128bit(16byte)のため、exfiltrateに渡されるデータは、codevalue(の先頭1バイト)になることがわかった。codeの値はinput-event-code.hにキーボードのキーとの対応が定義されている。valueはキーの状態を表し、0がup、1がdown、2がholdとなる。ちなみに、各キーを押したときのcodeの値はevtestコマンドで確認できる。

pcapから3バイトのデータ部分を抜き出すとキーボードの入力履歴情報となる。使用されていたのが日本語レイアウトのキーボードであること、NumLockがOffのときのキーパッド1はEndであることに注意すると、以下の文字列が抽出できる。

CakeCTF{b3_c4r3fuL_0f_m4l1c10us_k3yL0gg3r}
I hope nobody is seeing my screen...

Flag: CakeCTF{b3_c4r3fuL_0f_m4l1c10us_k3yL0gg3r}

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください