# picoCTF Forensics write-up 未寫: * Medium * DISKO 2 * Bitlocker-1 * Bitlocker-2 * Blast from the past * Dear Diary * MSB * Torrent Analyze * Redaction gone wrong * tunn3l v1s10n * Pitter, Patter, Platters * shark on wire 2 * What Lies Within * c0rrupt * extensions * m00nwalk * Hard * ALL # Easy ## Corrupted file > hexeditor :::spoiler 解法 這題說有一個損壞的檔案,我們先用`xxd`查看一下檔案內容,可以看到他寫了JFIF,但我們用file顯示檔案類型為data ![image](https://hackmd.io/_uploads/ryV1fwAAgg.png) 上網查一下發現JFIF開頭是`FF D8 FF E0`,用`hexeditor`修改他的開頭之後打開這張圖片就可以看到flag了 ![image](https://hackmd.io/_uploads/H1yWMwRAgg.png) ::: ## Riddle Registry > pdf :::spoiler 解法 這題給了一個pdf檔,打開可以看到有一堆擋住的字,但題敘寫事情並非表面那樣,所以感覺他一點也不重要 上網查有沒有可以分析pdf的linux command 找到可以用pdfinfo 可以看到Author那欄很明顯是編碼過的flag ![image](https://hackmd.io/_uploads/H1k_zb6Cgl.png) 解碼後就是flag了 ::: ## Hidden in plainsight > steghide、base64 :::spoiler 解法 這題給了一個jpg,我先用exiftool來分析他,可以看到Comment那行像是被base64編碼過 ![image](https://hackmd.io/_uploads/SJNXYFqCee.png) 解碼之後得到steghide:cEF6endvcmQ=,再解碼會得到pAzzword,看起來像是密碼 接著我們就可以用得到的密碼使用steghide指令並輸入密碼得到隱藏的flag.txt ![image](https://hackmd.io/_uploads/Hy_rKF5Cge.png) ::: ## Flag in Flame :::spoiler 解法 這題給了一個logs.txt,但他說裡面是一大段編碼文字還說inspect the resulting file 這題是要將base64編碼轉成圖片 找到了一個方法是把它轉成HTML用瀏覽器打開它`<img src= "data:image/jpeg;base64, base64編碼内容">` 好欸然後我們就得到了一個圖片,把下面那串超長的hex轉回去文字就是flag了 ![image](https://hackmd.io/_uploads/HkBRtFqCle.png) ::: ## DISKO 1 > strings :::spoiler 解法 用`strings`跟`grep`就能找到flag ![image](https://hackmd.io/_uploads/rJnS9t90gx.png) ::: ## RED > zsteg、base64 :::spoiler 解法 題目給了一個png,一樣開始用各種工具去嘗試 發現zsteg好像顯示了一些很神奇的東西 ![螢幕擷取畫面 2025-03-19 223847](https://hackmd.io/_uploads/S1Y6Uu-6yl.png) 嘗試把cGljb0NURntyM2RfMXNfdGgzX3VsdDFtNHQzX2N1cjNfZjByXzU0ZG4zNTVffQ==拿去做base64解碼 找到flag了 ![螢幕擷取畫面 2025-03-19 223956](https://hackmd.io/_uploads/r1FTL_Wayl.png) ::: ## Ph4nt0m 1ntrud3r > wireshark、base64 :::spoiler 解法 題目給了一個PCAP檔,用wireshark打開他 發現一堆len不等於8的最後一段結尾都有== ![螢幕擷取畫面 2025-03-26 223355](https://hackmd.io/_uploads/rkMvW5Zp1l.png) 看著就很base64 把其中一個拿去做解碼,出現的是picoCTF 把每個的最後一段拿去做base64解碼 聯想到提示說跟時間有關,把每個依照時間排好,就是flag ::: ## Verify > sha256、grep :::spoiler 解法 連線上去之後先看一下有甚麼檔案 一個用來解密一個是題目有給的Checksum,跟一個一堆檔案的資料夾 一開始有點看不懂先來看看提示 第一個說要找跟checksum一樣的 第二個告訴我怎麼建立檔案的SHA checksum 第三個說要用grep跟 | 先試了`sha256sum files/*`,發現他會噴每個檔案的SHA checksum ![螢幕擷取畫面 2025-03-26 230651](https://hackmd.io/_uploads/Sk-6d5ZpJg.png) 要找到題目到的,就想到可以用`sha256sum files/* | grep "5848768e56185707f76c1d74f34f4e03fb0573ecc1ca7b11238007226654bcda"` 然後就會找到一個檔案是符合的 ![螢幕擷取畫面 2025-03-26 230711](https://hackmd.io/_uploads/S1kA_cZ6Je.png) 題目有跟我們說怎麼解碼了,按照他說的將找到的檔案解碼就得到flag了 ![螢幕擷取畫面 2025-03-26 230851](https://hackmd.io/_uploads/SkygYq-61e.png) ::: ## Scan Surprise > ZBar :::spoiler 解法 題目有給一個SSH跟一個zip檔 先SSH連線上去看看,他會給一個qr code,跟zip檔裡的一樣 可以直接用手機掃,但這樣解CTF就有點無聊了 上網搜尋了一下有沒有工具是可以直接分析qr code的 找到了一個工具叫 ZBar 可以用來讀取qr code的內容 使用方法很簡單 「zbarimg 檔名」 就可以了 ![螢幕擷取畫面 2025-03-13 223452](https://hackmd.io/_uploads/SkWlQOZ6yx.png) ::: ## Secret of the Polyglot :::spoiler 解法 看題目敘述覺得可能跟檔案類型有關 下載檔案之後看到副檔名是pdf,不確定用file指令跑一下,發現他說是png 將副檔名改為png,點開圖片檔案發現她寫著一半的flag ![螢幕擷取畫面 2025-03-14 201648](https://hackmd.io/_uploads/Sk2i4OZT1g.png) 聯想到題目猜測pdf檔是另一半flag 然後就找到了 ![螢幕擷取畫面 2025-03-14 201727](https://hackmd.io/_uploads/S1JT4dWTJe.png) ::: ## CanYouSee > exiftool、base64 :::spoiler 解法 下載圖片之後用exiftool可以看到一串==結尾的字串 猜測為base64,解碼之後就是flag ![螢幕擷取畫面 2025-03-12 210932](https://hackmd.io/_uploads/Sk5jzub6kg.png) ::: ## information > exiftool、base64 :::spoiler 解法 用exiftool 可以發現一串亂碼 ![螢幕擷取畫面 2025-03-14 203559](https://hackmd.io/_uploads/SJCH8_bayg.png) 猜測是base64,解碼之後就獲得flag了 ![螢幕擷取畫面 2025-03-14 203752](https://hackmd.io/_uploads/ryAHIu-61e.png) ::: ## Glory of the Garden > hex editor :::spoiler 解法 這題給了一個jpg,試了一堆工具之後都找不到 想不開直接cat garden.jpg,~~然後就找到了~~ 但這聽起來就不是甚麼正常解法,所以我上網找了一圈 這題要用 hex editor ,我用的是https://hexed.it/ 打開圖片之後會看到一堆看起來像亂碼的東西 用旁邊的搜尋搜picoCTF就能找到flag! ![螢幕擷取畫面 2025-03-26 234958](https://hackmd.io/_uploads/r1EjfjZpJe.png) ::: # Medium ## DISKO 3 > disk :::spoiler 解法 下載檔案後一樣先解壓縮 偷看了一下提示說要找到檔案並提取 用fls看有甚麼檔案,看到一個叫log的目錄 ![image](https://hackmd.io/_uploads/B1sgiY90gg.png) 再看看log裡面有甚麼檔案,發現一個叫flag.gz的檔案 沒意外應該就是他了,用icat把檔案提取出來 解壓縮之後就得到flag了 ![image](https://hackmd.io/_uploads/ByQZiK9Cxe.png) ::: ## flags are stepic > stepic :::spoiler 解法 題目給了一個網頁,進去是一堆國旗 偷看了一下提示,他說要找不是國家的 有個旗子只有英文字的看起來就不是 透過`wget standard-pizzas.picoctf.net/flags…` 把圖片下載下來 用stepic來解碼他! `stepic --decode --image-in=upz.png --out=ans` 然後cat ans.txt就是答案了 ::: ## Event-Viewing :::spoiler 解法 題目給了一個evtx檔,上網查了一下怎麼開這個檔案,發現windows有內建工具可以開 按win+x 選擇事件檢視器(V),選開啟已儲存的紀錄找到題目給的檔案 用搜尋搜安裝,發現其中一個藏有一串亂碼,拿去base64解碼得到第一段 ![image](https://hackmd.io/_uploads/S1d6iK9Cxe.png) 第二個找了很久,最後是上網看別人的才找到><,要找event ID = 4657的,一樣會有一段亂碼要拿去做base64 ![image](https://hackmd.io/_uploads/S1yRoFcRlg.png) 第三個搜shutdown就找的到了 ![image](https://hackmd.io/_uploads/SyvAjF9Cxe.png) 三段解碼過的明文組合起來就是flag了 ::: ## Mob psycho :::spoiler 解法 這題給了一個apk檔,然後提示說你知道怎麼unzip一個apk嗎 所以我就直接unzip這個apk檔案,發現會解出一堆檔案跟資料夾,所以我用grep來看有沒有跟flag相關的檔案 找到一個叫flag.txt的檔案,查看檔案內容發現是一串很像hex的東西,拿去轉成文字就是flag ![image](https://hackmd.io/_uploads/ByLMQNs0ll.png) ::: ## endianness-v2 :::spoiler 解法 這題給了一個檔案 用xxd檢查可以發現他的開頭看起來像是jpg常見開頭的反過來 可以用線上工具還原這個jpg 用 Swap_endianness 檔案類型選擇raw 匯入檔案之後保存output 打開圖片就是flag了 ![image](https://hackmd.io/_uploads/Hya4XNoRgl.png) ::: ## PcapPoisoning > wireshark :::spoiler 解法 這題給了一個封包,裡面充滿各種東西 好幾個裡面都寫一樣的東西 一個一個找太久了用filter來搜尋 frame contains "pico" 找所有封包內容中有出現 "pico" 的 可以找到其中一個裡面就有flag ![image](https://hackmd.io/_uploads/ByPiXViCgl.png) ::: ## hideme :::spoiler 解法 這題給了一個圖片,用binwalk發現他藏了zip檔在裡面,可以看到有一個secret/flag.png的檔案 ![image](https://hackmd.io/_uploads/B1UZVEo0le.png) 加上-e參數把檔案全部提出來 打開那個secret/flag.png,圖片上的就是flag了 ::: ## FindAndOpen > wireshark :::spoiler 解法 這題給了一個加密的zip檔跟一個pcap zip被加密了打不開所以先看看pcap,我先找到兩段文字,分別是「Flying on Ethernet secret: Is this the flag」跟「Could the flag havebeen splitted?」 繼續往下看我看到一個跟其他相比有點不同的封包,把那段文字拿去做base64解碼,得到一半的flag ![image](https://hackmd.io/_uploads/r1ZIEEiReg.png) 用這段flag當密碼拿去解壓縮zip,能成功得到一個叫flag的檔案 裡面是完整flag ::: ## St3g0 > zsteg :::spoiler 解法 用zsteg就能解出來的題目 ![image](https://hackmd.io/_uploads/ByHcVEoRxl.png) ::: ## Sleuthkit Intro > disk :::spoiler 解法 題目給了一個img檔案跟一個nc連線的資訊 先連線上去看他要問什麼,他要問的是Linux部分的長度 ![image](https://hackmd.io/_uploads/HyjpVEjCge.png) 題目已經有告訴我們要用mmls了!用法也很簡單,就是mmls 檔案名稱 ![image](https://hackmd.io/_uploads/SyG6NNo0lx.png) 第三行的length就是答案了,送出答案就會得到flag了 ::: ## Sleuthkit Apprentice > disk :::spoiler 解法 題目給了一個disk檔 下載之後用`gunzip`解壓縮 然後用`mmls`查看分隔區表 ![image](https://hackmd.io/_uploads/SyQvP5D01l.png) 有兩個Linux分隔區 分別用`fsstat -o 2048 disk.flag.img `跟`fsstat -o 360448 disk.flag.img`查看內容 發現第二個`Last mounted on: /`所以應該是要找這個 ![image](https://hackmd.io/_uploads/HkcRDcwA1x.png) 用`fls -o 360448 disk.flag.img`查看目錄 然後`fls -o 360448 disk.flag.img 1995`發現root下有資料夾 `fls -o 360448 disk.flag.img 3981`找到兩個檔案(一個被刪除了) 用`tsk_recover -e -o 360448 disk.flag.img -d 3981 Apprentice/`導出資料夾裡的所有檔案,cat 檔案就能找到flag ::: ## Packets Primer > wireshark :::spoiler 解法 這題給了一個pcap檔案 打開來只有少少幾個封包 翻了一下就在其中一個封包裡面看到flag了 ![image](https://hackmd.io/_uploads/H1i5SNjRle.png) ::: ## Operation Orchid > disk :::spoiler 解法 解壓縮後用`mmls`查看分隔區表 ![image](https://hackmd.io/_uploads/B1BWM-cZlx.png) 一跟三是linux分隔區,分別用`fsstat`查看內容 ![image](https://hackmd.io/_uploads/Bkhk3b9-ge.png)![image](https://hackmd.io/_uploads/S1O-n-cbex.png) 第三個`Last mounted on: /`所以猜是在第三個這個裡面 用`fls -o 411648 disk.flag.img`查看一下目錄![image](https://hackmd.io/_uploads/S1HOnW5bex.png) 查看root目錄,發現加密過的flag檔案 ![image](https://hackmd.io/_uploads/ryxA2Wcblg.png) 用 `strings -t d disk.flag.img | grep flag.txt`尋找金鑰在哪 ![image](https://hackmd.io/_uploads/H1xVaW9bel.png) 找到`openssl aes256 -salt -in flag.txt -out flag.txt.enc -k unbreakablepassword1234567` 用`icat -o 411648 disk.flag.img 1782 > flag.txt.enc`導出檔案,再用密鑰進行解密,然後就可以得到flag ![image](https://hackmd.io/_uploads/rkei6ZcWxe.png) ::: ## Operation Oni > disk :::spoiler 解法 下載之後解壓縮,用mmls查看分隔區 分別用`fsstat -o 2048 disk.img `跟`fsstat -o 206848 disk.img`查看內容 發現第二個`Last mounted on: /`所以應該是要找這個 `fls -o 206848 disk.img`然後通常私鑰預設就會存在`root`底下 進去root看看`fls -o 206848 disk.img 470` ![image](https://hackmd.io/_uploads/BJBC91OCJl.png) 看到一個叫.ssh的目錄,再進去可以看到兩個檔案 ![image](https://hackmd.io/_uploads/SkG7j1uCJg.png) 分別查看兩個檔案內容 ![螢幕擷取畫面 2025-05-20 204954](https://hackmd.io/_uploads/rJHCql5bxx.png) 導出id_ed25519這個檔案`icat -o 206848 disk.img 2345 > ssh1.txt` 然後加權限給他`chmod 600 ssh1.txt` 用這個檔案進行ssh連線後`cat flag.txt`就找到flag了 ![image](https://hackmd.io/_uploads/Bkc9jyuRJg.png) ::: ## Lookey here :::spoiler 解法 題目給了一個txt,題述寫隱藏在大量資料中 想到可以用grep來搜尋 已知flag的格式是picoCTF,所以搜pico就找的到了! ![image](https://hackmd.io/_uploads/Sy0JINi0xl.png) ::: ## File types :::spoiler 解法 這題一開始給了一個pdf說打不開,那就一定不是pdf了 用file看了一下,上網查把副檔名改成了shar 然後運行(記得載相關套件),會再獲得一個flag,是ar檔再解壓縮 然後是cpio,然後是bzip2,然後是gzip,然後是lzip,然後是 LZ4,然後是LZMA,然後是LZOP,然後是lzip,然後是 XZ 最後終於拿到了一串hex,解碼就是flag了 ![image](https://hackmd.io/_uploads/H1rIUVjRgl.png) ::: ## Enhance! :::spoiler 解法 題目給了一個svg檔案 cat 檔案看看內容,發現好像看到一些看起來是flag的東西 把`<tspan>`裡的文字組起來,就獲得flag了 ![image](https://hackmd.io/_uploads/rJWmPVj0gg.png) ::: ## Eavesdrop > wireshark :::spoiler 解法 這題給了一個pcap,打開之後是一些tcp封包 先用follow tcp stream 在 stream 0 可以看到一段對話,告訴我們解密方法跟去哪找密文但其實我發現繼續翻tcp stream就可以看到了根本不用搜port 找到之後要先將他翻成hex格式,不能用ascii格式 然後要存成binary格式 `echo "53616c7465645f5f3c4b26e8b8f91e2c4af8031cfaf5f8f16fd40c25d40314e6497b39375808aba186f48da42eefa895" | xxd -r -p > file.des3` 然後用題目給的解密方法 `openssl des3 -d -salt -in file.des3 -out file.txt -k supersecretpassword123` 打開解密出來的檔案就是flag了 ![image](https://hackmd.io/_uploads/H1ZydVjRge.png) ::: ## WPA-ing Out > aircrack-ng :::spoiler 解法 這題題目給了個pcap封包,要我們用rockyou.txt來暴力破解密碼,有點沒頭緒所以開了提示看看 提示二寫到`Aircrack-ng can make a pcap file catch big air...and crack a password` 查一下Aircrack-ng的用法,找到可以用`aircrack-ng -w /usr/share/wordlists/rockyou.txt -b <目標BSSID> wpa-ing_out.pcap`所以我們要先尋找到目標BSSID,用`aircrack-ng wpa-ing_out.pcap`這個指令,他會列出所有封包中偵測到的 AP BSSID是 AP 的 MAC 位址,所以目標BSSID就是`00:5F:67:4F:6A:1A` ![image](https://hackmd.io/_uploads/r1KKONiRgx.png) 把找到的BSSID代回去上面的指令就能找到密碼了 ![image](https://hackmd.io/_uploads/BJVqO4j0gx.png) ::: ## advanced-potion-making :::spoiler 解法 這題給了一個檔案,但看不出來他是甚麼檔案 用xxd分析一下看到第一行,有點像png的開頭但不太一樣 用hexeditor修改他的開頭,改成跟png開頭一樣 會得到一個全紅色的圖片 用stegsolve分析一下,成功找到flag ![image](https://hackmd.io/_uploads/ry0c9ViAxe.png) ::: ## Milkslap :::spoiler 解法 這題按下牛奶之後會是一個網頁,有一個動圖 用F12找到這張圖並下載 ![image](https://hackmd.io/_uploads/B1IpcNjCxx.png) 直接用zsteg解會顯示stack level too deep 所以我請GPT寫了一個python程式將原本那張照片切成好幾張 ![image](https://hackmd.io/_uploads/rJP094sRgl.png) 然後用zsteg分析每一張圖搜出有CTF的,就能找到flag了 ::: ## Disk, disk, sleuth! II > disk :::spoiler 解法 這題一樣解壓縮後用 `mmls dds2-alpine.flag.img`確認分隔區 我們現在知道要找的檔案的名字,所以可以直接讓他列出全部的檔案再搜尋 `fls -o 2048 -r dds2-alpine.flag.img| grep "down-at-the-bottom"` ![image](https://hackmd.io/_uploads/SyWy65DC1g.png) 找到之後用`icat -o 2048 dds2-alpine.flag.img 18291 > dds2.txt`提取檔案 `cat dds2.txt`會出現![image](https://hackmd.io/_uploads/H1XLQp9vCye.png) 組合起來就是flag ::: ## MacroHard WeakEdge :::spoiler 解法 這題給了一個pptm檔案 pptm本質上是個壓縮檔案,所以可以先進行解壓縮 `cp Forensics\ is\ fun.pptm ppt.zip` `unzip ppt.zip -d ppt_unzip` 他會解出非常多東西 值得注意的是vbaProject.bin跟hidden 先看vbaProject.bin 用 olevba 或string都會看到 sorry_but_this_isn't_it ![image](https://hackmd.io/_uploads/SkbqxioCex.png) 所以看起來不是這個檔案 再看另一個,看起來是一串加密過的東西 拿去做base64解碼 成功獲得flag ![image](https://hackmd.io/_uploads/BkUtxosCxx.png) ::: ## Matryoshka doll > binwalk :::spoiler 解法 這題題述說是俄羅斯娃娃,可以用 binwalk 來查看有沒有隱藏的檔案 發現藏有zip檔,加上 -e 提取出檔案 ![image](https://hackmd.io/_uploads/HJ1pxii0gg.png) 他會建立一個資料夾,裡面有一個資料夾(base_images)跟一個zip檔 zip跟資料夾內的圖片是同一張 隨便拿一個來再做一次 binwalk -e 圖片.jpg 重複動作直到獲得flag.txt ![image](https://hackmd.io/_uploads/rydaxjoAxg.png) ::: ## Wireshark doo dooo do doo... > wireshark :::spoiler 解法 題目給了一個pcapng檔,用wireshark打開他 打開會看到一堆TCP其中夾雜一點HTTP 在其中一個TCP封包上選擇follow -> TCP stream 然後不斷調整stream的數字,最後在第五個找到很像flag的東西 看起來就是凱撒密碼,拿去做解密就是flag! ::: ## Disk, disk, sleuth! > disk :::spoiler 解法 這題說要用srch_strings,上網查發現它可以印出可視字串 直接使用會噴出一堆東西,所以要搭配grep進行搜尋 `srch_strings dds1-alpine.flag.img | grep "CTF"`然後就找到flag了 ::: ## Wireshark twoo twooo two twoo... > wireshark :::spoiler 解法 這題一樣是給了一個pcapng檔 打開來之後我先照著上一題那樣選follow -> TCP stream 翻了一下找到一個picoCTF的字串,繼續往後翻,又翻到一堆picoCTF開頭字串 觀察這幾個有甚麼共通點,發現他的Host都是18.217.1.57 用過濾器過濾出每個Host:18.217.1.57,用`ip.src ==18.217.1.57` 發現一堆HTTP跟DNS中夾雜著一些DNS,觀察一下發現看起來像base64的東西 再把dns也過濾出來` ip.src ==18.217.1.57 && dns` 把每個.reddshrimpandherring.com.windomain.local前的字串提取出來拿去做base64解碼,就是flag了 ! ::: ## Trivial Flag Transfer Protocol > wireshark :::spoiler 解法 這題給了一個封包,打開來是一堆TFTP的流量,題述寫弄清楚他們如何移動flag,感覺就有檔案,所以去Export Object -> TFTP 果然有檔案,全部匯出之後先看txt ![image](https://hackmd.io/_uploads/r1uvWji0gl.png) 打開是一串看起來加密過的文字,拿去做ROT-13解密,翻譯成中文意思是「TFTP 不會加密我們的流量,所以我們必須偽裝我們的標誌傳輸。想辦法隱藏旗幟,我會回來查看計劃」 有一個檔案叫plan,一樣是一串加密過的文字,拿去做ROT-13解密,翻譯成中文意思是「我使用了該程式並盡職盡責地將其隱藏起來。查看照片」 他說他用了程式將他藏起來,所以我們載看看程式,可以發現它其實是steghide 所以我們就用steghide來分析我們的圖片,密碼是在plan中有提到的「DUEDILIGENCE」 我們可以從第三張照片中找到flag.txt這個檔案,打開這個檔案就是flag了 ![image](https://hackmd.io/_uploads/S1CKWooCex.png) ::: ## like1000 :::spoiler 解法 題目給了一個tar檔案,檔名是1000 解了一次之後發現裡面是999,推測應該有1000層 手動解可能會解到死,寫個腳本讓他跑 ![image](https://hackmd.io/_uploads/rkKXfjjAxl.png) 跑完之後會獲得一個png,打開就是flag了 ~ ::: ## WhitePages :::spoiler 解法 這題給了一個檔案,打開後看起來全是空白的。用xxd分析一下之後發現這個檔案裡面只有兩種空格,一種是Unicode 的 EM SPACE,一種是 ASCII 的 空白字元 `''` ![image](https://hackmd.io/_uploads/Hku1QojAlx.png) 將這兩種空格分別對應0 跟 1轉換成二進位,再將他轉回ASCII字元。就能獲得flag了 ::: ## shark on wire 1 > wireshark :::spoiler 解法 打開後觀察一下,他跟之前寫的有點不一樣,他比較多的是ARP跟UDP 一樣follow TCP stream試試看,發現啥都沒有 換選擇follow UDP stream,不斷往後按就找到flag了 ::: ## So Meta > exiftool :::spoiler 解法 題目給了一個png 用exiftool就能找到flag了 ![image](https://hackmd.io/_uploads/B1O_XojRxe.png) :::