スプーキーズのちょっとTech。

SPOOKIES社内のより技工的な、専門的なブログページです。

Full Weak Engineer CTF 2025参加しました!

こんにちは!Spookiesに入ってもう少しで3ヶ月、こまさんです!!
CTFは、入社する3年ぐらい前に一度参加してからずっとノータッチだったんですが、SpookiesにCTF部がある!という事で最近はボチボチ頑張ってます💪

という事で、今回はSpookiesのCTFチームspookiesFull Weak Engineer CTF 2025に参加してきました!

まずは結果から!

今回は一緒に参加してた方がめちゃくちゃ頑張ってくれて17位でした! 結構すごいのでは?!

私が解いた問題は4問だけですが、ちょっとその中から面白かったのをピックアップして話していきたいと思います!

まずはみんなの活躍を紹介~

  • Nemoola
    • Poison Apple (100pts./444solves/Misc)
    • AED (127pts./232solves/Web)
    • regex-auth (100pts./450solves/Web)
  • Huzuni
    • Welcome (100pts./522solves/Welcome)
    • strings jacking (100pts./447solves/Rev)
    • I_HATE_DEBUGGING (395pts./25solves/Rev)
    • Mystery Zone (227pts./97solves/Rev)
    • No need Logical Thinking (132pts./219solves/Rev)
    • NativeKotlian (497pts./2solves/Rev)
    • Pwn Me Baby (153pts./178solves/Pwn)
    • Flagcraft (277pts./67solves/Misc)
    • GeoGuessr1 (100pts./404solves/OSINT)
    • GeoGuessr2 (100pts./320solves/OSINT)
    • GeoGuessr3 (100pts./318solves/OSINT)
    • datamosh (106pts./294solves/OSINT)
    • RSA Phone Tree (124pts./240solves/OSINT)
    • GeoGuessr4 (133pts./217solves/OSINT)
    • QR (211pts./110solves/OSINT)
    • Osaka Expo Pavilion Quiz! (256pts./78solves/OSINT)
    • EXIT (147pts./189solves/OSINT)
    • MYAKUMYAKU TOWER (260pts./76solves/OSINT)
    • git predator (277pts./67solves/OSINT)
  • Komasan_ (私じゃ!)
    • baby-crypto (100pts./563solves/Crypto)
    • base🚀 (101pts./316solves/Crypto)
    • unixor (324pts./47solves/Crypto)
    • A (459pts./10solves/Rev)
  • mattyatea
    • Adversarial Login (230pts./95solves/Misc)

こうやって見るとそこまで活躍はできなかったですね、、😅 まぁ反省会は置いといて、、、

この中の「A」という問題がなかなかインパクトあって、面白かったので紹介してみますね!

まずは見てみよう

まぁまず添付ファイルが「main.py」と、、Pythonですね!(Python大好き人間なので嬉しい!!) とりあえずダウンロードしてコードを見てみましょう。

もういかつい

うひゃ~~、なんかとんでもないコードが出てきてしまいましたね。。(画像かなりちっちゃくて見づらいかも、、😨)

という事で、パッと見た感じ、Pythonの特殊メソッドを使って、演算子オーバーロードがたくさんされているみたいですね。。 で、とりあえず実行してみたのですが、流石にどこか弄られていて動きませんでした。(動いたらまだデバッガとにらめっこしてもよかったのですが、、)

じゃあ気合で難読化を解除していきます。

気合で解読

まず、最初はclassが2つ定義されていて、片方はメタクラスA、もう片方はAを継承したクラスA、という構造になっていますね。

演算子オーバーロードだらけ

まずできそうなことは、base64でエンコードされた文字列がたくさんあるので、ここをデコードしてみましょうか。

なんか作者からのメッセージがある。。(確かにSHA-256はだるいなぁ)

なんか、メソッド名とかクラス名とか色々ありますね。。ここから取ってきてメソッドとか実行しそうな感じ。

ここからは、まずクラスAの中身をほぐしていきます。。もう気合しかありませんね。

⌛⌛⌛作業中⌛⌛⌛

とまぁ、そんな感じで、各メソッドを気合で解きほぐしたらこんな感じになりました。

3分クッキングを彷彿とさせる差し替え術

どうやら、簡易的なスタックマシンが作られているみたいですね。 (なおスタックにはリストとかのオブジェクトも突っ込める現代仕様)

このスタックマシン的構造でコードを実行するようだ。。

そんで本題の下のコードの処理も展開していくと、、、

ダイエット大成功

めっちゃシンプルになりましたね!!!(苦笑)

本当に初動のコードが嘘みたい。

それでコードを読むと、、

「要はflagを入力して、その文字列の文字毎のコードの総和をシードとして、ランダム値を生成してそれと入力をxorしたものがコード中にあるlistに合致すれば正しいフラグだよ」

という感じですね。

あと49文字だという事も分かるので、seedの取りうる範囲での総当たりで解読できそうですね。

ここまでくれば、もうちゃちゃっと行けるかな(この問題の本題はRevであってCryptoじゃないのでね)

あー楽しかった🚩

Javaに演算子オーバーロード、、、、、だめです!!!!もっと難化しちゃう。

感想

今回はちょっとインパクトがあったRev問を一つWriteup的に書いてみました。 (といっても実質的に作業が地味すぎるからほぼ差し替えですが。。)

楽しかった!!この調子で、すこしずつCTF部も盛り上げていきたい!!

あとPwn問を練習したいなぁと思っていたり。。 日々精進ですね。頑張ります。