All-in-One PicoCTF Writeups: Forensics

前言

其實好像也沒什麼好講前言的,但就是不想要一開始就是題目分類,所以還是放了個前言 XD。

自己在刷 PicoCTF 的時候常常發現,幾乎所有的 writeup 都是英文的居多,所以想說來寫個完整一點的中文版!總之呢這裡就是會盡量彙整所有的 picoCTF 的題目在這邊(但是因為已經寫了 60 題左右才開始打算來寫 writeup,所以可能前面的部分會等其他都寫完再來補),如果有需要就可以直接來這邊看所有的 writeup,就這樣啦!希望能幫忙到你。

MSB

看這個題目名稱,然後又出現在 Forensics,應該是跟隱寫術有關了。如果你還不知道 LSB 和 MSB 都是個啥,可以先去看看 Cryptography Notes 密碼學任督二脈,裡面有解釋了甚麼是 LSB 和 MSB。

題目的題幹說,This image passes LSB statistical analysis。那相反的,它其實就是在暗示 flag 可能藏在 RGB 像素值的 MSB 中,所以就來提取它每個像素中的的 MSB 吧。這邊用到了 Python 中的 Pillow 這個庫,如果覺得太麻煩,也可以直接用這個現成的工具 Stegsolve

Exploit 如下:

from PIL import Image
import re


def extract_msb(image_path):
    image = Image.open(image_path)
    pixels = image.load()

    # 獲取圖片尺寸
    width, height = image.size

    # 初始化儲存提取自MSB的字串
    msb_data = ""

    # 提取每個像素的MSB
    for y in range(height):
        for x in range(width):
            r, g, b = pixels[x, y]
            # AND運算只保留了r, g, b的最高位,後面清零,再右移7位
            msb_data += str((r & 0b10000000) >> 7)
            msb_data += str((g & 0b10000000) >> 7)
            msb_data += str((b & 0b10000000) >> 7)

    # 將提取的MSB每8個位元轉換成字元
    hidden_text = ""
    for i in range(0, len(msb_data), 8):
        byte = msb_data[i : i + 8]
        if len(byte) == 8:
            hidden_text += chr(int(byte, 2))

    return hidden_text


def find_pico_ctf(data):
    pattern = r"picoCTF\{.*?\}"
    matches = re.findall(pattern, data)

    if matches:
        for match in matches:
            print(f"Found: {match}")
    else:
        print("No matches found")


if __name__ == "__main__":
    image_path = (
        "MSB/Ninja-and-Prince-Genji-Ukiyoe-Utagawa-Kunisada.flag.png"  # 替換為你的路徑
    )
    hidden_message = extract_msb(image_path)
    find_pico_ctf(hidden_message)
picoCTF{15_y0ur_que57_qu1x071c_0r_h3r01c_ea7deb4c}

Verify

先連接到題目給的主機。

Connect to the host

之後用 ls看一下有甚麼文件。

ctf-player@pico-chall$ ls
checksum.txt  decrypt.sh  files

其中題目有說 decrypt.sh是用來解密檔案的腳本,checksum.txt是紀錄了正確的 hash 值得文件,最後 files 是一個目錄,裡面有很多文件,但只有一個是可以用來被解密的正確腳本。所以我們要做的就是去比對每個文件的哈希值和 checksum.txt的值。我們利用下面這兩個命令,先 cat出正確的雜湊值,再去用 sha256sum去計算每個 files裡面的檔案的雜湊,最後比對。

ctf-player@pico-chall$ cat checksum.txt
5848768e56185707f76c1d74f34f4e03fb0573ecc1ca7b11238007226654bcda
ctf-player@pico-chall$ sha256sum files/* | grep 5848768e56185707f76c1d74f34f4e03fb0573ecc1ca7b11238007226654bcda
5848768e56185707f76c1d74f34f4e03fb0573ecc1ca7b11238007226654bcda  files/8eee7195

最後一行顯示正確的文件是 8eee7195,那就用 ./decrypt.sh解密他。就得到 Flag 啦。

picoCTF{trust_but_verify_8eee7195}

CanYouSee

這題的 Handout 解壓縮之後是一張圖片,我一開始嘗試了 steghide 去提取隱寫資訊,但是提取出來後的東西是下面這個。

The flag is not here maybe think in simpler terms. Data that explains data.

Data that explains data. 這就告訴我們要找他的 Metadata 啦。這邊使用下面這個命令。

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:03:11 20:05:53-04:00
File Access Date/Time           : 2024:09:01 13:25:54-04:00
File Inode Change Date/Time     : 2024:09:01 13:25:46-04:00
File Permissions                : -rw-r--r--
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                 : cGljb0NURntNRTc0RDQ3QV9ISUREM05fYjMyMDQwYjh9Cg==
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

Attribution URL 看起來很可疑,拿去 base64 解碼一下。

base64 -d <<< cGljb0NURntNRTc0RDQ3QV9ISUREM05fYjMyMDQwYjh9Cg==

果然,得到 Flag 啦。

picoCTF{ME74D47A_HIDD3N_b32040b8}

Secret of the Polyglot

這題給了個 PDF 檔案,打開後發現了一半的 Flag。

一半的 Flag

1n_pn9_&_pdf_1f991f77}

之後用file flag2of2-final.pdf這個命令檢查一下這個檔案。發現他其實是一個 PNG 檔案。所以我們用mv flag2of2-final.pdf flag2of2-final.png把檔名改掉後打開這張圖片。

另一半的 Flag

picoCTF{f1u3n7_

最後把兩個組合起來就好了。

picoCTF{f1u3n7_1n_pn9_&_pdf_1f991f77}

Scan Surprise

先用 SSH 連接到題目。

ssh -p 51523 [email protected]

然後發現他給了一張 QR Code 的圖片叫做 Flag.png。但因為我手邊沒有手機,用zbarimg把其中的資訊提取出來。

zbarimg flag.png

他輸出的東西像這樣:

Connection Error (Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory)
Connection Null
QR-Code:picoCTF{p33k_@_b00_b5ce2572}
scanned 1 barcode symbols from 1 images in 0 seconds

果然 Flag 就出來了!

picoCTF{p33k_@_b00_b5ce2572}