🎍

2023年年賀状 Writeup

#tech#CTF#zatsu

2023-5-25

年賀状を CTF 形式にしました

昨今,年賀状を出さない潮流がありますが,私は完全に出さないのもなんだかなあと考えているので,近年はかなり人数を絞って年賀状を出しています.

ここで一部の情報系の知り合いの人間に対しては CTF 形式で電子的に年賀状を発行してみると面白いのではないかと考え,これを今年の始めに実行しました.本記事はその Writeup です.基本的には年賀状を受け取った人用のものです.

ターゲット

問題のレベル感を説明するために,まずは出す対象の多くに共通する属性について述べます:

  • 情報系学生
  • 非 CTFer
  • 簡単なアセンブリは読める

問題概要

問題 URL にアクセスすると 1 つの zip をダウンロードすることができます.この中には

  • AES で暗号化された年賀状
  • 暗号化・復号化 Python スクリプト(暗号化の際にはキーの入力を求めてそれの sha256 で暗号化.復号は逆.)
  • 謎の実行可能ファイル(以下 quiz)
  • Readme(後述のヒントを紛れ込ませた)

が入っています.

Writeup

quiz を実行するとクイズが 2 問出てきます.これは答えられるので答えると 3 問目で flag を聞かれます.当然分かりませんので逆アセンブルをします.

逆アセンブルして libc の関数を呼んでいる所とかをヒントにして適当に 3 問目の処理をやっている場所を見つけます:

逆アセンブルして3問目の辺りを適当に抜き出してきた

これをグッと睨むとまず入力文字列(復号化キー)に対して strlen で長さの検証が入り,13 文字であればパスして各要素が seed という配列で同じインデックスの要素と xor を取られて converted という配列の同インデックス要素に一致するかが判定されています.

ここで薄々気付かれた方は気付かれたと思うんですが Readme に入っているヒントは「gcc に g オプションが付いている」でした.非 CTFer にガチガチのバイナリ解析を要求するつもりが無かったので.

このため普通に gdb 等で seed と converted の中身を覗くことができます.ここから復号キーを求めるには単純に seed と converted で各要素の xor を取ればよいです.有名テク.

このため適当にキー復元コードを書いて得られたキーを復号用スクリプトに入れれば復号された年賀状が手に入ります.

年賀状について

随分前に文字のバウンディングボックスの面積に対して文字が占める黒い部分の面積の割合でソートし,元画像をモノクロにしたものに対して画素ごとに文字を割り当てるアスキーアート作成スクリプトを書いたことがあったのでパワポで年賀状を作り,それを食べさせたものを暗号化させて作りました.

反響と反省

元々は 1 人をターゲットに出したのですが解けず,同内容で年賀状の内容だけ変えたものを最終的に合計で 5 人に出題しましたが誰も(自力では)解けませんでした.かなしい.

ただし概ねウケは良く,「同じように CTF 年賀状をやってほしい.ただし来年までは長いので暑中見舞いで出してほしい」などの意見が出ました.このためできる範囲でやっていこうと思います.

反省としては,誰も解けなかったのでちゃんと難易度調整を頑張った方が良かったと思っています.