ぺぺっぱーの日記帳

なんか そういうかんじで

SekaiCTF 2023 感想

ノリで誘われたのでノリでSekaiCTF(Project SEKAI CTF 2023)に参加してきました。

開始時点ですでに48時間のうち24時間が過ぎていましたが何問かは解きました。

ということで雑に書き残しておきます。

解けたやつ

Azusawa’s Gacha World(Reverse)

電子辞書のやりすぎでリバースエンジニアリングに関してはできそうだったのでとりあえずそこから攻めていきました。

dist.zipをダウンロードするとUnityのゲームが出てきます。とりあえずフォルダーの中を見るとil2cppではなくMonoを使用していることがわかるのでAssembly-CSharp.dllをdnSpyに食わせます。

中身を見ていくとGachaManagerクラスが怪しそうなのでリクエストの中身を確認します。このあと私はcurlでリクエストを投げてみたりしていましたが全く必要ありませんでした。

後でゲーム内に100万回目で確定排出と書いてあることに気づき、BepInEx+UnityExplorerを入れてGameStateクラスのpulls変数を999999に書き換えてからガチャを回すと目的のキャラクターが排出されそのリザルト画面に左下にフラグがあるので終了です。30分弱くらいでした。

Guardians of the Kernel(Reverse)

Linuxカーネルとinitramfsがあります。とりあえずGhidraにカーネルを食わせつつ(無意味でしたが)initramfsの中を漁りました。

initramfsの中の/initを見てみるとflag_checker.koという怪しげなモジュールをロードしているのでそれをGhidraにかけます。

ただ取っ掛かりがないのでとりあえずString Searchで怪しい文字列を探します。すると"Unlocked layer 1."や"Unlocked layer 2."といったものが見つかります。device_ioctl()から参照されていることがわかるのでその関数を見に行きます。

Layer1は単純でbufferの中身が"SEKAI{"であることをそのまま検証しているだけです。

Layer3はnバイト目の変換にnバイト目とn+1バイト目を使用しているので、比較に使っている定数から逆変換するにはヌルのバイトから逆方向に1文字ずつ処理すれば良いです。コードを書いても出せますが12文字くらいなので手で解きました。末尾が"SEKAIPL@YER}"であることがわかります。

Layer2が曲者で結果から逆算しようとしても途中で乗算が入ってしまっているためオーバーフローにより必要な値を一意に定めることができません。しかしバッファがヌルを含めて8文字であり全て数字であることを検証しているため、判定部をそのまま持ってきて0~9999999で総当りするプログラムを書きました。結果"6001337"であることがわかります。

ガチャの分から1時間後くらいに終了しました。

I love this world(Misc)

上2つ以外のリバースエンジニアリング系の問題は唐突にレベルが上がって解きづらかったのでその他のジャンルもぶらぶらしつつ様々な問題に中途半端に手を突っ込んでいました。その時に見つけた問題です。

.svpファイルがあります。ソフトはよくわからない(Synthesizer Vですか? 持ってないのでよくわからないです)ですが中身は平文JSONなので読んでみます。

どうやら歌詞やピッチが書いてあるようですが歌詞に対して明らかに発音データが合っていません。歌詞にもフラグとして成立しそうな文字列がありますが問題の方にフラグに日本語は含まれていないと書いてあるため、気合で発音をアルファベットに変換してみるとフラグを含む文字列が得られます。フラグは書き残してないので忘れました。

カーネルの分から実に3時間半後のことでした。

DEF CON Invitation(Forensics)

.emlファイル(電子メールデータ)があります。文面は普通ですが添付されているカレンダーデータ中にあるサイトに飛ぶと地図が出てきます。地図下のオフラインマップをダウンロードするボタンを押すとpngに拡張子偽造しようとした.vbsファイルが出てきます。

.vbsファイルはかなりいらない情報が多いのでいい感じに読み飛ばします。まず必要なのはOwOwO(ewkjunfw)の結果です。ewkjunfwの中身はある画像データのダウンロードURLをHexにしたものでした。

とりあえずそれをダウンロードしますがファイル名にXORedと書いてあります。PNGのmagicと突き合わせて鍵を見つけようとしましたが16Byte程度では規則性が見つけられませんでした。PNGファイルで基本的に値が一致するのはそれくらいのようなのでこの方法では鍵がわかりません。

しばらく悩んでいたのですが、最後のExecuteのところを見る必要がありました。これはあるURLにJSONをPOSTしています。試しにPOSTしてみるとJSONが返ってきて、msgにお前はadminじゃねえというメッセージが入っています。ということでusernameをadminとして送信してみるとなんか鍵が返ってきます。この冒頭部分がさっきXORして計算した結果と一致するのでこれがXORに使用した鍵とわかります。

あとはファイル全体にその鍵でXORをかけて復元しpngを開くと画像にフラグ"SEKAI{so_i_guess_we'll_get_more_better_next_year-_-}"が書かれています。

I love this worldから1時間くらいあとに終わっていますが実際にはI love this worldに手を付ける前から始めています。

解けなかったやつ

こっからは順不同です。強いて言えば問題の添付ファイルの名前順?

Cosmic Ray(Pwn)

実行ファイルがあり、このプログラムのメモリ空間のうち1bitを反転させることができるプログラムです。

チームの他の人がうんうん唸っていた記憶はありました。最終的に私がたどり着いた結論はデータ領域ではなくプログラム領域、それもmain関数のスタックカナリアの部分を無効化すれば良いことに気づきました。jeとjneはちょうどオペコードが1bit違いなのでそこを反転させるとスタックカナリアが「破壊されていないとき」に文句を言ってabortするようになります。

あとはshellcodeを組むだけなのでしょうが実際に攻撃する環境下でのスタックアドレスがわからず戻りアドレスを確定させられなかったのでSIGSEGVを起こさせるのが精一杯でした・・・。

Infected(Forensics)

.pcapngがあります。WordPressに対して攻撃しているっぽいのはわかるんですがどこで攻撃が完了したのかさっぱりわからず・・・。

Scanner Service(Web)

Docker用のファイル一式があります。中のプログラムはrubyで書かれています。

入力を検証してコマンドラインに渡してそうではあるんですが、rubyの標準の文字列->数値変換関数は数字として認識できる文字までで変換をストップしてしまうので実際には検証しきれていません。

そこがポイントであることまではわかりましたが、その前段にシェルで意味を持つ記号類がエスケープされてしまっているのでどう入力を組めば実際の攻撃が可能なのかはわかりませんでした。他のチームメンバーも同じところで詰まっていた気がします。

Text Sender(Pwn)

実行ファイルがあり、メッセージを作成したり送信できるプログラムということになっています。Ghidraに食わせましたがどこが弱いのかよくわかりませんでした。

Conquest of Camelot(Reverse)

実行ファイルがあり、OCamlで書かれているようです。本体の処理部分の位置は分かりましたが非C系言語のネイティブバイナリにありがちなよくわからない関数呼び出しで追いきれませんでした。

Eval Me(Forensics)

.pcapngファイルがありますが、中の通信の大半がTLS通信で見えません。client randomがエクスポートできるような感じですが中の通信と一切合致しませんでした。

SSH(Misc)

.ovpnファイルがありネットワークに接続できます。nmapしてみると10.0.0.1~10.0.0.4がありますが10.0.0.4の22番くらいしか開いていません。後で気づきましたがwiresharkも見るべきだったかもしれません。どこかから10.0.0.4に対してsshしてるかもしれないので。

Teyvat Travel Guide(Reverse)

急に別ゲー出すじゃん。

実行ファイルがあります。48x48のマスの右下まで到達する必要がありそうですが途中に見えない罠がありそこを通ると死んでしまいます。

罠を置いている処理の箇所は見つかったのですが進むたびに更新されているので追うのがめんどくさいです。全探索すれば終わってしまうからPoWがついてるんでしょうね。

と書いて気づきましたがもしかしてバイナリを弄ってPoW無効化してから全探索すればよかったですか?

A letter from the Human Resource Management(Misc)

.txtファイルがあります。Human Resource Managementは持っとらん。

Network Tools(Pwn)

実行ファイルとそのソースコード(rust)があります。main関数は中がunsafeで囲まれており、また他のチームメンバー曰くバッファに対してデータを読みすぎているところがあるということでしたがshellcodeの組み方がわからないので撤退。

Sahuang Flag Checker(Reverse)

実行ファイルがあります。これが地味に厄介でGhidraだとAVX命令周りでディスアセンブルに失敗するところがあるのでまともに読めません。Cutter(radare2のGUIフロントエンド)を使用したらちゃんと読めるんですが逆にデコンパイラの出力が地味に読みづらく追うのを諦めました。

SekaiCTFCorp(Misc)

ウェブサイトのURLがあります。下の方の企業ロゴ(?)のリンクが切れている以外は特に何もありません。多分。それ以外何もわかりませんでした。

感想

簡単な問題しか解けませんでした。Cosmic Rayとかも簡単ではあるっぽいんですが・・・。

CTF筋が足りてない感じがします。まあCTFはちゃんとやったことは今までないですしリバースエンジニアリング系は単純にGhidra力でゴリ押してるのでさもありなんという感じでしょうか。本来定石を押さえておくべきなんでしょうね。

ただ全くできないというわけでもなさそうなので、もしまたやるときがあればもう少しいい感じにしておきたいですね。

広島国公立三大学の名称とかもろもろについて

広島の大学名は地味にややこしい。広島市にキャンパスが存在する国公立大学だけでも(国立)広島大学県立広島大学広島市立大学が存在する(ただし広島大学の本拠地は広島市ではない)。私立も含めると.*広島.*大学にマッチする大学は多い。

しかもさらにややこしいのが県立広島大学広島県立大学ではなく、同様に広島市立大学は市立広島大学ではないことだ。慣れていない人間は割と間違えることがある。

 

県立広島大学広島市立大学には略称の問題も付きまとう。

県立広島大学を「県立広島」あるいは「県広」と略してしまった場合、県立広島中・高等学校と衝突してしまう。「広大」と略せば当然国立大学と衝突する。

ちなみに近畿大学付属中高や修道中高と異なり、県立広島中高と県立広島大学の間には何の関係もない。むしろ県立広島大学に進学する人間の数倍は広島大学に進学する。

 

広島市立大学はもっと面倒な問題がある。広島市立大学の英語名称は"Hiroshima City University"である。これを順当に略せばHCUであるが、実はHCUは広島都市学園大学 "Hiroshima Cosmopolitan University"に先に取られているのである。

このせいで広島市立大学ドメインはhiroshima-cuになるのだが、広島大学ドメインhiroshima-uと非常に似通っている。いつもと違う方の大学のドメインのページを見るとChromeが「間違えていませんか?」というポップアップを出してくる。余計なお世話だ。

 

広島市立大学の日本語略称に関しても若干思うところがある。公式の略称は「いちだい」となっているはずだが、市立大学は全国にたくさんあるのでこの略称だと10校くらい被りそうな気がする。

広島市立大学生のTwitter民はよく「いちぴろ」という略称を使う。これはかなり理にかなっているように見えるが、ここで冒頭の部分を思い出してほしい。「広島市立大学は市立広島大学ではない」のである。しかし「ひろいち」「ぴろいち」もしっくりこない。困った。

あと広島市立大学の正式な読みは「ひろしましりつだいがく」なのだが入力しようとすると高確率で「広島私立大学」になる。発音しても地味にわかりにくいので「ひろしまいちりつだいがく」と呼ぶことも多い(というか「いちだい」もこの読み方でないと成立しない)。

 

ということでこの大学名問題を解決する方法と言ったら、何か突飛な名前に変えるくらいしか思いつかない。ちなみに私は広島市立大学を「市立山の上大学」、(国立)広島大学を「国立山の上大学」と呼ぶことがある。

 

この問題、実は7年位前からネタにされてるんですよね。

ある意味不明なホームページの話

もしもホームページが全て画像で構成されていたらあなたはどう思うだろうか。

そんなバカなホームページがあるわけがないと思うだろうが、実は実在しているのである。

今回はそんなとんでもないホームページ「北辰映電」について語ろうと思う。

 

以下の記述は2023/1/16時点のものである。

 

(自分のツイートを掘り起こしたりいちいち変なところ思い出すのがめんどくさいだけ)

 

北辰映電って?

北辰映電は広島市を本拠地とする株式会社である。大学とかに色々納入しているらしい。

そしてこの会社が関わった(少なくとも広島市立大生には)最も悪名高いものがぎゅっとeと呼ばれるeラーニング英語システムである。ぎゅっとeがなぜ悪名高いかはGoogleで検索すると少しばかりわかると思う。Twitterのほうが見つかるかもしれない。

(ただぎゅっとeの悪評に関してはぎゅっとeそのものの悪評とぎゅっとeを使用した授業に対する悪評が存在するのでこの会社だけが悪いわけではない)

で 何がヤバいの

まず全てが画像で構成されている。全ての文章もだ。コピーしようとしてドラッグしたならばあなたは妙ちくりんな切られ方をされた画像がカーソルにひっついてくるのを見ることができるだろう。UserCSSで画像を回転させるアニメーションを適用したらもう阿鼻叫喚だ。

(追記:実際にUserCSSを適用したGIFを作成していたpuhitaku氏から使用の許可が出たのでここに貼っておく この画像は2021/12/06時点のもので2023/1/16時点のサイトと若干異なる)

 

左の会社概要のリンクは何も問題はない。(ただし中のページの画像の区切りに関しては別だ)

しかし下の会社概要のリンクを開くと味のあるエラーページを見ることができる。URLのcompanyの綴りを間違えてしまっているのだ。

 

リンク集は割と普通に見える。テキストが途中でぶった切られているようには見えない。

・・・おや?下のリンク集が反応しない。なんとすぐ上のテキストとフッターのリンク(だったもの)が一体化している。

 

一体どのようなオーサリングソフトを使えばこんなことになってしまうのか、今まで答えにたどり着いたものは居ない。ただ一つ進歩しているのは、比較的最近更新されたページの画像の区切りは多少マシになっていることである。全て画像である時点で論外ではあるが・・・

2022年のまとめと2023年の抱負

ゆでっちがツイートしてたので便乗

2022年のまとめ

2022年というやつも、なかなか濃い一年だった気がします。大学生になってからなかなか退屈しなくなりました。

 

ということでまずは1月から順に振り返っていきたいと思います。

1月

新年早々基板設計をしていました。というより確か12/31からずっと夜通し設計してた気がします。これが初めての基板設計でしたがpcjpnet氏や金魚氏のアドバイスでよさげな基盤が完成しました。

初秋月もこのタイミングでした。ところでこのツイートの日付が2021/12/31になっているように見えるかもしれませんが多分時差のせいです。

pcjpnet氏から温調はんだごてをいただきました。長時間使ってても無駄に熱くならないのでやりやすいです。

2月

この辺りからVRChatにぽつぽつログインするようになりました。

3月

初めて自分の足で東京に来ました。というよりこれまで東日本に行ったことが高校の修学旅行で羽田と成田を経由したことしかなかったです。やっぱりみんながいるとたのしいね。

なお8月にも行きました。2023年の2月にも行く予定なのでみんなよろしくね。

4月

puhitaku氏の岡山拠点を訪ねてきました。もちろんハードオフ巡りもしてきました。

よく考えたら県外で車を乗り回すのこの時が初めてでしたね。

あと新学期初日辺りで車のバッテリー上がりました。

5月

RTX3060を買いました。VRChatが快適になりました。

6月

インターンの選考受けたらめちゃくちゃ感触良かったのにダメでした。地理的に仕事やらせにくいのかもしれない。

あと誕生日に哺乳瓶で酒飲むやつまたやりました。やっぱり飲みづらいので3回目はやらないと思います。

7月

ゆでっちに圧力をかけてアバターを買わせました。

あと中旬に車の右側面を破壊してしまい、8月東京から帰って来るまで代車でした。

月末にTOEIC受けに行きました。学校で受けてたやつは1時間くらいで終わる奴だったんですが、ノーマルのやつは2時間くらいかかるので反動がとんでもなくキツかったです。二度とやりたくない。

8月

東京にいました。前回は新幹線でしたが今回は飛行機です。チャレンジパッドにLinux移植したりVRChatterとオフしたりしました。ラジオデパートと秋月電子千石電商辺りはあまり迷わなくなりましたね。

何故か電子辞書Linux(Brainux)が日経Linuxに載ってしまいました。自分が関わった活動がここまで大きくなるとは思ってませんでした。

9月

筑波にいました。その前にMaker Faire Tokyoにpcjpnet氏の手伝いで出展側で参加してました。ガチ放電してるテスラコイル見たの初めてだったかもしれないです。横に置いてたMIDI再生用Arduinoがたびたび死んで音鳴らなくなってたの面白かったです。

この時私はスマホテザリングで「広島に秋月電子通商を」というSSIDプロパガンダをしていたのですが、同時に「🍉は電撃で割るに限る」等のSSIDのビーコンを飛ばしていた人がおり、広秋電が気に入ったのかVRChatで会うたびにペンで書いていきます。

あとレインボーブリッジは封鎖できませんでした(それはそう)。

研究室配属されました。第一志望で通ったのでよかったです・・・というよりそもそも志望者が定員割れ状態だったらしいです。

10月

Stable Diffusionで遊んだりしてました。

サーバー機の更新をしました。これでマイクラサーバーを動かしてもOOMされずに済みます。

11月

研究室で廃棄処分になる諸々からいろいろかっぱらってきた結果大量の74HC/ACシリーズとSRAMを手に入れました。

IX2215を落札しました。これでVPNを二本張って4ポートずつで接続できます。

ノートパソコンの底面のプラが微妙に割れて2か所くらいネジ止めがネジ止めの意味をなしていないことに気づきました。院に上がるときに買い替えた方がいいのかもしれないです。

12月

電子辞書Linuxが日経Linuxで連載になってしまいました。そんなことあるんだ。

魔改造したSlimeVRのセンサー部分のケースを作ってました。いい感じにできた気がします。しかし出力値がバグっているのでまともに使用できません。

 

まとめ

今年もいろんなことをしたしいろんなことが起こっていろんな人と出会った1年でした。とりあえず眠い時に車を運転すると本当に終わるということは身をもって体験しました。

2023年の抱負

筑波大学院合格 部屋の片付け VFDClock改の制作(はよラズピコW出ろ)

 

筑波は秋月から遠い? うるせえ!こっちからは片道1万円はかかるんだよ!(?????)

 

ということでこれからも皆さんどうかよろしくお願いします。

- ぺぺっぱーより 愛と感謝を込めて