---
# System prepended metadata

title: Writeup CSCV2025

---

## SVANM-CSCV2025

### Mộch!ch!'s memories

Nah, cay mỗi bài này nên viết thôi. À thì lúc mình làm bài này cũng cuống vl méo hiểu sao ngta solve nhanh thế. Lúc biết là string grep ra flag thì caydodai.

![mage](https://hackmd.io/_uploads/B1X8HeAeWg.png)

Không bàn đến việc unintend nó nữa, wu này trình bày cách mình tiếp cận chall này.

Challenge cho ta 1 file mem với mô tả, dựa theo mô tả thì ta cần target vào tiến trình là nguyên nhân dẫn đến crash?

![image](https://hackmd.io/_uploads/rJp8Bx0e-l.png)

```
My friend created a vault manager to store process's secret, unfortunately we haven't contacted for years.
After playing with this program for a while, I noticed there was another user on my computer also used
this program, and somehow it crashed my pc when I tried checking other's secret? Please help me getting
all the secrets!

Note: A gentle reminding that description is really important to solve the chal <3

Pw: f69203c99d9f48fbf8060bef045023aa

Please verify challenge's checksum before usage, always be mindful of what you're doing.

MD5: f3af82ce151d0851209973087c529b9e
SHA1: 0f7a865e68424a9dff95e4d5574088a585865e38
```

#### MISC

Quăng vào windbg, với 1 vài lệnh đơn giản ta thấy được:

```windbg
9: kd> !analyze -v
Loading Kernel Symbols
...............................................................
................................................................
..............................................................
Loading User Symbols
..............................
Loading unloaded module list
.........
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

SYSTEM_SERVICE_EXCEPTION (3b)
An exception happened while executing a system service routine.
Arguments:
Arg1: 00000000c0000005, Exception code that caused the BugCheck
Arg2: fffff8035be810fc, Address of the instruction which caused the BugCheck
Arg3: ffffd0853d268010, Address of the context record for the exception that caused the BugCheck
Arg4: 0000000000000000, zero.

Debugging Details:
------------------

Unable to load image \??\C:\Users\a\Desktop\personalVaultKernel.sys, Win32 error 0n2
Unable to load image C:\Users\a\Desktop\aPersonalVault.exe, Win32 error 0n2
*** WARNING: Unable to verify checksum for aPersonalVault.exe
Unable to load image C:\Users\a\Desktop\aPersonalVault.exe, Win32 error 0n2
*** WARNING: Unable to verify checksum for aPersonalVault.exe
Unable to load image C:\Users\a\Desktop\aPersonalVault.exe, Win32 error 0n2
*** WARNING: Unable to verify checksum for aPersonalVault.exe
```

Như trên đây ta có thể thấy có vẻ các file trên là nguyên nhân dẫn đến crash như mô tả đề bài, mình sẽ tìm cách dump chúng ra.

- Driver lỗi: `personalVaultKernel.sys`
- Process gây ra: `aPersonalVault.exe`

```cmd
9: kd> lm
start             end                 module name
00007ff6`73ba0000 00007ff6`73bc3000   aPersonalVault C (no symbols)
....
fffff803`5be80000 fffff803`5be89000   personalVaultKernel   (no symbols)
...

9: kd> lmDvmaPersonalVault
Browse full module list
start             end                 module name
00007ff6`73ba0000 00007ff6`73bc3000   aPersonalVault C (no symbols)
    Loaded symbol image file: aPersonalVault.exe
    Image path: C:\Users\a\Desktop\aPersonalVault.exe
    Image name: aPersonalVault.exe
    Browse all global symbols  functions  data  Symbol Reload
    Timestamp:        Fri Oct 10 06:37:17 2025 (68E8472D)
    CheckSum:         00000000
    ImageSize:        00023000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4
    Information from resource tables:
9: kd> lmDvmpersonalVaultKernel
Browse full module list
start             end                 module name
fffff803`5be80000 fffff803`5be89000   personalVaultKernel   (no symbols)
    Loaded symbol image file: personalVaultKernel.sys
    Image path: \??\C:\Users\a\Desktop\personalVaultKernel.sys
    Image name: personalVaultKernel.sys
    Browse all global symbols  functions  data  Symbol Reload
    Timestamp:        Thu Oct  9 22:16:44 2025 (68E7D1DC)
    CheckSum:         00011A41
    ImageSize:        00009000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4
    Information from resource tables:
```

Trên đây là 1 vài thông tin cần thiết để mò đến các giá trị trong mem. Ta sẽ sử dụng đến chúng sau.

Giờ thì để dump 2 tiến trình này ra. Mình sử dụng [MemProcFS](https://github.com/ufrisk/MemProcFS).

```powershell
MemProcFS.exe -device "file path" -forensic 1
```

![image-1](https://hackmd.io/_uploads/rkGurx0eWx.png)

Giờ thì vào ổ đĩa ảo nó tạo ra để lấy file thôi.

![image-3](https://hackmd.io/_uploads/ByY9re0lbe.png)

#### Analyze

##### aPersonalVault.exe

Chương trình này làm nhiệm vụ đúng như mô tả đề bài là thực hiện tạo `User/pass`.

![image-2](https://hackmd.io/_uploads/S1k5BgRlZl.png)

Cụ thể thì, với chức năng `Create`, chương trình sẽ tạo 48 byte là key và iv để mã hóa secret ta nhập vào bằng `AES-CBC`.

![image-4](https://hackmd.io/_uploads/rySiBeAlZl.png)

Sau đó đưa username thành dạng checksum rồi gửi dữ liệu xuống kernel bằng `NtQuerySystemInformation` với partern `34 33 32 31` và option `2`.

![image-5](https://hackmd.io/_uploads/BJW2Sl0l-g.png)

Còn khi bấm `Check` chương trình sẽ query secret từ kernel với option `1`.

```C
buf_5[0] = '1234';
buf_5[1] = 1;
buf_5[2] = v6;
buf_5[3] = 0x100;

NtQuerySystemInformation(
    SystemRegistryQuotaInformation|SystemPerformanceInformation|0x40,
    buf_5,
    0x10u,
    0);
```

Vấn đề là chương trình chỉ gửi cipher đi và key + iv thì gen lại sau mỗi lần tạo user mới. Nên nếu tạo nhiều user thì hết cứu. Rất may ở đây là tác giả chỉ tạo 1 tài khoản mỗi user.

##### personalVaultKernel.sys

Tiếp đến ta xem nó xử lý ở kernel ra sao.

Trước tiên ta biết khi nào thì chương trình bị crash. Khi nhận dữ liệu có partern là `30 30 30 30` với option là `1` chương trình chạy vào block có lệnh `mov [rax], al`.

![image-6](https://hackmd.io/_uploads/H1j3re0l-l.png)

```asm
personalVaultKernel+0x10fc:
fffff803`5be810fc 8800    mov byte ptr [rax],al
                           ds:002b:00000000`00000000=??
                                    ↑
                                    NULL POINTER!
```

![image-7](https://hackmd.io/_uploads/HkB6rxAeZx.png)

Bên cạnh đó còn 1 hàm xử lý nếu partern là `34 33 32 31`.

Nếu option là `1`, chương trình thực hiện chức năng READ, tìm kiếm cipher lưu trong dslk `List`- là 1 danh sách liên kết 2 chiều. và tìm kiếm bằng cách so sánh checksum của username.

![image-10](https://hackmd.io/_uploads/B1tx8lAlZg.png)

Option 2 thì dễ đoán là ngược lại -> chức năng write vào 1 node trong dslk.

![image-11](https://hackmd.io/_uploads/BJWzLeAlWx.png)

#### Mech

Tóm lại: `aPersonalVault.exe` và `personalVaultKernel.sys` giao tiếp với nhau.

`aPersonalVault.exe` thực hiện tạo user, gửi thông tin save/query check.
`personalVaultKernel.sys` thực hiện lưu trữ, handle các thông tin được gửi đến từ con exe.

Tổng quan thì ta có 2 user chạy 1 chương trình 1, thằng thì push cipher lên trước còn 1 thằng thì check rồi làm crash..., nên dù địa chỉ vật lý chỉ ra là giống nhau nhưng VA sẽ khác, giờ target là mò đến cả 2 để lấy key và iv ra.

#### Gather data

Ờ thì cơ bản là phân tích xong rồi, đi nhặt data thôi.

Để lấy `Key` và `IV`, như đã nói ở trên, chúng được lưu vào biến tại `.data` nên ta có thể dùng windbg mò đến offset và nhặt ra.

![image-8](https://hackmd.io/_uploads/SJ3XLxAlbl.png)

Trước tiên là lấy RVA đã.

![image-9](https://hackmd.io/_uploads/ryuE8gAxWe.png)

Tiếp theo là đến 2 tiến trình aPersonalVault.exe

```
9: kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****

...

PROCESS
    SessionId: none  Cid: 17b8    Peb: 8db14c5000  ParentCid: 166c
    DirBase: 21debd000  ObjectTable: ffff8a0b556d3c80  HandleCount: 163.
    Image: aPersonalVault.exe

...

PROCESS ffff9a03b33bb080
    SessionId: none  Cid: 1218    Peb: 8529b20000  ParentCid: 166c
    DirBase: be51d000  ObjectTable: ffff8a0b55de0c00  HandleCount: 164.
    Image: aPersonalVault.exe

...
```

Switch cpu context rồi lấy base của `aPersonalVault.exe`.

![image-12](https://hackmd.io/_uploads/HySr8xRgZe.png)

Nhảy đến và lấy địa chỉ của key.

![image-13](https://hackmd.io/_uploads/r1RH8gAe-e.png)

Rồi giờ nhặt key iv từ địa chỉ đó của từng con vault.exe một thôi.

```
9: kd> .process /r /p ffff9a03b53130c0
Implicit process is now ffff9a03`b53130c0
Loading User Symbols
..............................

************* Symbol Loading Error Summary **************
Module name            Error
personalVaultKernel    The system cannot find the file specified

You can troubleshoot most symbol related issues by turning on symbol loading diagnostics (!sym noisy) and repeating the command that caused symbols to be loaded.
You should also verify that your symbol search path (.sympath) is correct.
9: kd> db 7FF673BBDB50h L100
00007ff6`73bbdb50  d4 b6 c8 13 80 1d 55 8b-85 99 5e e5 90 54 00 9f  ......U...^..T..
00007ff6`73bbdb60  4a 8e 8a f1 79 4f ec 77-70 ab b9 eb f8 68 5c 0a  J...yO.wp....h\.
00007ff6`73bbdb70  21 ec 72 b5 5e 9e 8d cc-a3 cb d4 58 da d5 28 93  !.r.^......X..(.
00007ff6`73bbdb80  01 00 00 00 00 00 00 00-c8 03 03 00 00 00 00 00  ................
00007ff6`73bbdb90  d2 03 05 00 00 00 00 00-cc 03 03 00 00 00 00 00  ................
00007ff6`73bbdba0  f2 00 03 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdbb0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdbc0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdbd0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdbe0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdbf0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc00  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc10  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc20  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc30  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc40  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

-> key: "D4 B6 C8 13 80 1D 55 8B 85 99 5E E5 90 54 00 9F 4A 8E 8A F1 79 4F EC 77 70 AB B9 EB F8 68 5C 0A"
   iv: "21 EC 72 B5 5E 9E 8D CC A3 CB D4 58 DA D5 28 93"
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
9: kd> .process /r /p ffff9a03b33bb080
Implicit process is now ffff9a03`b33bb080
Loading User Symbols
..............................

************* Symbol Loading Error Summary **************
Module name            Error
personalVaultKernel    The system cannot find the file specified

You can troubleshoot most symbol related issues by turning on symbol loading diagnostics (!sym noisy) and repeating the command that caused symbols to be loaded.
You should also verify that your symbol search path (.sympath) is correct.
9: kd> db 7FF673BBDB50h L100
00007ff6`73bbdb50  c7 07 b1 8b f4 fb 52 11-d1 cb da 2c ac 92 0b c7  ......R....,....
00007ff6`73bbdb60  b6 30 61 a1 09 c3 ca 74-94 0c a3 ad bf db 10 1f  .0a....t........
00007ff6`73bbdb70  fc 80 59 c0 53 4b d9 f1-86 7c e0 9a 16 c7 fc 65  ..Y.SK...|.....e
00007ff6`73bbdb80  01 00 00 00 00 00 00 00-5a 00 03 00 00 00 00 00  ........Z.......
00007ff6`73bbdb90  5c 03 02 00 00 00 00 00-5c 00 03 00 00 00 00 00  \.......\.......
00007ff6`73bbdba0  28 03 05 00 00 00 00 00-00 00 00 00 00 00 00 00  (...............
00007ff6`73bbdbb0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdbc0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdbd0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdbe0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdbf0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc00  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc10  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc20  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc30  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`73bbdc40  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

-> key: "c7 07 b1 8b f4 fb 52 11 d1 cb da 2c ac 92 0b c7 b6 30 61 a1 09 c3 ca 74 94 0c a3 ad bf db 10 1f"
   iv: "fc 80 59 c0 53 4b d9 f1 86 7c e0 9a 16 c7 fc 65"
```

Làm tương tự với con `.sys` để lấy cipher vì con trỏ `List` của nó cũng được lưu trong `.data`

![image-15](https://hackmd.io/_uploads/HkcLUgCxWx.png)

Nhảy đến `0FFFFF8035BE84360h` ta thấy con trỏ trỏ đến dữ liệu tiếp theo `20 C1 2A A3 0F A2 FF FF`.

![image-14](https://hackmd.io/_uploads/HJvDIxAlWl.png)

CT1: `0C 5C 7D BB D7 C5 FF D2 49 7D 97 2C 41 7B B8 8F CD F1 2C 83 50 C0 1A B7 FF A3 87 16 57 DE A5 D3 2F 60 BB 91 60 99 4D 3F 79 F1 8C 14 E9 D9 58 54 30 B3 84 58 5E 0F 8E D5 FA 47 88 F0 D4 B5 16 23`

![image-16](https://hackmd.io/_uploads/ryxqLeRl-g.png)

Tương tự trỏ đến CT2: `BD 3F 49 E7 86 50 F7 B9 7A 82 3B 1E C1 F7 72 7E 4C 6A A4 87 DE 54 76 75 1B E6 79 E2 50 9B FE DD 71 F0 CE ED 26 B4 99 E7 C8 9B 82 3D C3 6E 12 69 10 46 8D 56 AC 5E 84 AD EA 1A 6C 6B D6 44 7A F6 F0 EE 68 D9 96 BB D9 5F 2E 1A 48 38 EF BE 9E 4B`
tại `FFFFA20FA2FD0190`.

![image-17](https://hackmd.io/_uploads/Sk_98g0eWl.png)

#### Decrypt

Giờ thì decrypt ra 1 bộ, bộ còn lại thì không decrypt ra. Tới đây bắt đầu ngố@@. 

![image-18](https://hackmd.io/_uploads/By4i8g0lZx.png)

Đoạn này bắt đầu suy diễn rồi dò stack của từng con `vault.exe` vì nghĩ khả năng tạo nhiều user nên bị mất key/iv các kiểu nma tất nhiên là không đúng. Sau 1 hồi thì chết não -> làm khùng làm điên -> hết giờ -> nhót.

Nah giờ ngẫm lại thì nội dung decrypt ra rõ ràng là hint rằng mình đang đi sai rồi mà cuống wa.

#### Antidebug

Bởi vì luồng chương trình không đơn giản vậy, mình đã bỏ qua 1 đoạn antidebug.

![image-19](https://hackmd.io/_uploads/r16iIe0xZx.png)

Nếu không dính, nó sẽ thực hiện hook vào `NtConvertBetweenAuxiliaryCounterAndPerformanceCounter` và xor ct của mình với key `CSCV2025` rồi gửi lại kernel.

![image-20](https://hackmd.io/_uploads/SJ93Ll0ebl.png)

Đoạn bị hook nằm ở đây, với thông số gửi đi là `30 30 30 30` với option `1`, ta sẽ bị crash như ban đầu phân tích.

![image-21](https://hackmd.io/_uploads/rylpIgClWg.png)

Làm bài có antidebug trong init không biết bao nhiêu lần rồi mà vẫn dính thì do ngu thôi biết sao giờ.

Giờ thì rõ rồi, ct dump ra từ mem của con `.sys` cần xor thêm với key `CSCV2025`.

Và cần làm theo luồng chương trình để lấy flag(đoạn này kịch bản hơi điêu vì key/iv gen ra random mà lại decrypt ra flag bằng cách check?)-thì ta sẽ xor rồi encrypt bằng key/iv đầu tiên(vì key/iv đầu tiên có thể decrypt ra `Plaintext: Touch this or I'll kill you without blinking, please don't do this` mà không lỗi)
rồi tiếp đến là thao tác check của user hiện tại làm crash, ta sẽ decrypt bằng cặp key iv còn lại để hoàn thành thao tác decrypt sau check).

![image-22](https://hackmd.io/_uploads/ByPaLe0gZg.png)

```
CSCV2025{one_day_all_revs_will_not_have_crypto_anymore}
```

## Tổng kết

:D Dm plot liên tục(do gà không nhận ra). nun na na a mộ chi chi.

### Hi vọng WRITEUP này giúp ích cho các bạn :D

```
from KCSC
Author: SonVH
```
