
Forensic
BasicQnA
An amateur attacker’s perspective. Answer all questions to get the flag.
Author: @qth24
Q1: What are the attacker IP address and victim IP address ?

Mở file pcapng bằng Wireshark và vào mục Statistics -> Conversations (tab IPv4), mình thấy lưu lượng mạng tập trung phần lớn vào cuộc giao tiếp giữa 2 địa chỉ IP chiếm tới hơn 36 nghìn gói tin

Để xác định rõ vai trò của từng bên, mình lọc các gói tin HTTP trao đổi giữa 2 địa chỉ này:
1 | ip.src == 172.29.9.159 && ip.dst == 13.212.67.96 && http |
Phân tích các gói tin, mình nhận thấy IP 172.29.9.159 liên tục gửi các request do thám, quét danh sách các plugin WordPress và dùng kỹ thuật Path Traversal (/../../etc/passwd, /../../boot.ini, /sdk/../../etc/vmware/hostd/vmInventory.xml) để tìm kiếm file nhạy cảm trên máy chủ 13.212.67.96. Do đó, 172.29.9.159 là attacker và 13.212.67.96 là victim

172.29.9.159,13.212.67.96
Q2: What SSH service/version is running on the victim?

Để xem trên máy chủ nạn nhân có chạy dịch vụ SSH hay không, mình mở Statistics -> Protocol Hierarchy và thấy có lưu lượng của giao thức SSH

Tiếp tục lọc riêng các gói tin SSH bằng filter ssh. Trong quá trình thiết lập kết nối (SSH Handshake), hai bên sẽ gửi banner định danh phiên bản của mình. Tại Frame 11709 do máy chủ nạn nhân phản hồi, trường Info hiển thị rõ banner của dịch vụ

Banner hiển thị là SSH-2.0-OpenSSH_10.2p1 Ubuntu-2ubuntu3.2. Theo đúng format yêu cầu service_version distro_version
OpenSSH_10.2p1 Ubuntu-2ubuntu3.2
Q3: What tool did the attacker use for reconnaissance?

Kiểm tra chi tiết gói tin HTTP ở câu 1 tại Frame 18080 (request tới URI /nmaplowercheck1782289292), khi xem thông tin các trường HTTP Header thì tại User-Agent xuất hiện chữ ký rõ ràng

Chuỗi User-Agent ghi nhận là Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html), chứng tỏ kẻ tấn công đã dùng tool nmap kèm các script NSE để thực hiện do thám hệ thống
nmap
Q4: Which TCP stream shows that the attacker successfully created a temporary admin account?

Sau khi do thám, attacker gửi một request POST đến endpoint /wp-admin/admin-ajax.php nhằm khai thác tính năng tạo tài khoản hỗ trợ tạm thời. Thực hiện Follow TCP Stream luồng trao đổi này, ta xem được toàn bộ request và phản hồi từ server

Máy chủ phản hồi mã 200 OK kèm thông báo JSON xác nhận tạo thành công tài khoản tạm thời với role admin. Nhìn lên tiêu đề cửa sổ stream của Wireshark, ta xác định được số stream tương ứng
tcp.stream eq 4491
Q5: What is the temporary admin account created by the attacker?

Xem chi tiết nội dung JSON mà server trả về trong luồng stream tcp.stream eq 4491 ở trên

Hệ thống phản hồi chuỗi JSON.
{"message":"Temporary support access created.","role":"admin","success":true,"support_url":"...","user":"support_c30cde@corpvault.local"}.
Tại trường "user", ta thấy tài khoản admin vừa được cấp là
Q6: What is the CVE of the abused technique?

Phân tích payload trong request ở stream trên.
action=wpgmp_temp_access_ajax&nonce=fc-call-nonce-7d91c2c0&check_temp=false
Endpoint /wp-admin/admin-ajax.php cùng action wpgmp_temp_access_ajax thuộc về plugin WP Maps Pro (WP Google Map Pro). Plugin này bị lỗi phân quyền (Unauthenticated Privilege Escalation) do đăng ký action AJAX cho cả người dùng chưa đăng nhập, cho phép kẻ tấn công lợi dụng nonce công khai để tạo tài khoản Administrator mà không cần xác thực. Tìm kiếm thông tin về lỗ hổng này, ta thu được mã CVE

CVE-2026-8732
Q7: Which user-controlled parameter in the backup feature was abused to achieve RCE?

Sau khi có tài khoản admin và đăng nhập thành công thông qua liên kết magic login, attacker chuyển hướng vào trang quản trị bảo trì /admin/maintenance

Tại trang này có công cụ Backup Helper để hỗ trợ sao lưu dữ liệu. Kiểm tra mã nguồn HTML của form sao lưu, mình thấy trường input nhận tên gói backup từ người dùng

Thẻ input có thuộc tính name="backup_name". Kẻ tấn công đã lạm dụng chính tham số backup_name này để chèn thêm các ký tự đặc biệt (dấu chấm phẩy ;) và lệnh shell hệ thống nhằm đạt được RCE
backup_name
Q8: What are the two files that the attacker read to obtain the victim’s information after gaining command execution?

Sau khi phát hiện lỗ hổng chèn lệnh, attacker liên tục gửi các request POST /admin/maintenance để thực thi các câu lệnh hệ thống nhằm tìm kiếm thông tin nhạy cảm

Lần theo các luồng stream của những request này.
Đầu tiên, attacker chèn lệnh đọc file bí mật trong thư mục ứng dụng qua payload backup_name=daily-contracts; cat /app/static/.env

Kết quả thực thi trả về nội dung chứa Personal Access Token của nạn nhân

Tiếp theo, ở luồng stream kế tiếp, attacker tiếp tục chèn lệnh đọc file cấu hình thứ hai qua payload backup_name=daily-contracts; cat /app/templates/.env

Kết quả thực thi trả về đường dẫn repository của nạn nhân

Hai file mà attacker đã đọc là
/app/static/.env,/app/templates/.env
Q9: What is the found Github ID?

Từ kết quả trả về khi đọc file /app/templates/.env ở trên, máy chủ hiển thị chuỗi repository Ich1ck3nPlus/final

Kết hợp với token lấy được ở file .env trước đó, ta xác định được username / Github ID của nạn nhân là
Ich1ck3nPlus
Sau khi trả lời đầy đủ 9 câu hỏi trên web, hệ thống hoàn thành và cung cấp flag

Flag: v1t{llm_c0uld_s0lv3_th1s_ez_chall3ng3!!!}
Green Goblin
The Green Goblin harnessed a secret Dark Energy to attack our system. Fortunately, our defenses froze his payload mid-execution, shattering his Dark Energy into 5 fragments scattered across the OS internals (R, KO, D, EL and M). Can you recover all 5 fragments and assemble them in the correct order to seal his power forever?
Author: @J
Từ phần mô tả của đề bài, ta có thể suy luận các ký hiệu tương ứng với các thành phần trong hệ điều hành:
1 | R = Registry |
Kiểm tra file dump bộ nhớ raw bằng plugin windows.cmdline, mình phát hiện có nhiều tiến trình PING.EXE ping 127.0.0.1 -n 1000

Điều này cho thấy tiến trình có thể đã spawn nhiều process phụ để delay hoặc duy trì trạng thái “mid-execution” như mô tả.
Tiếp tục quét bằng plugin windows.filescan, mình tìm thấy một file trùng tên với challenge nên đã xác định offset của file và dump nó ra

Kiểm tra header của file vừa trích xuất, đây chính xác là một file thực thi PE32+

Đưa file PE vào IDA Pro, mình kiểm tra danh sách symbols trước và tìm được các hàm xử lý đáng chú ý

Kiểm tra bảng import của binary, các API được gọi hoàn toàn tương ứng với 5 gợi ý trong mô tả

1 | GenerateRegistryArtifact() -> R |
Đi vào hàm wmain để phân tích thứ tự thực thi

Sau khi chạy các hàm tạo artifact (GenerateADSArtifact, GenerateEventLogArtifact, GenerateMemoryArtifact, GenerateRegistryArtifact), hàm wmain lấy Session ID của tiến trình hiện tại để xây dựng đường dẫn Object Manager:
1 | ProcessIdToSessionId(GetCurrentProcessId(), &pSessionId); |
Đường dẫn trên tương ứng với object CTF.AsmListCache.FMPWinlogon<SessionId> trong namespace BaseNamedObjects của Windows. Tiếp theo, chương trình xác định đích (target) của symbolic link:
1 | if (a1 == 2) |
Ở chế độ mặc định không có tham số dòng lệnh, chuỗi hard-coded được sử dụng là:
1 | \BaseNamedObjects\9cGb0c |
Hai chuỗi vừa tạo được chuyển thành UNICODE_STRING rồi truyền vào hàm NtCreateSymbolicLinkObject:
1 | RtlInitUnicodeString(&DestinationString, SourceString); |
Lời gọi này tạo một Object Manager Symbolic Link trỏ tới object \BaseNamedObjects\9cGb0c. Sau đó chương trình khởi chạy conhost.exe với quyền Administrator và liên tục gọi NtOpenSection() để chờ object này được mở:
1 | ShellExecuteExW(&pExecInfo); |
Điều này cho thấy 9cGb0c chính là tên của Named Section (Kernel Object). Đồng thời, trong hàm GenerateMemoryArtifact() cũng có lời gọi:
1 | CreateFileMappingW( |
Hàm CreateFileMappingW tạo một Named Section Object với tên Local\9cGb0c, tương ứng với object \BaseNamedObjects\9cGb0c trong Object Manager.
Vì vậy fragment KO (Kernel Object) là: 9cGb0c

Kiểm tra hàm GenerateADSArtifact():
Đầu tiên, chương trình gọi CreateFileW() để tạo (hoặc ghi đè) file:
1 | CreateFileW( |
Dấu : sau tên file biểu thị Alternate Data Stream (ADS) của hệ thống tệp NTFS. Thay vì ghi dữ liệu vào file config.ini, chương trình ghi dữ liệu vào stream ẩn có tên hidden gắn với file đó.
Sau khi mở stream, chương trình khởi tạo buffer chứa chuỗi "03809”`:
1 | char Buffer[7]; |
Sau đó ghi 6 byte đầu tiên vào ADS bằng WriteFile() và đóng file bằng CloseHandle():
1 | WriteFile( |
Vì vậy fragment Disk (D) là: "03809”`

Kiểm tra hàm GenerateEventLogArtifact():
Chương trình đăng ký một Event Source giả lập có tên Application Error:
1 | hEventLog = RegisterEventSourceW( |
Tiếp theo, chương trình chuẩn bị chuỗi thông báo lỗi giả mạo ứng dụng ctfmon.exe:
1 | Strings = |
Phần cuối của thông báo faulting module path: chứa chuỗi cC50C_. Chương trình gọi ReportEventW() để ghi sự kiện vào Windows Event Log với Event ID 1000 rồi hủy đăng ký qua DeregisterEventSource():
1 | ReportEventW( |
Do đó, fragment Event Log (EL) là: cC50C_

Kiểm tra hàm GenerateMemoryArtifact():
Hàm này tạo một memory artifact bằng cơ chế File Mapping:
1 | result = (char *)CreateFileMappingW( |
Tham số (HANDLE)-1 (INVALID_HANDLE_VALUE) cho biết vùng nhớ được tạo không ánh xạ tới file thực tế trên đĩa mà sử dụng pagefile của hệ điều hành với kích thước 4096 bytes (0x1000).
Sau đó, chương trình ánh xạ vùng nhớ vào không gian địa chỉ tiến trình qua MapViewOfFile() và dùng memcpy() để ghi dữ liệu vào offset +592 (tức 0x250):
1 | result = (char *)MapViewOfFile(result, 2u, 0, 0, 0); |
Do đó, fragment Memory (M) là: _dEbCN

Kiểm tra hàm GenerateRegistryArtifact():
Hàm này tạo Registry artifact bằng cách ghi giá trị vào Registry tại nhánh:
1 | HKCU\Software\Policies\Microsoft\CloudFiles |
Chương trình tạo khóa và ghi 6 byte của chuỗi "'%L0" vào value DiagnosticData:
1 | RegSetValueExA( |
Tiếp theo, chương trình tạo thêm 15 value phụ từ DiagnosticData_0 đến DiagnosticData_14 với cùng nội dung "N01S3_" để làm nhiễu:
1 | for (i = 0; i <= 14; ++i) |
Vì vậy, fragment Registry (R) nằm ở value DiagnosticData là: "'%L0"

Tổng hợp cả 5 fragment tìm được:
1 | R = '`%L`0 |
Ghép theo đúng thứ tự yêu cầu trong đề bài (R + KO + D + EL + M):
1 | '`%L`09cGb0c03`809cC50C__dEbCN |
Giải mã chuỗi trên bằng ROT47

Flag: V1T{1_h4v3_4_b1g_h4rd_r005t3r}
OSINT
Town Tour 01
Recently, I visited this place with my friends, and that was awesome. My friend from suburb of Hanoi told me that in his town there was a place that had similar structure like this one. I found that place, and they also have plane exhibition. Beside planes they have a helicopter. Do you know what model it is, and also the number of that helicopter? Flag format: V1T{Helicopter_model_number}. For eg: A Mikoyan-Gurevich MiG-21bis Fishbed L, number 36: V1T{Mikoyan_Gurevich_MiG_21bis_Fishbed_L_36}
Author: @deroise2306
Tìm kiếm bằng Google Lens / Image, mình xác định được công trình trong ảnh là Cột cờ Hà Nội

Đối chiếu trên Google Maps để xác nhận lại vị trí

Tại khu trưng bày ngoài trời gần cột cờ (Bảo tàng Lịch sử Quân sự Việt Nam cũ), mình tìm thấy chiếc trực thăng

Tra cứu thông tin model và số hiệu của chiếc trực thăng này (Mil Mi-8 Hip, số hiệu 7822)
Flag: V1T{Mil_Mi_8_Hip_7822}
Town Tour 02
On my way to buy my daily stuff at the nearby supermarket, I have to go pass this Vinaphone store. Do you know what is the supermarket I’m going to? (not the building name, it’s the brand). P/s: U have to use lots of Google Translate for this :> And what u see on GG Maps might be different from the photo.
Example: v1t{Ha_Noi_Mart}
Author: @deroise2306
Dựa trên hình ảnh đề bài cung cấp, biển hiệu cửa hàng VNPT/Vinaphone là manh mối quan trọng để khoanh vùng vị trí

Quan sát hai chiếc ô tô trong ảnh, biển số xe có đầu số 29 hoặc 23, giúp thu hẹp phạm vi về Hà Nội hoặc Tuyên Quang

Chi tiết hoa văn trang trí hình Khuê Văn Các trên cột đèn đường khẳng định địa điểm này thuộc địa bàn Hà Nội

Tra cứu danh sách các điểm giao dịch VNPT tại Hà Nội kết hợp tìm kiếm trên Google Maps để đối chiếu kiến trúc tòa nhà (mô tả có lưu ý quang cảnh thực tế có thể đã thay đổi so với ảnh). Kết quả tìm được chi nhánh VNPT Sơn Tây có kiến trúc trùng khớp

Kiểm tra với Google Maps, dù cảnh quan xung quanh có thay đổi nhưng kiến trúc và màu sắc của tòa nhà VNPT vẫn giữ nguyên

Theo manh mối trong mô tả là đang trên đường đi đến siêu thị và xe đang đi ở làn bên phải, suy ra siêu thị sẽ nằm về phía bên phải so với cửa hàng VNPT

Đi men theo trục đường về bên phải, mình tìm thấy siêu thị Lan Chi Sơn Tây

Tên thương hiệu của siêu thị là Lan Chi Mart, đúng với định dạng flag yêu cầu

Flag: v1t{Lan_Chi_Mart}
78CT
Rawr and I used to spend hours at a lake right in the heart of our hometown during high school. It was our favorite spot to chill and just clear our minds when the afternoon breeze rolled in after those endless school days. There is also something interesting nearby. If you take a closer look from above, you might notice that a park next to the lake has a shape that resembles a dragon. Can you find the place and figure out what I left behind at the lake?
Author: @Jaze
Tìm kiếm công viên có hình dạng mô phỏng con rồng ôm ngọc bên hồ nước, mình tìm ra công viên Thanh Niên tại thành phố Tuy Hòa, tỉnh Phú Yên (biển số 78 - đúng với tiêu đề 78CT)

Hồ nước kế bên là hồ điều hòa Hồ Sơn. Để tìm thông điệp bị giấu, mình kiểm tra các bức ảnh và bài đánh giá công khai trên Google Maps

Lọc qua các hình ảnh gần đây, mình phát hiện một bài đăng có kèm hashtag #v1tnamese đáng ngờ

Bài đăng được viết xen kẽ các ký tự hoa và thường lộn xộn, nhưng để ý kỹ sẽ thấy quy tắc: mỗi từ chỉ chứa duy nhất một ký tự viết hoa hoặc số:
Lọc và ghép các ký tự đặc biệt này lại, mình thu được chuỗi Base64:
1 | VjFUe1czX3IzNGxseV9sMHYzXzdoMTVfcGw0YzN9 |
Giải mã chuỗi Base64 để thu được flag

Flag: V1T{W3_r34lly_l0v3_7h15_pl4c3}
Quack CIA
I swear I saw flag.txt in the video, but now it’s redacted—IT MUST BE THE CIA. I SWEAR… BRO, THE CIAAAAAA! https://www.youtube.com/watch?v=65wwer7yXLg
Author: @Duckling
Theo đường dẫn video YouTube trong mô tả, mình tìm được kho lưu trữ GitHub của tác giả. https://github.com/tommypony326532/cia/blob/main

Kiểm tra file flag.txt thì thấy nội dung đã bị redact/xóa mất như mô tả

Tuy nhiên, Git luôn lưu lại toàn bộ lịch sử các lần commit. Kiểm tra commit history của flag.txt

Xem lại phiên bản commit trước đó, mình tìm được chuỗi Base64 chưa bị xóa

Giải mã chuỗi Base64 để lấy flag
Flag: v1t{t0mmy_scr1pt_k1dd13_1n1t}
Town Tour 3
What the three words? Flag format: v1t{word1_word2_word3} (3 words in English)
Author: @deroise2306
Hình ảnh đề bài chụp một cổng tam quan với kiến trúc và hoa văn cổ kính, phỏng đoán thuộc khu vực đền chùa tại Hà Nội hoặc cố đô

Lần theo các manh mối hoa văn và kiểu cổng tam quan, mình tìm được ngôi đền có kiến trúc tương đồng

Xác định đây là cổng Đông Cung Đền Và (Sơn Tây, Hà Nội)

Dùng Google Street View (chế độ xem phố) để xác định chính xác góc chụp

Tra cứu vị trí tọa độ này trên what3words để lấy 3 từ khóa tiếng Anh

Flag: v1t{wheezes_toppling_transacted}
Town Tour 4
More, more three words!!! Format: v1t{word1_word2_word3} (3 words in English)
Author: @Duckling
Quan sát góc bên phải của bức ảnh, ta thấy biển số nhà ghi chữ “làng cổ” cùng con ngõ lát gạch nghiêng và tường đá ong đặc trưng

Dựa vào manh mối này, mình tra cứu danh sách các Làng cổ nổi bật ở Việt Nam

So sánh kiến trúc tường đá ong và ngõ gạch, Làng cổ Đường Lâm (Sơn Tây, Hà Nội) có nét tương đồng nhất.
Dùng chế độ xem phố đi men theo các con ngõ trong làng, mình định vị được góc chụp chính xác

Góc ảnh trên Google Maps trùng khớp hoàn toàn với ảnh đề bài

Kiểm tra vị trí trên what3words để thu được 3 từ khóa

Flag: v1t{extensions_saleswomen_pitches}
Sun set
A quiet sunset, a calm lake, and a place where the sky feels a little closer than usual. It’s a shame there weren’t any ducks
Flag format: V1T{name_of_this_place} Ex: V1T{ho_linh_dam} or v1t{linh_dam_lake} both language work
Author: @Jayce
Phân tích bức ảnh, ta có các đặc điểm nhận dạng nổi bật:
- Cây cầu uốn cong bắc ngang hồ.
- Bệ ngắm cảnh hình tròn nối với bờ hồ qua thân cầu.
- Khoảng đất hình chữ nhật vươn ra lòng hồ (quảng trường ven hồ)

Ngoài ra, lan can cầu có các thanh dọc sơn màu đỏ còn mặt cầu sơn màu xanh lam đặc trưng

Tìm kiếm các công viên ven hồ tại các Khu đô thị mới ở Hà Nội

Tại khu đô thị Dương Nội (Hà Đông), Công viên Thiên văn học có hồ nước và cây cầu hội tụ đầy đủ tất cả các chi tiết trên

Đối chiếu lại qua Google Street View để khẳng định vị trí chính xác

Tên địa điểm chính là đáp án của flag
Flag: V1T{cong_vien_thien_van_hoc}
Naive John
John is just like many people online: one username, one password, and way too many places to reuse it.
He goes by the username:
quackyjohn42067
Some people scatter their accounts everywhere. Others collect everything into a single flashy bio page, usually with a Discord presence and enough “e-gangster” . He talk about guns lol energy to scare absolutely nobody.
John left a locked note somewhere in his little internet shrine. Find the note, figure out what password he probably reused, and recover the flag.
His password hash: 9a6219cd940a3025b0f1773886c507a4dfee3a3f
Author: @Duckling
Trong phần mô tả đề bài có nhắc tới từ khóa guns lol và username quackyjohn42067, mình truy cập trang cá nhân tại đường dẫn guns.lol/quackyjohn42067

Trang này cung cấp thông tin cá nhân của John và một đường dẫn chứa ghi chú bị khóa mật khẩu

Đề bài cũng cung cấp sẵn chuỗi hash SHA-1 mật khẩu mà John hay tái sử dụng (9a6219cd940a3025b0f1773886c507a4dfee3a3f). Sử dụng dịch vụ Hashes.com để tra cứu và bẻ khóa hash

Dùng mật khẩu vừa crack được để mở khóa ghi chú và thu được flag


Flag: v1t{1113g41_051n7_15_7h3_n3w_m3t4_41ght}
Misc
Classless
Ever learnt OOP? If yes? Good, now forget what a class is xD
Author: @n4n4s1
Đề bài cung cấp file thực thi ELF 64-bit objectvm và thư mục samples/ chứa các file .bbl. Nội dung các file này là một chuỗi Base64, thử đưa chuỗi vào CyberChef với công thức From Base64 và Zlib Inflate (với file 04_denied.bbl)

Kết quả giải nén ra định dạng JSON định nghĩa một hệ thống hướng đối tượng đa ngôn ngữ (CPP, JAVA, PY) bao gồm classes, objects, vtable và entry.
Chạy thử objectvm với các file mẫu:
00_hello.bbl: in rahello from objectvm01_interface.bbl: in rainterface Greeter: yes02_mro.bbl: in raresolved class: Cat03_dispatch.bbl: in radispatch slot 7: allow04_denied.bbl: in raVault denied: verifier
Mở objectvm trong IDA Pro và nhấn Shift + F12 để mở cửa sổ Strings. Lọc từ khóa Vault, ta thấy ngay 3 chuỗi thông báo lỗi nằm trong section .rodata

Click đúp vào một trong các chuỗi trên, nhấn X (Cross-reference) để nhảy đến vị trí gọi trong hàm main và nhấn F5 để xem mã giả Decompile.
Nếu object đầu vào có trường __task__, VM chỉ thực thi các nhánh kiểm thử mẫu (hello, interface, mro)

Ngược lại, nếu không có trường __task__ (như file 04_denied.bbl), đối tượng sẽ đi vào quy trình xác thực plugin qua 3 tầng kiểm tra tương ứng với 3 nhánh else


Các điều kiện kiểm tra gồm:
- Verifier (
line 498): Bị từ chối sẽ in raVault denied: verifier. Yêu cầu class contract của object phải có phương thức tênallowởslot 7với quyền truy cậppublic. - Resolver (
line 493): Bị từ chối sẽ in raVault denied: resolver. Yêu cầu tên class phân giải runtime phải làTrustedPlugin(ở04_denied.bblđã đạt điều kiện nhờ"fields": {"__class__": "TrustedPlugin"}). - Dispatcher (
line 488): Bị từ chối sẽ in raVault denied: dispatcher. Yêu cầu khi thực thi phương thức tại slot 7 thìbodyphải trả về chuỗiallow.
Khi vượt qua cả 3 tầng kiểm tra, vòng lặp while ( v81 != (char *)&unk_134C5 ); được thực thi. Vòng lặp duyệt qua các byte bắt đầu từ unk_134A0 đến unk_134C5, XOR từng byte với 0x37 (*v81 ^ 0x37), sau đó in chuỗi kết quả ra std::cout (line 501). Chuỗi này chính là Flag.
Kiểm tra vùng nhớ unk_134A0 trong tab IDA View-A (nhấn G gõ 134A0), ta thấy mảng 37 byte dữ liệu bị mã hóa

Trong file này tác giả đặt tên class là Almost và method ở slot 7 là open thay vì allow:
1 | {"name": "open", "slot": 7, "visibility": "public", "body": "allow"} |
Do tên method là open nên Tầng 1 bị từ chối (Vault denied: verifier). Mình chỉ cần đổi tên method thành allow và cập nhật vtable tương ứng, sau đó nén zlib và base64 lại:
1 | import base64 |
Chạy script trên, objectvm vượt qua cả 3 tầng kiểm tra và in ra flag

Flag: v1t{trilingual_vtable_babel_6f01a2c9}
Atari 2600
Can you get that prize ?
Author: @Rawr
File v1t.bas.bin dài 4096 bytes (4 KB) là một ROM game Atari 2600 viết bằng batari Basic. Khi mở file trong IDA với vi xử lý MOS 6502 và đưa vùng nhớ về dải $F000, mình kiểm tra các byte cuối của file (địa chỉ FFFC - FFFF) để tìm Reset Vector

Tại đây ta thấy vector chứa giá trị 00 F0, trỏ về địa chỉ khởi động của chương trình là $F000.
Nhảy về địa chỉ $F000 và nhấn C để chuyển các byte thô thành mã lệnh assembly

Để tìm nhanh đoạn code xử lý chiến thắng, mình dùng tính năng Binary Search (Alt + B) để tìm chuỗi hex A9 76 (lệnh LDA #$76 tương ứng với ký tự 'v' trong prefix v1t)

IDA đưa mình đến ngay đoạn mã xử lý tại loc_F4EC

Tại đây, chương trình kiểm tra điều kiện thắng (BIT 7, BPL loc_F504). Nếu điều kiện thỏa mãn, game sẽ gán cờ $D6 = 1 và nạp 3 ký tự điểm số ASCII lần lượt là 't', '1', 'v' vào các thanh ghi $95, $94, $93 (tạo thành prefix v1t). Ngay phía dưới tại loc_F50A, chương trình gọi subroutine sub_F562 để vẽ phần còn lại của flag.
Nhảy vào hàm sub_F562

Hàm này liên tục nạp trạng thái pixel (LDX #0), tọa độ dòng Y (LDY), tọa độ cột X (LDA) và gọi hàm sub_F278 để bật các điểm ảnh trên màn hình.
Thay vì ngồi đọc từng tọa độ bằng tay, mình dùng Python để quét toàn bộ pattern gọi hàm vẽ pixel từ offset 0x0562 cho đến lệnh RTS (0x60):
1 | with open(r"v1t.bas.bin", "rb") as f: |
Chạy script trên terminal để in ra ma trận điểm ảnh

Chia ma trận theo từng ký tự font 3x3 (khoảng cách 1 cột):
1 | #.# .#. ### .## ### ... ### ##. |
Ghép lại ta thu được flag hoàn chỉnh
Flag: v1t{o_o}