---
# System prepended metadata

title: '**MIPS - AKASEC 2024**'
tags: [WriteupCTF]

---

# **MIPS - AKASEC 2024**

## Description

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

## Solution

Sau khi nhận được file, mình kiểm tra bằng lệnh `file` và biết được đây là 1 `Nintendo 64 ROM`

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

Mình có tìm thấy [Extension](https://github.com/zeroKilo/N64LoaderWV) của Ghidra hỗ trợ cho việc decompile file này ([How to use](https://www.youtube.com/watch?v=3d3a39LuCwc&ab_channel=WarrantyVoider))

Cài xong rồi, bắt tay vào decompile file này, mình tìm thấy có `correct!` và `wrong`. Mình khá chắc chỗ này sẽ là phần hiển thị khi sử dụng được cái file này :face_with_monocle: 

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

Tại đây, mình có thấy hàm `FUN_80010ed8` được gọi đến

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

Hàm này có thực hiện nhiệm vụ kiểm tra các giá trị tại 2 địa chỉ được truyền vào với độ dài là `0x1e`

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

Các giá trị tại địa chỉ thứ 2 được truyền vào

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

Quay lại hàm có chứa `correct!`, `wrong`, mình thấy gọi hàm `FUN_8000b200` được gọi trước khi gọi hàm so sánh. Hàm này sẽ thực hiện việc trả về các giá trị dựa theo input. Mình thấy được cá giá trị này sẽ độc lập với nhau, không có ảnh hưởng đến nhau.

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

Mình có tìm thấy [tài liệu](https://ultra64.ca/files/tools/DETAILED_N64_MEMORY_MAP.txt), và dễ thấy được key map đã được thay đổi sau khi mình kiểm tra hàm `FUN_8000b340`. Hàm này thực hiện chức năng lấy dữ liệu đầu vào từ bàn phím á.

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

Và cách dễ nhất là mình sẽ theo dõi xem khi mình nhập giá trị vào thì giá trị được lưu ở trong memory là gì. Tại description, author có gợi ý dùng `ares` nên mình sử dụng `ares`. Mình tìm thấy địa chỉ `270c8` tại `RDRAM` dùng để lưu giá trị sử dụng để so sánh

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

Thử vài lần, mình biết được giá trị nhập vào và sau khi xử lý sẽ được lưu tại địa chỉ `270b0` trong `RDRAM`. Và mình nhận ra mình có thể tùy ý thay đổi giá trị tại đây nên mình nhập luôn đống giá trị dùng để so sánh và được cái đống này

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

Và, kiểm tra, rồi lấy flag thôi

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

Flag: `akasec{m1ps_1s_c00l_l0l}`