###### tags: `BambooFox` `Reverse`
# [CTF][Reverse][BambooFox] Ransomware
題目檔案連結:[Download](https://drive.google.com/file/d/1pRpqeBqNab6FBiQ9zzrVvw55pS-qqj6j/view?usp=sharing)
0x01
===
題目下載後有三個檔案,如下圖

flag.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
===

第一步驟解完之後會得到這張圖片,看圖片上意思第一推測就是圖片背後夾帶著其他隱藏訊息、檔案。
所以一開始我直接先丟到Stegsolve.jar之後發現沒有用,真是想法有夠天真的。
後來使用了第二種方法,先使用binwalk查看圖片有無其他隱藏檔案

看見不只0x0自身圖片檔以外,還多了0xC5672的圖片
接下來只要用Foremost去把所有檔案撈出來就好

此時發現當前目錄多了一個名為output的資料夾
這資料夾就是foremost後得出來的結果,直接存進output內

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就會得到下張圖

登愣!Flag噴出來啦~
==flag{345y_l4_h4iy44444444}==