---
# System prepended metadata

title: '[CTF][Reverse][BambooFox] Ransomware'
tags: [BambooFox, Reverse]

---

###### 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}==