9 - encryptor

  • Hàm cần quan tâm:

image

image

  • Cơ bản là chương trình sẽ nhận tham số là file có đuôi .EncryptMe sau khi encrypt sẽ lưu kết quả vào file có đuôi .Encrypted

Encrypt data

  • Hàm encrypt:

image

  • sub_4020F0 có chuỗi hex expand 32-byte k nên ta có thể đoán được là chacha20 hoặc salsa20

1

  • Do tham số đầu vào một chuỗi bytes gồm 32 bytes và 1 chuỗi 12 bytes nên ta đoán đây là keynonce của thuật toán, do salsa20 chỉ sử dụng 8 bytes cho nonce nên ta có thể chắc rằng đây là thuật toán chacha20

  • Tham số a2 đưa vào chính là nội dung của file cần encrypt

  • Kết quả được lưu vào file .Encrypted

Encrypt key+nonce

image

  • Tiếp đến key+nonce được encrypt bởi sub_4016CC sau đó lưu kết quả vào v9 sau đó được đưa vào file .Encrypted luôn

  • Phân tích hàm đó ta thấy nó thực hiện việc encrypt dựa vào các bytes từ unk_404020

  • Trace ngược lại xem nó được tạo từ đâu

image

  • Có vẻ nó được tạo từ lúc chạy chương trình

  • Nếu để ý các giá trị ban đầu của mảng ta sẽ nhận thấy : 0x10001=65537 giống với số e trong thuật toán RSA

  • Dựa vào đó có thể phân tích lại các hàm:

image

–> Thuật toán để encrypt key+nonce là RSA (tham khảo ở đây)

Decrypt key+nonce và get flag

  • Bây giờ ta có N, d=65537v9 đều được lưu vào file .Encrypted –> Tính toán được key+nonce

  • Từ key+nonce -> flag

from Crypto.Cipher import ChaCha20
#lấy data của e, N, key_enc ngăn cách nhau bởi "\x0A" từ file SuspiciousFile.txt.Encrypted 
e=65537
N=0xdc425c720400e05a92eeb68d0313c84a978cbcf47474cbd9635eb353af864ea46221546a0f4d09aaa0885113e31db53b565c169c3606a241b569912a9bf95c91afbc04528431fdcee6044781fbc8629b06f99a11b99c05836e47638bbd07a232c658129aeb094ddaf4c3ad34563ee926a87123bc669f71eb6097e77c188b9bc9
key_enc=0x5a04e95cd0e9bf0c8cdda2cbb0f50e7db8c89af791b4e88fd657237c1be4e6599bc4c80fd81bdb007e43743020a245d5f87df1c23c4d129b659f90ece2a5c22df1b60273741bf3694dd809d2c485030afdc6268431b2287c597239a8e922eb31174efcae47ea47104bc901cea0abb2cc9ef974d974f135ab1f4899946428184c

res=hex(pow(key_enc,e,N))[2:]
res=bytes.fromhex(res)[::-1]

key=res[:32]
nonce=res[32:].replace(b"\x00\x00\x00\x00",b'')

ct=b'\x7f\x8a\xface\x9c^\xf6\x9e\xb9\xc3\xdc\x13\xe8\xb21:\x8f\xe3m\x94\x864!F+o\xe8\xad0\x8d*y\xe8\xea{f\t\xd8\xd0X\x02=\x97\x14k\xf2\xaa`\x85\x06HM\x97\x0eq\xea\x82\x065\xbaK\xfcQ\x8f\x06\xe4\xadi+\xe6%['
decipher=ChaCha20.new(key=key, nonce=nonce)
print(decipher.decrypt(ct))
  • Kết quả:

image

10 - Nur geträumt

  • Bài này chỉ hơi khó ở chỗ cài tool

  • Có thể tham khảo các bước cài đặt ở đây

  • Sau khi cài xong có thể kéo thể tệp image vào (lưu ý đổi tên image lại vì chương trình có vẻ ko nhận image có kí tự non-ascii)

  • Đề cho chương trình + disassembler luôn:

image

  • Chạy thử:

image

  • Dựa vào đó có thể đoán được là cần nhập đúng password để chương trình decode ra flag.

  • Mở disassembler lên thử thấy flag bị encrypt:

image

  • Xem bằng hex view:

image

  • Coi code thử thấy có một hàm khá quan trọng:

image

  • Vừa tham khảo assembly ở đây vừa đọc code, chương trình chỉ đơn giản là xor cái encrypted flag đó với password mình nhập

  • Dựa vào phần đuôi của flag @flare-on.com xor ngược lại có du etwas Zeit search thử trên mạng thì thấy đó là lời của một bài hát

  • Lấy lời bài hát xor với phần còn lại có Dann_singe_ich_ein…

known=b"@flare-on.com"

kn=list(b'Hast du etwas Zeit f')+[252]+list(b"r mich ")
enc_flag=[0xc, 0x0, 0x1d, 0x1a, 0x7f, 0x17, 0x1c, 0x4e, 0x2, 0x11,0x28, 0x8, 0x10, 0x48, 0x5, 0x0, 0x0, 0x1a, 0x7f, 0x2a, 0xf6, 0x17, 0x44, 0x32, 0xf, 0xfc, 0x1a, 0x60, 0x2c, 0x8, 0x10, 0x1c, 0x60, 0x2, 0x19, 0x41, 0x17, 0x11, 0x5a, 0xe, 0x1d, 0xe,0x39, 0xa,0x4]
print(len(kn))

for i in range(len(enc_flag)):
    
    print(chr(enc_flag[i]^kn[i%len(kn)]),end="")
  • Thấy đó là lời thứ 2 của bài hát, mình copy nguyên câu rồi thêm @flare-on.com thay ü thành u

-> Flag: Dann_singe_ich_ein_Lied_fur_dich@flare-on.com

  • P/S: bài nhảm vcl

11 - The challenge that shall not be named

  • Bài này dùng Pyinstaller để chuyển từ file python -> exe

  • Dùng pyinstxtractor.py để dump source (lưu ý chạy script bằng python 3.7 vì author khi sử dụng Pyinstaller dùng python 3.7)

  • Sau khi dump source, decompile file 11.pyc bằng pycdc

image

  • Có vẻ author dùng Pyarmor để bảo vệ nội dung file python.

  • Theo doc ta sắp xếp file như dưới và chạy thử:

image

  • Kết quả:

image

  • Sau đó mình lấy file crypt.pyc trong source dump được thì chương trình lại yêu cầu thêm các thư viện khác và làm tiếp tục tương tự

image

  • Tới đây thì chương trình file 11.pyc chạy bình thường

  • Decompile thử file crypt.pyc thì thấy cũng bị encrypt bằng pyarmor:

image

-> Có nghĩa là file crypt.pyc này không phải là file thư viện gốc của python là file author tạo ra rồi encrypt cùng lúc với pyarmor

  • Tham khảo write-up mình biết là có thể ghi đè code lên file thư viện để chương trình in ra thứ mình cần

  • Tạo thử một file crypt.py rồi chạy thử:

image

-> Do pyarmor decrypt code trong lúc chương trình chạy nên ta có thể lợi dụng điều này để lúc chương trình gọi code của crypt.py ta có thể biết được phần nào nội dung của file

-> Thư viện thiếu hàm ARC4, tới đây có vẻ là đang đi đúng hướng vì flareon kì này dùng RC4 cipher khá nhiều.

  • Tạo hàm RC4:
def ARC4():
    return

image

  • Hàm này lấy 1 tham số -> thêm vào sẵn tiện in ra luôn :))
def ARC4(x):
    print(x)
    return 

image

  • Ban đầu mình thử tạo hàm encrypt tương tự thì lại không được, xem lại source của crypt.pyc gốc thì mình tạo hàm ARC4 thành 1 class thì được, từ đó theo lỗi tương tự như trên để viết lại hàm encrypt
class ARC4:
    def __init__(self,key):
        print(key)
        return
    def encrypt(a,b):
        print(a)
        print(b)
        return

-> Kết quả:

image