PicoCTF2024 Writeup：Forensics

PicoCTF 2024のForensicsの問題のWriteupです！

# Easy

まずは難易度がEasyのものから！

## Secret of the Polyglot

拡張子はPDFなので、開いてみるとFlagの最後の方と思われる文字列があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/6b36a970-161a-82d4-edef-57c56b0f5f3a.png)

fileコマンドでファイル形式を調べてみると、PNGファイルのよう。。。
```bash
└─$ file flag2of2-final.pdf 
flag2of2-final.pdf: PNG image data, 50 x 50, 8-bit/color RGBA, non-interlaced
```

拡張子をPNGにして開いてみると、Flagの前半のような文字列があるので、これをPDFの文字列とマージすれば答えになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/d9ce18eb-908f-f9cb-f25b-30ca7e916bae.png)




なんで、二つの拡張子で開けたんだろう？と思ったのですが、PNGファイルにbinwalkしてみると、PNGのあとにPDFが埋め込まれていました。。。
だから、FileではPNGとでたけど、PDFファイルとしても開けたのか
```
$ binwalk flag2of2-final.png -e

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             PNG image, 50 x 50, 8-bit/color RGBA, non-interlaced
914           0x392           PDF document, version: "1.4"
1149          0x47D           Zlib compressed data, default compression
```


## CanYouSee

>How about some hide and seek?
Download this file here.

問題文からして、Stegseekだろうと思って、やってみる

```bash
$ stegseek ukn_reality.jpg                
StegSeek 0.6 - https://github.com/RickdeJager/StegSeek

[i] Found passphrase: ""
[i] Original filename: "flag".
[i] Extracting to "ukn_reality.jpg.out".
```

なんかあからさまな出力ファイルを見てみる
```bash
The flag is not here maybe think in simpler terms. Data that explains data.
```
【訳】旗はここにはない......もっと単純に考えてほしい。 データを説明するデータ。

データを説明するデータということはプロパティのことだと思って、exiftoolで調べてみると、Attribution URLにBASE64と思われる文字列が。。。！
```bash
$ exiftool ukn_reality.jpg   
ExifTool Version Number         : 12.76
File Name                       : ukn_reality.jpg
Directory                       : .
File Size                       : 2.3 MB
File Modification Date/Time     : 2024:12:07 21:04:49+09:00
File Access Date/Time           : 2024:12:07 21:05:39+09:00
File Inode Change Date/Time     : 2024:12:07 21:04:49+09:00
File Permissions                : -rwxrwx---
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : inches
X Resolution                    : 72
Y Resolution                    : 72
XMP Toolkit                     : Image::ExifTool 11.88
Attribution URL                 : cGljb0NURntNRTc0RDQ3QV9ISUREM05fZGVjYTA2ZmJ9Cg==
Image Width                     : 4308
Image Height                    : 2875
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 4308x2875
Megapixels                      : 12.4
                                               
```

これをもとにもどせばFlagが手に入ります！


# Medium

## Blast from the past

問題文は以下↓
> The judge for these pictures is a real fan of antiques. Can you age this photo to the specifications?
Set the timestamps on this picture to 1970:01:01 00:00:00.001+00:00 with as much precision as possible for each timestamp. In this example, +00:00 is a timezone adjustment. Any timezone is acceptable as long as the time is equivalent. As an example, this timestamp is acceptable as well: 1969:12:31 19:00:00.001-05:00. For timestamps without a timezone adjustment, put them in GMT time (+00:00). The checker program provides the timestamp needed for each.
Use this picture.
Additional details will be available after launching your challenge instance.


これは初めて見る問題だったので、以下のWriteupをみました
https://zenn.dev/tetsurou/articles/fb42527a57d3e6

exiftoolをつかって値の書き換えをしていくみたい！


```bash
$ exiftool -alldates='1970:01:01 00:00:00.001+00:00' original_change-timestamp.jpg 
    1 image files updated
```


```bash
┌──(kali㉿kali)-[/share_host/pico_CTF/Medium/Blast from the past]
└─$ nc -w 2 mimas.picoctf.net 61015 < original_change-timestamp.jpg
                                                                                                     
┌──(kali㉿kali)-[/share_host/pico_CTF/Medium/Blast from the past]
└─$ nc mimas.picoctf.net 57273
MD5 of your picture:
e7537a20fd614f08232eaa16d4f6587a  test.out

Checking tag 1/7
Looking at IFD0: ModifyDate
Looking for '1970:01:01 00:00:00'
Found: 1970:01:01 00:00:00
Great job, you got that one!

Checking tag 2/7
Looking at ExifIFD: DateTimeOriginal
Looking for '1970:01:01 00:00:00'
Found: 1970:01:01 00:00:00
Great job, you got that one!

Checking tag 3/7
Looking at ExifIFD: CreateDate
Looking for '1970:01:01 00:00:00'
Found: 1970:01:01 00:00:00
Great job, you got that one!

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のどのタイムスタンプが変更されていないか教えてくれます


以下の記事に同様の内容の質問があがっていたので、試してみます
https://stackoverflow.com/questions/78185037/how-to-edit-the-samsung-trailer-tag-timestamp
（質問の時期がpicoCTFとかぶっていますね、、）

` exiftool -time:all -v3 original_change-timestamp.jpg`の実行結果で`Image_UTC_Data `と関係がありそうなのは以下ですね
```
  SamsungTrailer_0x0a01Name = Image_UTC_Data
  - Tag '0x0a01-name' (14 bytes):
    2b82f2: 49 6d 61 67 65 5f 55 54 43 5f 44 61 74 61       [Image_UTC_Data]
  TimeStamp = 1700513181420
  - Tag '0x0a01' (13 bytes):
    2b8300: 31 37 30 30 35 31 33 31 38 31 34 32 30          [1700513181420]
```


上記のstackoverflowのやり方にそって、`xxd`コマンドでJPEGファイルを１６進数でダンプして、`2b82f2`のところを探します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/8bb5661a-dbed-399c-73f5-0137412f13d9.png)

`002b8300`のところが2023年のUNIX時間になっているので、問題で与えられているUnix時間の1（＝1970:01:01 00:00:00.001+00:00）にして、バイト文字もそれに合わせて修正します!


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/a61f3a19-a0bf-ef6f-45b8-57b9723ee989.png)


あとは、xxdコマンドで再度JPEGに戻せば、Flagが手に入ります！！


## Mob psycho

問題文は以下のみ。。
> Can you handle APKs?

APKファイルはZipファイルなので、拡張子を`.zip`にして解凍してみる

ファイル数が多いので、怪しそうなファイル名が無いか確認してみると、flag.txtがありました！
```bash                                      
┌──(kali㉿kali)-[/share_host/pico_CTF/Medium/Mob psycho/mobpsycho]
└─$ find . -name '*picoCTF*' 
                                                                                                     
┌──(kali㉿kali)-[/share_host/pico_CTF/Medium/Mob psycho/mobpsycho]
└─$ find . -name '*flag*'   
./res/color/flag.txt
```    

中身を見てみると、なんとも言えない文字列が、、
```bash                                           
┌──(kali㉿kali)-[/share_host/pico_CTF/Medium/Mob psycho/mobpsycho]
└─$ cat ./res/color/flag.txt       

7069636f4354467b6178386d433052553676655f4e5838356c346178386d436c5f37343664666133397d                  
```

Dencodeで復号してみると16進数表記でpicoCTFのフラグが手に入りました！


## endianness-v2

問題文は以下です
> Here's a file that was recovered from a 32-bits system that organized the bytes a weird way. We're not even sure what type of file it is.

以下の日本語訳から、与えられたファイルはシステムから復元されたファイルの様子
>これは、32ビットのシステムから復元されたファイルで、バイトが奇妙な方法で整理されている。 どのようなタイプのファイルなのかもわからない。


エンディアンは以下のサイトでざっくり概要をつかみました
https://wa3.i-3-i.info/word11426.html


一連のデータを格納する方式を定めていて、大きく2つにわけれています
- リトルエンディアン：前に位置するデータから格納する
- ビッグエンディアン：後ろに位置するデータから格納する


fileコマンドで調べようと思いましたが、`data`と出力されたので、バイナリファイルということですね
```bash
$ file  '/share_host/pico_CTF/Medium/endianness-v2/challengefile' 
/share_host/pico_CTF/Medium/endianness-v2/challengefile: data
```

`strings`で可読性のある文字列を抽出しましたが、意味のある単語はなかったです。。。
```bash
$ strings '/share_host/pico_CTF/Medium/endianness-v2/challengefile'     
 '.$
#,")7(
410,'
4428=943.<
!2222222222222222222222222222222222222222222222222
)('&654*:987FEDCJIHGVUTSZYXWfedcjihgvutszyxw
5*)(9876EDC:IHGFUTSJYXWVedcZihgfutsjyxwv
dhiX&
V       ^8
_D      w6|
Ie^8
9{[f
|UeVfr'O
]vIpTw
p4*KQ
Lo,Y
dk~a
t!'6
xrEg
JrDpH
v${4yavE<
[Jp4
__mW
'O"e
K^l/
,lnv
Cgew
=fI~<
(4m)k
EWUc
<a}{q{i
,OW,
```

16進数ファイルにしてみてみましたが、いくつか特徴的な文字列がありました。書き換えが起きているかもしれない？

① `2`が連続している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/0e411f15-98a0-8b86-a677-41d0a6f8a8cf.png)

② `(`が等間隔に出現。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/61f59007-4158-bec1-0160-3a7afa2a46b9.png)

③ ファイルの最後に`EQ`が等間隔に出現。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/1e96b6bb-8597-265b-9091-3fea0148f000.png)


exiftoolで見てみると、JPEGという記載もありますね
```bash
─$ exiftool '/home/kali/Desktop/share_host/pico_CTF/Medium/endianness-v2/challengefile'
ExifTool Version Number         : 12.76
File Name                       : challengefile
Directory                       : /home/kali/Desktop/share_host/pico_CTF/Medium/endianness-v2
File Size                       : 3.4 kB
File Modification Date/Time     : 2024:12:08 17:09:49+09:00
File Access Date/Time           : 2024:12:08 21:07:12+09:00
File Inode Change Date/Time     : 2024:12:08 17:10:02+09:00
File Permissions                : -rwxrwx---
Warning                         : Processing JPEG-like data after unknown 1-byte header
```

ここからわからなくなったので、以下のWriteupを参考にしました
https://qiita.com/TTsuki/items/654d7928b8e4edb16ace

以下の流れをCyber Chefで行うみたいです
1. エンディアンはバイト単位で考えるので、16進数文字列に変換する
1. エンディアンを入れ替える（32ビットシステムは4文字を1塊と考える）
1. 画像に変換

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/20c2418a-abfd-9dd3-479d-4ecd45d5dedf.png)

Cyber Chefはこれまで使ったことはなかったですが、便利ですね！


## Dear Diary

Autopsyで読み込ませることはできるが、そこからわからず、以下のWriteupを見ました

https://daisuke20240310.hatenablog.com/entry/picoctf2024fo#Dear-Diary400%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88

https://medium.com/@niceselol/picoctf-2024-dear-diary-f7eafbc389ea

正直、分断されたFlagを見つけるのは至難の業。。。
（というより、多分気が付かない。。。）


# 最後に

今回学んだことは以下4つです
- exiftoolは値の書き換えもできる
- xxdコマンドで16進数にすることで、内容の書き換えが容易
- データ加工においてCyber Chefは便利
- 無理な問題は無理。笑（最後の問題。。。）