はじめに
こんにちは、19Bのxxpoxxです。
いつもは部内サービスの開発をしています。
本日、4/25にCPCTF、競プロとCTFの体験会が開催され、大盛況にて幕を閉じました(予定(じゃなくなった))。
当日レポートはこちら
参加してくださった皆さん、ありがとうございました。
私は16問、最大獲得可能点数合計2530点分の作問およびスコアサーバーの開発をしていました。
この記事では、CPCTF2021の作問者writeupを書いていきます。スコアサーバーの話は後日記事に出るので、お楽しみに!
作問者writeup
以下の16問を作問しました。うち1問はCPCTF2019からの出題だったので、私が実際に作問した問題は15問となります。
- Newbie/Call And Response
- Newbie/RGB(from CPCTF2019)
- Newbie/What Is Shell?
- Binary/Do You Know Flag?
- Binary/Treasure Box
- Binary/Entrance Ticket
- Forensics/Spaceship
- Forensics/Game Addiction
- Forensics/Neko Is So Cute
- Forensics/Favorite Pictures
- Misc/Can You Sort?
- Misc/Pair
- OSINT/Boundless Internet Ocean
- OSINT/Dig The Account
- OSINT/Student ID Card
- OSINT/Where Is That Celebrity?
Newbie/Call And Response(82AC)
PPCジャンルのNewbieでした。inputの練習となるような問題を、ということでそのまま入力文字列を出力する問題です。複雑なinputの練習問題も作れば良かったと少し後悔しています。この問題は問題文に一番力をかけました。ロリ子って誰でしょうね...
Newbie/RGB(35AC)
ForensicsジャンルのNewbieでした。2019年のCPCTFに出題された問題を、画像を作り直しただけの問題です。(0, 1, 0)の色で文字が書かれているという問題でしたが、Steganographyの存在を知らないと意外と気づきにくいかもしれません。青空白猫を使うと非常に簡単に解けるので、ソフトの紹介という意味でも良問だったと思います。まあ僕は作っていませんが...
Newbie/What Is Shell?(52AC)
ShellジャンルのNewbieでした。シェルコマンドがわからない方のために、cat、ls、cdコマンドの紹介をする問題です。traPは初心者にも手厚いサポートを行っています(ステマ)。
Binary/Do You Know Flag?(27AC)
gdbを用いて逆アセンブルすると、1文字ずつ入力をフラグと比較しており、これをもとに戻していくとフラグが得られるという問題です。main関数の部分を逆アセンブルすると
0x555555555237 <main+142> cmp $0x41,%al
0x555555555239 <main+144> je 0x555555555251 <main+168>
0x55555555523b <main+146> lea 0xdd9(%rip),%rdi # 0x55555555601b
0x555555555242 <main+153> callq 0x555555555080 <puts@plt>
0x555555555247 <main+158> mov $0x0,%eax
0x55555555524c <main+163> jmpq 0x555555555557 <main+942>
0x555555555251 <main+168> movzbl -0x10d(%rbp),%eax
↑のような繰り返しが見られます。0x41などを見た瞬間に文字だと気づく方には簡単だったかもしれません。実際に正しいフラグをプログラムに入力するとCorrect!と出力されるでしょう。
Binary/Treasure Box(15AC)
ZFフラグを知っていますか?私は知っています問題です。gdbを用いてjneを通過するとflag関数がcallされ、フラグが出力されます。一応他の解法としてはflag関数のアセンブリを読むと、keyとある文字列の各文字に対してxorをとってフラグを再現しているため、もう一度各文字に対してxorをとり、フラグを得る方法があります。この知識がある人はZFフラグを知っています(完)
Binary/Entrance Ticket(8AC)
本質的にはsrand関数のシード値が同じだと乱数も再現できちゃうねという問題でした。webshellなどで試すと、srand関数のシード値はrdiレジスタに代入されることが確認できると思います。rdiレジスタを見ると、71249が代入されているので、これを使えばランダムにシャッフルした配列を再現でき、全探索で求める番号を得ることができます。
Forensics/Spaceship(52AC)
zipファイルを解凍するとspaceshipというファイルが普通に出てきて「パスワードついてないんか~~~い!!!!!」とびっくりした人もいるかもしれません。テキストエディタでこれを開くとその理由は明らかで、spaceshipをそのままダウンロードすると、Chrome等では自動でspaceship.xmlと拡張子がついてしまうからです。ということでこのファイルはxmlファイルでした。内容を確認するとkmlファイルであることがわかります。そこで、Google Earthを使ってこのファイルを開くと、太平洋にでかでかとフラグが書いてあります。宇宙船から見た地球って感じですね🙄
Forensics/Game Addiction(25AC)
パスワード総当たり問です。ついでに白文字のWordファイルにもなっていました。パスワード総当たりは気づきにくく、さらに今回はやや時間のかかる4文字のパスワードだったため、少し難しかったかもしれません。比較的容易に実装でき、またfcrackzipなどの便利なツールもあるのでパスワードの特定が難しいときには試してみると良いかもしれません。
Forensics/Neko Is So Cute(12AC)
ねこはかわいいですね。どう頑張ってもフラグに関する情報が得られないときはSteganographyを疑うと良いです。あえて0ビット目ではなく1ビット目に、MaxiCodeを埋め込んでいました。この出てきた二次元コードを見てもなにか知らない人が多かったと思います。また、うまく切り取って画像検索してもなかなかMaxiCodeとは出てこないため、難易度が上がっていました。二次元コードの種類一覧のような表からこの画像のコードを見つけ出す方針が早いと思います。ちなみにこのMaxiCodeは宅配業者によって開発されたもので、リードソロモン方式を使っており、読み取り速度が速く障害に強いため、物流の仕分けや追跡などに使われているらしいです。
Forensics/Favorite Pictures(4AC)
既知平文攻撃&バイナリ編集問題でした。dmvamu8.jpg
という画像が一意に特定できる画像であるとは思わないと思うので、非常に難しかったと思います。画像の名前で検索することが問題を解く第一歩でした。traPのプロフィール画像が変えられたら一巻の終わりだったのですが、僕は†広報補佐†なので大丈夫でした✌この問題のさらに難しいところは、画像をどれだけ調べてもフラグに関する情報は見つけられないことです。そこでバイナリを見てみると(なんで)、不自然な連続したデータが存在します。このことから画像の高さを変更すると、フラグが現れます。
Misc/Can You Sort?(51AC)
問題名通り、ソートさせたいなと思ったので作った問題です。ロードにも時間がかかるほどのファイルがソートできると、うれしいですね。各種言語でソートを行っても良いですし、シェルスクリプトを書いても良いでしょう。
Misc/Pair(12AC)
緯度経度からどうこうする問題を作れたら面白そうと思ったので作った問題です。頭文字をとるところが非自明であまり良くないのですが、メモで並べたら気づいたりするかなと思ったのでよし!(現場猫)数字の範囲から緯度経度かなと気づいたときの脳汁がやばそうで非自明以外は良い問題だと思っています。
OSINT/Boundless Internet Ocean(58AC)
Twitter検索を知っていますか?私は知っています。リンクから飛べるのは記事一覧とTwitter、ポートフォリオですが、問題文からして記事かTwitter、検索をかけると記事にFLAGという文字列はないのでTwitterであることはわかると思います。あとはfrom検索をかけるとフラグが出てきます。私の本名と作問した時期がわかりますね☺
OSINT/Dig The Account(54AC)
Twitterの鍵垢を監視したいとき、ありますよね。Twitterの鍵垢から情報を得るのは難しいですが、そのアカウントにあてられたリプライは見ることができます。これに着想を得た問題でした。あるアカウントに向けたリプライを検索するにはto:@アカウントID
とすると見ることができます。今回はto:@_____Noel____
と検索するとフラグが出てきました。
OSINT/Student ID Card(44AC)
東都工業大学の学籍番号を当てる問題でした。キーワードとなりえるワードは全て検索にかけると良いです。今回は東都工業大学 学籍番号
、情報理工学院 学籍番号
、さらにこの検索の中で出てくる東都工大
というワードを用いて東都工大 学籍番号
と検索すると全ての情報を得ることができるようになっていました。検索する場所は、Google検索にかけても何も出てこないので、Twitterを検索すると良いです。この問題はネットにある情報から欲しい情報を手に入れるという作業をひとつずつ着実に行う問題でしたが、最も調査感があったのではないでしょうか。
OSINT/Where Is That Celebrity?(43AC)
横須賀に住んでいる人は電話番号を検索するだけの問題でした><横須賀に住んでいない人は、後ろにある艦艇に着目して検索していくことで、答えを導けたと思います。横須賀基地は規模も大きいため、大きな基地をひとつずつ見るだけで見つけることができたでしょう。
最後に
有志によるコンテストで、拙い点が多々あったとは思いますが、参加してくださって本当にありがとうございました。今後もCPCTFに関するブログ記事が出ますので、是非読んでみてください!!
謝辞
作問に協力してくださった方々、CPCTFの開発・運営の方々、traP部員、親、全人類に感謝🙏