---
# System prepended metadata

title: PIS/malware

---

đầu tiên ta sử dụng DIE để phân tích đây là file gì 
![image](https://hackmd.io/_uploads/BJNc6UQbee.png)
* 
* sau khi phân tích được đây là file python đã bị packed bằng cách sử dụng pyinstaller 
* nên mình sử dụng đoạn code pyinstactor:
* https://github.com/extremecoders-re/pyinstxtractor/blob/master/pyinstxtractor.py
* 
* để decompress file này 
* sau đó quăng file malware.pyc lên trang pyligual.io để đọc file 
* ta thấy có các đoạn hidden shell và cả đoạn code obfuscate base64
* 
* nên mình đã sử dụng để đọc ngược lại và decode base64 các đoạn hidden_shell và ở đoạn 1 ta có được:

![image](https://hackmd.io/_uploads/HJUmA87Zxe.png)

sau khi biết được flag ở đoạn source code thì ta thấy đoạn source code đã bị mã hóa ở đoạn malware_data
và ta cần decode nó ra và lưu nó vào file bin để sử dụng IDA dịch ngược lại 

(vì khi decode ra đoạn shell đã bị obfuscate bằng cách mã hex và sau khi tìm hiểu thì mình biết được IDA pro có thể deobfuscate đoạn này ).

![image](https://hackmd.io/_uploads/SkvfWPQbeg.png)


sau khi mở bằng IDA thì ta đã có được đoạn shell này 

ý tưởng của đoạn này là ta sẽ nhập flag và code sẽ kiểm tra độ dài flag 

và ta cần kiểm tra hàm malware_check sẽ làm gì 

![image](https://hackmd.io/_uploads/HkfrlPm-ee.png)

hàm này sẽ xor 2 kí tự vào với nhau và đảm bảo để key luôn trong giới hạn của nó thì sẽ sử dụng (i % 4)

và ta biết được key = 0xDEADBEEF;

và sau khi xor xong biến tmp sẽ check target để xem flag có đúng không 

![image](https://hackmd.io/_uploads/rkhmGw7Zlg.png)


vì vậy ta sẽ biết được flag ban đầu sẽ được tìm bằng cách

xor biến target với từng kí tự key 

và mình đã viết script ở đây để giải mã flag:

```
target = [
    0xBF, 0xF7, 0xFE, 0x9D, 0xBB, 0xF8, 0xD6, 0xB3, 0xDB, 0xD2,
    0xDA, 0xEA, 0x9D, 0x8D, 0xF2, 0xEF, 0x81, 0xE1, 0xDE, 0xEE,
    0x9A, 0xCC, 0xCE, 0xED, 0xB0, 0xDD, 0x9D, 0xBA, 0xDC, 0xE1,
    0xC9, 0xEE, 0x81, 0x89, 0xF2, 0xAC, 0x9A, 0xD0, 0xF2, 0xEF,
    0x9B, 0x9F, 0x8C, 0xFF, 0x92
]

key = [0xEF, 0xBE, 0xAD, 0xDE]

flag = ""

for i in range(len(target)):
    k = key[i % 4]
    v = target[i] ^ k
    # Chuyển về signed 8-bit
    if v >= 128:
        v -= 256
    flag += chr(v)

print("Flag:", flag)

```

Flag: PISCTF{m4lw4r3_1n_s0urc3_c0d3_d0n7_run_1t!!!}