Đề bài
Whoa, duuuudes! HelloWorld, righteous!
I was cruisin' the EXE lookin' for the flag when I totally got lost in this gnarly place, man . . . .
Gimme a ping and help me find that flag, little dudes! Cowabunga!
Dịch
Whoa, mấy anh em! HelloWorld, tuyệt đỉnh luôn!
Tôi đang lướt trong file EXE để tìm flag thì bị lạc vào một chỗ siêu quái đản, bro…
Ping tôi cái và giúp tôi tìm flag với, mấy nhóc! Cowabunga!
Detech It Easy
Sử dụng DIE để phân tích xem file Challenge.exe được code bằng gì

Thử sử dụng Ghidra để đọc xem sao
Ghidra
Sau khi dùng Ghidra để mở file Challenge.exe thì tôi không thấy gì lắm, không có hàm nào đặc biệt, hàm main cũng không dẫn đến đâu nên tôi chuyển hướng phân tích
File
Mở hết tất cả các folder của đề cho ra thì tôi thấy có 1 file dll trông cũng khá sú là Assembly-CSharp.dll
Nhìn thì cũng có thể biết file này code bằng C# nhưng anh em cũng có thể dùng DIE để cho chắc cú

dnSpy
Công cụ anh em sẽ dùng để đọc và chỉnh sửa file C# sẽ là dnSpy, IDA với Ghidra sẽ không có khả năng đọc và chỉnh sửa file C# mạnh như dnPsy
Sau khi tìm một hồi thì tôi thấy 1 class là Shellmove có hàm Update như sau
// Token: 0x06000004 RID: 4 RVA: 0x00002074 File Offset: 0x00000274
private void Update() {
Vector3 position = base.gameObject.transform.position;
if (Input.GetKey(KeyCode.Delete))
{
SceneManager.LoadScene("Main");
}
if (this.Len(position) >= 50.0)
{
this.TransError();
}
if (position == new Vector3(65535f, 65535f))
{
this.TransFlag();
}
if (!this.ismoving && this.canmove)
{
Vector3 zero = Vector3.zero;
if (Input.GetKeyDown(KeyCode.W))
{
zero = new Vector3(0f, this.grid);
this.walksound.Play();
}
if (Input.GetKeyDown(KeyCode.S))
{
zero = new Vector3(0f, -this.grid);
this.walksound.Play();
}
if (Input.GetKeyDown(KeyCode.D))
{
zero = new Vector3(this.grid, 0f);
this.walksound.Play();
}
if (Input.GetKeyDown(KeyCode.A))
{
zero = new Vector3(-this.grid, 0f);
this.walksound.Play();
}
if (zero != Vector3.zero)
{
base.StartCoroutine(this.MoveSmooth(zero));
}
}
}
Phân tích
Để phân tích chương trình này thì cũng khá đơn giản thôi
Đây là một đoạn script Unity (MonoBehaviour) gắn vào GameObject, xử lý cập nhật mỗi frame trong hàm Update() (Unity gọi hàm này tự động). Nó chịu trách nhiệm:
- Reset lại scene nếu người chơi bấm Delete
- Kiểm tra điều kiện đặc biệt (gọi hàm ẩn flag, error)
- Điều khiển di chuyển nhân vật theo lưới (grid movement) bằng phím WASD
Đi sâu vào từng hàm thì sẽ như sau
- Lấy ra vị trí hiện tại
Vector3 position = base.gameObject.transform.position;
Lưu tọa độ hiện tại của GameObject vào biến position
base.gameObject là GameObject chứa script này
- Reset Game sau khi ấn Delete
if (Input.GetKey(KeyCode.Delete))
{
SceneManager.LoadScene("Main");
}
Nếu người chơi nhấn phím Delete, thì load lại scene Main (reset game)
- Kiểm tra tọa độ
if (this.Len(position) >= 50.0)
{
this.TransError();
}
Hàm Len(position) nhiều khả năng trả về độ dài vector / khoảng cách từ gốc (0,0,0)
Nếu đối tượng đi quá xa >= 50 đơn vị, gọi TransError() → Crash Game và phải chơi lại
- Kiểm tra di chuyển
if (!this.ismoving && this.canmove)
{
Vector3 zero = Vector3.zero;
if (Input.GetKeyDown(KeyCode.W))
{
zero = new Vector3(0f, this.grid);
this.walksound.Play();
}
if (Input.GetKeyDown(KeyCode.S))
{
zero = new Vector3(0f, -this.grid);
this.walksound.Play();
}
if (Input.GetKeyDown(KeyCode.D))
{
zero = new Vector3(this.grid, 0f);
this.walksound.Play();
}
if (Input.GetKeyDown(KeyCode.A))
{
zero = new Vector3(-this.grid, 0f);
this.walksound.Play();
}
if (zero != Vector3.zero)
{
base.StartCoroutine(this.MoveSmooth(zero));
}
}
Kiểm tra các phím WASD các thứ và cộng vào tọa độ gốc
- Gọi Flag
if (position == new Vector3(65535f, 65535f))
{
this.TransFlag();
}
Có thể thấy nếu như chúng ta đến được vị trí (x, y) = (65535, 65535) thì có thể lấy được Flag
Chỉnh sửa
Ở bài này tôi sẽ sử dụng cách là chỉnh sửa trực tiếp vào chương trình, khiến cho nó gọi ngay ra Flag mà không cần chơi hay làm gì cả
Đơn giản là anh em sẽ chỉnh sửa hàm Update như sau
private void Update()
{
this.TransFlag();
}
Như này thì khi mở chương trình lên nó sẽ gọi thẳng đến hàm TransFlag() và lấy được Flag
Flag
fwectf{K494ku_no_Ch1k4r4_t7e_5u63h!}
'WriteUp > RE' 카테고리의 다른 글
| Square Cipher - BuckeyeCTF 2025 (0) | 2025.11.09 |
|---|---|
| Python 0bf (0) | 2025.11.02 |
| [RE] Clockwork - EnigmaXplore 3.0 (0) | 2025.10.20 |
| [RE] S0urc3 - POC CTF 2025 (0) | 2025.10.13 |
| [RE] Dsp - POC CTF 2025 (0) | 2025.10.13 |
