🔒

SH365CTF@大阪writeup

2024/11/18に公開

By Hurumy(4th place, Score: 2600)

SecHack365内のイベントで、有志の方々によりCTFが開催されました。(本当にありがとう!)
CTFは初挑戦だったのですが、Writeupなる文化があるということで書いてみます。
初心者の方にもぜひ楽しんでほしいという企画で作られたみたいです!

運営・作問: いわんこさん(@Iwancof_ptr), 新月さん(@fubukiyokiyoki), hiikunZさん(@hiikunZ), shioさん(@shiosa1t)
(↑これメンバーつよつよすぎてすごくないですか?)



わたしの状況

CTFは練習サイトのSanity Check以外やったことなし。聞いたことはある程度。
Macbookを使っているのでELFを走らせることができない。GDBは入っているが、そもそもELFが走らないので動的解析できない。BrewでGhidraを入れたが起動できなかった。パソコンに入っていたのはImHex(ディスアセンブルツール、デコンパイルは無理)とbinutils。Python3は入っているのだが、なぜかpipがうまく動かなかった。
UTMを入れたが、isoダウンロード中にディスクが爆発してVMは断念。
プレイ中に調べて導入したツールは、ディスアセンブル・デコンパイル用のIDA Free, WireShark、Pythonスクリプトを動かすためのGoogle Colab。
夜が弱くて全然徹夜できない。なのでメンバーに迷惑をかけないために一人参加。とりあえずできるところまでやってみたいと思っている。

Crypto

4th event RSA(100) (@hiikunZ)

RSA暗号について知らんかったので調べる。
デカ素数p,qを二つ使ってp*q=Nを構成し、eをあらかじめ決めておいた定数として、原文 mのe乗(mod N)を暗号文cとする。そういう決まり。
Nを素朴に素因数分解しにかかると、素因数の片方が小さかったので一瞬で素因数分解できた。p,qがわかれば、cの"eの-1乗"乗(mod N)が解ける。
Pythonが動く環境を用意するのに手間取って、結局Google Colabを使った。

simple RSA with hint(200) (@hiikunZ)

追加問。Nはデカくて素朴には素因数分解できないが、p,qに関してのヒントがあるので、紙を使って簡単な式変形で求められる。
紙がなかったのでホテルのアンケート用紙をメモに使ってしまった。ホテルの人ごめんなさい。

634 RSA(300) (@hiikunZ)

解けなかった。
Nというかp,qに関してのヒントがあるのでこれを使うっぽい。
モジュロ演算における式変形ルールがいまいちわかっておらず、モジュロ演算の理解の甘さが敗因となった。色々頑張る前にまずモジュロ演算についてしっかり復習するところから始めればよかったなあというのが感想。悔しい!物理学部なんだが!数学勉強します!

Merkle–Hellman knapsack 4.0(400) (@hiikunZ)

解けなかった。

Forensics

An ordinary pdf(100) (@fubukiyokiyoki)

PDFをImHexにかけて読んでみたが、何も分からなかったので?と思って開くと明らかに暗号っぽい文字列が載っており、これを適当なサイトにぶっこんで解読して終わり。
出題ミスだったみたいです。

Look at LSB(200) (@hiikunZ)

LSBってなんだと思って調べた。最後のビットに文字を仕込むことらしい。LSBだけ抜き出して画像として見せてくれるサイトがあったのでそこにつっこむと、画像に手書きのFlagが記されていた。
バイナリ解読してたら沼っていた気がする。

Traffic abnormality(300) (@fubukiyokiyoki)

WireSharkじゃないと読めない拡張子のファイルが配られたので初めてWireSharkをインストールした。開けてみると謎のパケットが飛び交っている。
cppファイルも配られていたので、これをみると、FlagのビットがxorをとってICMPのパケットナンバー用のビットに埋め込まれていることがわかる。XORは可逆操作なのでもう一回やってやればいい。
WireSharkでこのビットを目grepしていって、C++でXORとるプログラムを書いて、復号して終了。ファーストソルバになれたので嬉しかった。

Misc

船(100) (@hiikunZ)

記念問みたいな。ホテルの近くにある変な形の建築物の緯度経度がフラグになっている。
Google画像検索にぶっこむだけ。トリムすると精度が上がる。
文章をよく読んでおらず、小数点の切り上げ操作を忘れていて結構な回数ミスった。

散歩(100)

朝散歩に行くと、CTF運営の人がいてFlagを教えてもらえる。
二日目朝に参加した。前日深夜2時までCTFをやっていたが、なぜか運命的に6時10分に目が覚め、6時20分集合の散歩に参加することができた。CTF運営の人も前日深夜まで物理問等の管理をしていたため、非常に眠そうだった。

じゃんけん(100)

じゃんけんで勝つとフラグがもらえる。朝散歩のついでに勝ってきた。
人間はリラックスしているとパー、緊張しているとグーを出しやすくなるらしい。初手チョキで1発で勝った。

physical hacking(200) (@fubukiyokiyoki)

いわゆる物理問。ラズパイが設営され、そこにLANケーブルを繋いでWireSharkでパケットを覗き見る。
arpパケットが大量に飛び交っている。平文でIDとパスワードをやりとりしていたので、普通にこれを盗み見て、これを使ってftpサーバにアクセスし、そこにflag.txtが存在する。
物理ハードウェアがあるとちょっと楽しい気持ちになる。

file magic(300) (@fubukiyokiyoki)

flagファイルの中身が見られないように、[flag]でgrepして入力を弾くシェルスクリプトがある。grepに引っ掛からなかった場合は、file $INPUT を入力させてもらえる。
しばらくシェルが取れないか頑張ったが、どうもうまくいかない。fileコマンド以外呼べないみたいだ。
問題タイトルをじっと眺めて、fileコマンドの詳細を調べてみる。すると、fileコマンドには「Magicファイル」というファイルの種類を定義するファイルを確認するための-mフラグが存在するらしい。
試しに-m .と入力してみると、エラーでFlagファイルの中身が出力された。

Reversing

very simple flag checker(100) (@hiikunZ)

バイナリをImHexにいれたらASCIIでFlagが記載されていた。

simple flag checker(200) (@Iwancof_ptr)

正しいフラグを入力するとCorrectとかえすスクリプトであることがわかる。
そして・・・その確認に使われているのは・・・strncmp。どう見てもブルートフォース問だ!
深夜に始め、疲れていたので1文字ずつ手作業で入力して、睡眠を挟んで翌朝、大体合計3時間くらいでFlagを入手できた。
あとから作問者のいわんこさん・他のCTF参加者と話していて、手作業でやったと言うとビビられた。便利な自動ツールがあるらしい。pwntoolsや自動化スクリプトを使うと良いと教えてもらった。勉強になります!

decompile me(300) (@hiikunZ)

追加問。
問題タイトルにデコンパイルと書いているのに、ずっとディスアセンブルしたアセンブラを眺めて悩んでいた。インストールしたIDAの無料版でもデコンパイルができることに気づき、デコンパイルしてみるとすぐに何をしているかわかる。
Flagの文字列に対して、デカいchar構造体X,Yがあって、Z[i] = Y[X[i]] ^ 元文字列 みたいなことをしていた。例によってXORは可逆なのでもう一回やってやれば良い。XとY構造体、Zの中身を手作業でcppファイルに書き写して、XORとるプログラムを書いて終了。

flag grader(400) (@hiikunZ)

解けなかった。
前回の問題でデコンパイルのやり方がわかったので即デコンパイル。するとFlagは42文字で、その各42文字に対してそれぞれ別のサブルーチンが走り、2回ずつくらいリテラルとXORをとっていることがわかった。
サブルーチンが40個ほどずらっと並んで絶望した。この大量のリテラルを手作業で書き写す元気は流石にない。いやまさか、42文字全ビットに対してこれを復号操作するわけではあるまい。きっと、よくわかんないが、動的解析?とかをしたらレジスタにいい感じの数字が入って読めるようになるに違いない。と思って諦めていたが・・・・
終了後に聞くと、「静的解析で気合いで全部復元するのが正規ルート」らしくてビビりちらかした。2人くらい解いてる人いた。42回ですよ!??!

pwn

your first pwning(100) (@Iwancof_ptr)

ファイルをずっとディレクトリだと思い込んでいてなんとかchmodできないかウニョウニョしていたが、普通にcatするだけの練習問だったらしくて死亡した。
catのできない若者になってしまった・・・

can you win the game?(200) (@Iwancof_ptr)

解けなかった。
win関数というシェルを呼び出す関数があり、main関数からこいつを呼び出せばOK。静的解析でwin関数がmainから見てどこにあるかわかった。printf関数が自分のケツにあるビットをフォーマット記号に合わせてゴリゴリ読んでいくだけという異常脆弱実装であることは知っていたのだが、自分が今どこにいるのか、実際具体的にどこで何ビット前を呼び出せばwinをcallできるのかわからなかった&もっと納得できるまで調べたかったので後回しにしていたらコンテストが終わっていた。

can you make the win?(300) (@Iwancof_ptr)

解けなかった。

easy pwn(400) (@Iwancof_ptr)

隠し問題。解けなかった(というか見られなかった)

Web

SuperQuickLogin(100) (@shiosa1t)

Webの技術はマジで詳しくなかったため、「SQLインジェクション やり方」などの検索で出てきたのを片っ端からぶっ込んでいたらいけました。

デジタルHIKYAKU(200)(@hiikunZ)

解けなかった。
SH365表現駆動4Bチームの作品をハックするという面白い建て付けの問題。10チーム以上が解けていたのだが、解くことができず・・・

showcase(300)(@shiosa1t)

解けなかった。

全体の感想

CTFはやったことがなかったのだが、検索で済むような簡単な問題を嚆矢として、知らないことを調べたりツールを導入して食らいついて行っているうちに、最初は歯も立たなかったであろう難しい問題がだんだん解けるようになっていたので、難易度の階段がすごくうまくできていたのかなと思いました。
あとCTFの開催中は常に問題のことが頭の片隅にあり、すごく夢中になって楽しめました。
問題を解いていくうち、だんだん真っ黒だった画面が緑色になっていって気分が良かったです。
とても楽しかったです!!運営の皆さんありがとう!!!
Hack The Box登録しました。

Discussion