Skip to content

Latest commit

 

History

History
102 lines (53 loc) · 5.83 KB

File metadata and controls

102 lines (53 loc) · 5.83 KB

Overview

  • Points : 100
  • Tags : game

Description

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.

Hints :

  • Use 'w','a','s','d' to move around.
  • There may be secret commands to make your life easy.

Solutions

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 :

image

Mở file gamevới IDA :

image

giao diện ban đầu khi mở :

image

Nhấn F5 sẽ giúp chuyển về pseudocode (C) có thể dễ nhìn nhận hơn :

image

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 :

image

Đoạn code cần chú ý :

image

Để 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 :

image

để ý vào hàm move_player : ngoài 4 phím di chuyển sẽ có 2 phím khác cần chú ý :

image

image

Ở đây :

  • l -> dùng gán một giá trị vào player_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 :

image

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 29local_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_2local_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 :

image

image

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 }

image image

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>

image

Sử dụng gdb-gef để có thể phân tích rõ hơn :

image

Kết nối lên server để lấy flag thực tế :

image

flag thu được : picoCTF{gamer_m0d3_enabled_3aa88304}