🙆

picoCTF 2024 Writeup - Forensics

2024/03/31に公開

Scan Surprise - 50 points

zipファイルが提供され、画像からフラグを取得しろというもの。

解凍してhome/ctf-player/drop-in/flag.pngがQRコードになっているので、それを読み取れば良い。

フラグは以下

picoCTF{p33k_@_b00_19eccd10}

Verify - 50 points

zipファイルが提供され、偽物を含むフラグファイル群の中から本物を見つけて復号しろというもの。

zipファイルを解凍すると、home/ctf-player/drop-in/以下は以下のようになっており、filesディレクトリ内には300個ファイルがある

$ ls home/ctf-player/drop-in/
checksum.txt  decrypt.sh    files/

checksum.txtの内容とSHA-256がマッチするものを探す

$ cd home/ctf-player/drop-in/
$ sha256sum files/* | grep $(cat checksum.txt)
55b983afdd9d10718f1db3983459efc5cc3f5a66841e2651041e25dec3efd46a  files/2cdcb2de

decrypt.shで復号する

$ sh decrypt.sh files/2cdcb2de 
picoCTF{trust_but_verify_2cdcb2de}

CanYouSee - 100 points

zipファイルが提供される。

解凍するとjpgファイルになる。exiftoolを実行するとbase64っぽい文字列が入っている

$ exiftool ukn_reality.jpg
...
Attribution URL                 : cGljb0NURntNRTc0RDQ3QV9ISUREM05fNmE5ZjVhYzR9Cg==

base64デコードすると以下のフラグが取得できる。

picoCTF{ME74D47A_HIDD3N_6a9f5ac4}

Secret of the Polyglot - 100 points

pdfファイルが提供される

pdfファイルを開くと以下の文字列が記載されている。

1n_pn9_&_pdf_1f991f77}

fileコマンドで確認するとPNGファイルと認識される。

$ file flag2of2-final.pdf 
flag2of2-final.pdf: PNG image data, 50 x 50, 8-bit/color RGBA, non-interlaced

ので、拡張子を.pngに変更して再度開くと以下の画像が表示される。

これらをくっつけると、フラグは以下になる。

picoCTF{f1u3n7_1n_pn9_&_pdf_1f991f77}

Mob psycho - 200 points

androidのapkファイルが提供される。

apkファイルはzipなので、zipとして解凍してflagっぽいファイルがないか検索する。

$ unzip mobpsycho.apk
$ find mobpsycho -name '*flag*'
mobpsycho/res/color/flag.txt
$ cat mobpsycho/res/color/flag.txt 
7069636f4354467b6178386d433052553676655f4e5838356c346178386d436c5f37343664666133397d

flag.txtをhexとして解釈すると以下のフラグが取得できる

picoCTF{ax8mC0RU6ve_NX85l4ax8mCl_746dfa39}

endianness-v2 - 300 points

ファイルが提供される。

32bitシステムでタイトルがendiannessなのでCyberChefのSwap endiannessを使って、エンディアンを逆にすると以下のjpegファイルに変換できる

フラグは以下

picoCTF{cert!f1Ed_iNd!4n_s0rrY_3nDian_94cc03f3}

Blast from the past - 300 points

画像ファイルのタイムスタンプを「1970:01:01 00:00:00.001+00:00」に設定するという問題。
インスタンスにファイルを送ると、exifのデータをチェックして、タイムスタンプが指定日時になっているかを確認する。全ての属性を変化させることができればフラグを取得できる。

とりあえず-alldatesで設定して送ってみる

$ exiftool -alldates='1970:01:01 00:00:00.001+00:00' original.jpg
$ nc -w 2 mimas.picoctf.net 52478 < original.jpg
$ nc -d mimas.picoctf.net 50055
...
Checking tag 4/7
Looking at Composite: SubSecCreateDate
Looking for '1970:01:01 00:00:00.001'
Found: 1970:01:01 00:00:00.703
Oops! That tag isn't right. Please try again.

こんな感じでどのチェックで失敗したのか教えてくれるので、その属性を直していく。

$ exiftool -subseccreatedate='1970:01:01 00:00:00.001+00:00' original.jpg
$ exiftool -subsecdatetimeoriginal='1970:01:01 00:00:00.001+00:00' original.jpg
$ exiftool -subsecmodifydate='1970:01:01 00:00:00.001+00:00' original.jpg
$ nc -w 2 mimas.picoctf.net 52478 < original.jpg
$ nc -d mimas.picoctf.net 50055
...
Checking tag 7/7
Timezones do not have to match, as long as it's the equivalent time.
Looking at Samsung: TimeStamp
Looking for '1970:01:01 00:00:00.001+00:00'
Found: 2023:11:20 20:46:21.420+00:00
Oops! That tag isn't right. Please try again.

最後にSamsungのTimeStampで失敗する。この値はexiftoolで確認はできるが修正はできないようである。(SamsungのタグのドキュメントでWritableがnoになっている)

$ exiftool -v original.jpg
Samsung trailer (143 bytes at offset 0x2b82ea):
  SamsungTrailer_0x0a01Name = Image_UTC_Data
  TimeStamp = 1700513181420
  SamsungTrailer_0x0aa1Name = MCC_Data
  MCCData = 310
  SamsungTrailer_0x0c61Name = Camera_Capture_Mode_Info
  SamsungTrailer_0x0c61 = 1

SamsungのTimestampを修正するツールや仕様書が見つからなかったため、exiftoolのソースコードを参考にしてバイナリエディタで修正する。

SamsungのTrailerタグは、最後が「SEFT」という文字列になっている。「SEFT」の手前の4バイトがSEFHブロックのサイズ(今回は48バイト)になっており、「SEFT」から、そのサイズだけ前に移動すると「SEFH」という文字列がある。

「SEFH」から8〜11バイト目の部分にTrailerタグの数(今回は3)が記載されている。12バイト目から12バイトごとに各タグの情報になる。この12バイトのうち4〜7バイト目に実際にそのタグ情報が書かれている場所のSEFTブロックからのバックオフセットが、8〜11バイト目にタグ情報のサイズが書かれている。

タグ情報は8バイトのヘッダ、タグ名、値から構成される。8バイトのヘッダの4〜7バイト目はタグ名のバイト数が書かれている。

Timestampのタグ名はImage_UTC_Dataになっており、値はunix timeのミリ秒単位のものがASCII文字列として書かれている。

そのため、

  • タグ情報の値「1700513181420」を「1」に変更(ascii表記)
  • SEFTブロックのImage_UTC_Dataタグのバックオフセットを0x57000000から0x4b000000に変更
  • SEFTブロックのImage_UTC_Dataタグのサイズを0x23000000から0x17000000に変更

の3点を修正する。

$ nc -w 2 mimas.picoctf.net 52478 < original_modified.jpg
$ nc -d mimas.picoctf.net 50055
...
You did it!
picoCTF{71m3_7r4v311ng_p1c7ur3_ed953b57}

Discussion