picoCTF2024 writeup【forensics】

2024/03/30に公開

まえがき

picoCTF 2024(forensics)のwriteupです。
友人とチームを組み、Globalでは103位、JP Studentsとしては5位でした。

PCを触るようになってから約一年、CTFを初めてから約半年という圧倒的初心者ですが、チームメイトが強かったこともありこの順位になることができました。
せっかくなので(forensicsの解けた問題だけ)writeupを書いてみます。

間違いなどありましたらご指摘お願いします。

Scan Surprise


QRコードが与えられます。
試しに読んでみるとflagが出てきました。

Verify


hintにあるコマンドを使ってハッシュがchecksum.txtの中身と同じ値となるファイルを探し、decrypt.shを使うと解けました。

CanYouSee


ukn_reality.jpgが与えられます。
文字列のみ抽出してみると

<cc:attributionURL rdf:resource='cGljb0NURntNRTc0RDQ3QV9ISUREM05fZGVjYTA2ZmJ9Cg=='/>

という文字列が見つかります。
cGljb0NURntNRTc0RDQ3QV9ISUREM05fZGVjYTA2ZmJ9Cg==はbase64っぽく見えたので、encodeしてみるとflagが出てきます。

Secret of the Polyglot


flag2of2-final.pdfが与えられます。
開いてみるとflagの後半部分のみが表示されています。

前半部分を見たいので、とりあえずバイナリエディタで開いてみます。

マジックナンバーがpngのものであることが分かりました。
拡張子を.pngに変えてみるとpngとして開くことができ、flagの前半が見れます。
あわせるとflagとなりました。

Mob psycho


mobpsycho.apkが与えられます。
中身を見ていくとflag.txtといういかにもなファイルが見つかります。
開いてみると

7069636f4354467b6178386d433052553676655f4e5838356c346178386d436c5f35326135653264657d

となっていました。
cyberchefに入れてみるとflagが出てきました。

endianness-v2


challengefileという謎のファイルが与えられます。
バイナリファイルを眺めていると、初めの4バイトがjpegのマジックナンバーを並び替えたものであることに気が付きました。[1]


pythonで修正してみます。

def reverse(file_path):
    with open(file_path, "rb") as file:
        data = file.read()

    converted_data = b''
    for i in range(0, len(data), 4):
        chunk = data[i:i+4]
        converted_chunk = chunk[::-1]
        converted_data += converted_chunk

    output_file_path = file_path + "_rev.jpeg"
    with open(output_file_path, "wb") as output_file:
        output_file.write(converted_data)

    return output_file_path
reverse("challengefile")

challengefile_rev.jpegを開くとflagが見れました。

余談

GeneralSkillsの問題でendiannessというリトルエンディアンとビッグエンディアンについて問う問題がありました。
endiannessの方を先に見ていたらもっと楽に解けた気がします。

Blast from the past


original.jpgが与えられます。
この画像のexifをいじる必要がありそうです。
そして、ncでサーバーにjpgを送ることで判定されるようです。
まずはそのまま画像を送ってみたところ、ModifyDateの値が正しくないといわれました。

バイナリエディタで日付が関係してそうな要素を変更してみます。

この段階での画像を判定してもらいましょう。

00:00:00.703となってしまっているのがいけないようです。
ここで、バイナリエディタで見ていた時に703がいくつか並んでいたのを思い出したので、すべて001にしてみます。

画像を再度送ってみます。

TimeStampの値も変える必要があるようです。
Aperi'Solveというサイトでexifを見ていたところTimeStampについて見つけました。

Image_UTC_Dataとあり、バイナリエディタで探してみます。

最後の方にあり、1700513181420が時間を表してそうだなと思い調べてみました。
どうやらこれはUnixTime(エポック秒)というものらしく、1970年1月1日午前0時0分0秒からの経過秒数を意味するそうです。
なので、この値を1にしてみます。

このjpgを送ってみると、flagが出てきました。

Dear Diary(解けてない)

解けなかったです。
勉強します。

おわりに

自分の理解度が低いのもあり、全体的にふわっとした感じのwriteupになってしまった気がします。
普段はwebを解いてますが、今回のCTFでは難しい問題が解けなかったうえにforensicsよりも理解度が低く、とてもwriteupを書けるような気がしなかったためやめました。
もっと強くなれるよう頑張ります。

脚注
  1. 実はこの時バイナリを見間違えていて、EE FF D8 FFと勘違いしていたためjpegと判断しました。writeupを書いているときに勘違いに気が付きました。調べてみところ、jpeg(jpg)のマジックナンバーは初めの2バイトがFF D8であることで判断できるらしく、結果的にあっていたようです。詳しい方がいましたら教えていただきたいです... ↩︎

Discussion