- Points : 100
- Tags :
game
Get the flag and reach the exit. Welcome to BabyGame! Navigate around the map and see what you can find! The game is available to download here. There is no source available, so you'll have to figure your way around the map.
- Use 'w','a','s','d' to move around.
- There may be secret commands to make your life easy.
Download file game
của bài cung cấp hoặc mình đã để nó ở đây : game
file nhị phân nên sẽ cần một số cung cụ để dịch ngược file , ở đây mình sẽ dùng IDA
và : Ghidra hoặc mở Ghidra
trên máy ảo Linux
.
Đầu tiên hãy kiểm tra bảo mật của file game
này bằng pwntools với câu lệnh checksec
:
Mở file game
với IDA
:
giao diện ban đầu khi mở :
Nhấn F5
sẽ giúp chuyển về pseudocode (C) có thể dễ nhìn nhận hơn :
Tìm kiếm một chút thì hàm win()
sẽ gọi file flag.txt
có thể chứa flag thực tế trên server :
Đoạn code cần chú ý :
Để chiến thắng trò chơi thì biến v6
cần khác 0 :
cụ thể sẽ nhìn rõ hơn nếu dùng Ghidra
:
để ý vào hàm move_player
: ngoài 4 phím di chuyển sẽ có 2 phím khác cần chú ý :
Ở đây :
-
l
-> dùng gán một giá trị vàoplayer_tile
từgetchar()
-
p
-> thắng trò chơi ( tự di chuyển đến đích và luôn thắng ).
chú ý vào hàm int_map
:
Có thể chuyển các số ghi vị trí sang decimal
để có thể thuận tiện quan sát.Ở đây :
Nếu local_10
bằng 29
và local_c
bằng 89
thì giá trị tại vị trí param_1 + 2699
sẽ được gán bằng 88
. Nếu local_10
bằng giá trị đầu tiên của param_2
và local_c
bằng giá trị thứ hai của param_2
thì giá trị tại vị trí local_c + param_1 + local_10 * 90
sẽ được gán bằng player_tile
. Trong các trường hợp còn lại, giá trị tại vị trí local_c + param_1 + local_10 * 90
sẽ được gán bằng 46
.
Có thể chú ý đến đây để biết rõ thêm :
hàm init_map()
xác nhận thứ tự tọa độ vị trí của người chơi, như đã trình bày chi tiết ở trên. Nó cũng hiển thị vị trí thoát là điều kiện thắng trò chơi, đó là người chơi phải di chuyển đến vị trí { 29, 89 }
chạy file game
trên local để kiểm chứng , từ tọa độ {29,89} di chuyển ra ngoài map sẽ gặp lỗi như hình 1 , cụ thể :
Lỗi phân đoạn là một loại lỗi cụ thể do truy cập bộ nhớ “không thuộc về bạn”. Đó là một cơ chế trợ giúp giúp bạn không làm hỏng bộ nhớ và gây ra các lỗi bộ nhớ khó gỡ lỗi. Bất cứ khi nào bạn gặp lỗi phân đoạn, bạn biết rằng mình đang làm sai điều gì đó với bộ nhớ – truy cập vào một biến đã được giải phóng, ghi vào phần chỉ đọc của bộ nhớ, v.v. Lỗi phân đoạn về cơ bản giống nhau ở hầu hết các ngôn ngữ khiến bạn gặp rắc rối với quản lý bộ nhớ, không có sự khác biệt chính giữa segfaults trong C và C++.
Vì vậy khi chuyển đến flag : 64
bằng phím a
cần sử dụng p
để giải quyết sẽ được như hình 2.
vị trí {0,-4} có được nhờ dòng :<underflows hàm của dòng này và viết vị trí người chơi trên local_aa4
-> điều kiện cho local_aa4
khác 0>
Sử dụng gdb-gef
để có thể phân tích rõ hơn :
Kết nối lên server để lấy flag thực tế :
flag thu được : picoCTF{gamer_m0d3_enabled_3aa88304}