###### tags: `BambooFox` `Reverse` # [CTF][Reverse][BambooFox] Ransomware 題目檔案連結:[Download](https://drive.google.com/file/d/1pRpqeBqNab6FBiQ9zzrVvw55pS-qqj6j/view?usp=sharing) 0x01 === 題目下載後有三個檔案,如下圖 ![](https://i.imgur.com/ZMRzyFD.png) flag.png ![](https://i.imgur.com/g5PJdrg.png) 剩下兩個檔案其中一個task.pyc看起來就是我們要逆向回去的檔案了 在這裡反編譯使用uncompyle6指令,沒有的人可以使用pip安裝 ```linux= > sudo apt install python3-pip > python3 -m pip install uncompyle6 ``` ```linux= > uncompyle6 task.pyc # uncompyle6 version 3.7.4 # Python bytecode 3.8 (3413) # Decompiled from: Python 2.7.18 (default, Apr 20 2020, 20:30:41) # [GCC 9.3.0] # Warning: this version of Python has problems handling the Python 3 "byte" type in constants properly. # Embedded file name: task.py # Compiled at: 2021-01-14 22:13:24 # Size of source mod 2**32: 420 bytes (lambda data, key, iv: if len(data) != 0: (lambda key, iv, data, AES: open('flag.enc', 'wb').write(AES.new(key, AES.MODE_CBC, iv).encrypt(lambda x: x + '\x00' * (16 - len(x) % 16)(data))))(data[key:key + 16], data[iv:iv + 16], open('flag.png', 'rb').read(), __import__('Crypto.Cipher.AES').Cipher.AES) # Avoid dead code: lambda fn: __import__('os').remove(fn)('task.py'))(__import__('requests').get('https://ctf.bamboofox.tw/rules').text.encode(), 99, 153) # okay decompiling task.pyc ``` 可以看到12、13行是task.py的程式碼,只要讀懂這兩行就可以開始working了! 在這我稍微把程式碼翻譯成另一種寫法,可以參考: ```python= import requests from Crypto.Cipher import AES def padding(data): return data + b'\x00' * (16 - len(data) % 16) def inder(key, iv, data, AES): key = data[key:key + 16] iv = data[iv:iv + 16] data = open('flag.png','rb').read() open('flag.enc', 'wb').write(AES.new(key, AES.MODE_CBC, iv).encrypt(padding(data))) def outer(data, key, iv): if len(data) != 0 : inder(key, iv, data, AES) if __name__ == "__main__": data = requests.get('https://ctf.bamboofox.tw/rules').text.encode() key = 99 iv = 153 outer(data,key,iv) ``` 現在只需要把AES加密改成解密就完成第一步了。 那要如何解密呢?這就要先了解 ==AES是一種對稱式加密== 所以不管加密還是解密的時候,它的鑰匙都是同一把(key, iv) 原本的程式碼是讀png檔的內容後,加密完寫進enc裡面 那我們要逆向操作的流程就是,我們要把enc讀進來,之後把enc解密後寫進一個新的png內 就可以得到第二張圖啦~ 解密 === ```python= import requests from Crypto.Cipher import AES def padding(data): return data + b'\x00' * (16 - len(data) % 16) def inder(key, iv, data, AES): key = data[key:key + 16] iv = data[iv:iv + 16] data = open('flag.enc','rb').read() open('flag.png', 'wb').write(AES.new(key, AES.MODE_CBC, iv).decrypt(padding(data))) def outer(data, key, iv): if len(data) != 0 : inder(key, iv, data, AES) if __name__ == "__main__": data = requests.get('https://ctf.bamboofox.tw/rules').text.encode() key = 99 iv = 153 outer(data,key,iv) ``` 0x02 === ![](https://i.imgur.com/tSDQhGW.jpg) 第一步驟解完之後會得到這張圖片,看圖片上意思第一推測就是圖片背後夾帶著其他隱藏訊息、檔案。 所以一開始我直接先丟到Stegsolve.jar之後發現沒有用,真是想法有夠天真的。 後來使用了第二種方法,先使用binwalk查看圖片有無其他隱藏檔案 ![](https://i.imgur.com/eHVM1JM.png) 看見不只0x0自身圖片檔以外,還多了0xC5672的圖片 接下來只要用Foremost去把所有檔案撈出來就好 ![](https://i.imgur.com/pWqDfAV.png) 此時發現當前目錄多了一個名為output的資料夾 這資料夾就是foremost後得出來的結果,直接存進output內 ![](https://i.imgur.com/hzj91Bz.png) output內有一個txt檔以及一個名為png的資料夾 txt內寫的是剛剛foremost後跑出來的資訊 ```linux= > cd output > cat audit.txt Foremost version 1.5.7 by Jesse Kornblum, Kris Kendall, and Nick Mikus Audit File Foremost started at Sat Jan 16 16:30:19 2021 Invocation: foremost flag.png Output directory: /mnt/c/Users/yutio/Downloads/binwalk/output Configuration file: /usr/local/etc/foremost.conf ------------------------------------------------------------------ File: flag.png Start: Sat Jan 16 16:30:19 2021 Length: 1 MB (1201696 bytes) Num Name (bs=512) Size File Offset Comment 0: 00000000.png 789 KB 0 (980 x 746) 1: 00001579.png 383 KB 808562 (980 x 492) Finish: Sat Jan 16 16:30:19 2021 2 FILES EXTRACTED png:= 2 ------------------------------------------------------------------ Foremost finished at Sat Jan 16 16:30:19 2021 ``` foremost的資訊寫了 ```linux= Num Name (bs=512) Size File Offset Comment 0: 00000000.png 789 KB 0 (980 x 746) 1: 00001579.png 383 KB 808562 (980 x 492) Finish: Sat Jan 16 16:30:19 2021 2 FILES EXTRACTED ``` 代表png資料夾內存入了兩張圖片,分別為00000000.png以及00001579.png 開啟00001579.png就會得到下張圖 ![](https://i.imgur.com/hnvKUWr.png) 登愣!Flag噴出來啦~ ==flag{345y_l4_h4iy44444444}==