Mở đầu
Tiếp nối loạt bài viết hướng dẫn sử dụng Cheat Engine cơ bản, bài viết này mình sẽ writeup các thử thách trên nền tảng Hackthebox trong mục GamePwn: https://app.hackthebox.com/challenges?category=11
Vì CE chưa có phiên bản cho linux nên chúng ta chỉ có thể chọn các câu đố cho hệ điều hành Windows mà thôi. Vậy ta cùng thực hành ứng dụng CE giải quyết các challenge này nhé.
CubeMadness1
Đề bài là một game đồ họa đơn giản, nhiệm vụ của ta là chạm vào các Icon greenbox để tăng điểm, nhưng nếu chơi theo cách thông thường thì dù ăn hết các box có thể ta cũng không thể đạt tới điểm mục tiêu là 20 điểm
Dụng ý người ra đề rõ ràng là muốn chúng ta làm cách nào đó để đạt được số điểm 20 này. Vẫn như thường làm, ta gắn CE vào process của CubeMadness1 và scan địa chỉ của số điểm hiển thị trên màn hình của game thôi. Khi đã tìm ra địa chỉ thì sửa Value thành 20 là flag xuất hiện. Challenge này rất đơn giản nhằm mục đích để ta làm quen và khởi động thôi.
CubeMadness2
Mở đề lên thì ta thấy game giống y hệt challenge CubeMadness1, mình vẫn thử các bước như CubeMadness1 thì nhận ra không thể sửa Value của điểm hiển thị trên màn hình như bài trước nữa. Cụ thể là khi tìm địa chỉ lưu giá trị điểm của CubeMadness2 thì mình tìm được 2 địa chỉ như hình dưới, nhưng khi thử sửa cả 2 value của 2 địa chỉ tìm được thì giá trị vẫn hiển thị như cũ.
Mục tiêu thì vẫn như CubeMadness1, nhưng ta đang bị kẹt ở bước không thể modify giả trị điểm. Vậy đầu tiên ta sẽ tìm hiểu nguyên nhân tại sao khi ta sửa Value mà nó lại không thay đổi? Khi ta sửa Value để ý thấy CE cũng không báo lỗi gì cả, game CubeMadness2 cũng không bị crash hay bất thường gì, suy ra việc ta sửa value trên CE đã thực hiện được nhưng lại bị game ghi đè lại. Theo suy đoán đó, ta tìm đoạn code thay đổi giá trị của điểm bằng cách chuột phải vào địa chỉ tìm được chọn Find out whats write to thís address
. Kết quả đã xác nhận suy đoán của mình là đúng, game luôn chạy một đoạn mã để liên tục cập nhật giá trị điểm hiển thị trên màn hình.
Thử replace đoạn code này thành do nothing
thì mình đã có thể sửa điểm hiển thị trên game. Nhưng khi sửa thành 20 và ăn một box thì điểm hiển thị đã là 20/20 và flag vẫn chưa xuất hiện. Vậy là challenge yêu cầu ta phải sửa được giá trị của địa chỉ còn lại chính là bộ đếm số box thực mình ăn được chứ không phải chỉ là số điểm hiển thị trong game.
Đoạn code write địa chỉ mục tiêu là mov [rbx+24],edx
, mình thử sửa edx thành 20 thì game bị crash, không thể sửa bằng cách fix cứng như này rồi.
Đến đây thì ta phải chịu khó đọc code assembly để hiểu logic cập nhật giá trị điểm của game và debug thôi. Logic cập nhật điểm tựu chung lại là khi ta ăn được 1 box thì game sẽ thực hiện tính toán trên một biến ẩn nào đó rồi ghi kết quả số điểm vào thanh ghi edx rồi mới gán giá trị edx vào biến score. Đoạn code chính quyết định giá trị điểm như sau:
lea rsi,[rbx+20]
mov rdx,[rax+000000B8]
mov eax,6208CECB
imul [rdx]
sar edx,09
mov eax,edx
shr eax,1F
add edx,eax
mov [rsi],edx
cmp [rbx+24],edx
je GameAssembly.dll+73FEFE
Vấn đề là ta tìm biến ẩn đó như thế nào. Dù có các công cụ AI giải thích ý nghĩa các dòng code assembly nhưng tổng thể logic vẫn khá khó với những người không chuyên về assembly code. May mắn là CE cho phép ta có thể set breakpoint và debug ứng dụng. Mình thử set breakpoint tại dòng imul [rdx]
quan sát thấy thanh ghi rdx sau khi chạy dòng code mov rdx,[rax+000000B8]
luôn là một địa chỉ cố định, kể cả sau khi ta ăn một box, như hình dưới thì địa chỉ đó là 16D7CEA2A60
Để tìm hiểu xem game sử dụng địa chỉ này như thế nào, mình Add Address Manually
thêm địa chỉ 16D7CEA2A60
vào cửa sổ address phía dưới của CE sau đó chọn Find out whats write to this address
. Qua game ăn 1 box và tìm thấy đoạn code add [rcx],00000539
.
Ý nghĩa đoạn code này là sau khi ta ăn 1 box thì tăng giá trị thanh ghi rcx thêm 0x539 = 1337. Mình liên tưởng ngay đến giá trị điểm của game và test thử thì thấy giá trị của 16D7CEA2A60
luôn bằng score*1337
. Vậy thay vì thay đổi trực tiếp điểm mình thay đổi giá trị của địa chỉ này bằng 20*1337=26740
thì game đã show ra flag.
Giới thiệu về các thanh ghi
Để hiểu rõ hơn về cách thức hoạt động của game và các thao tác mà chúng ta đã thực hiện ở thử thách CubeMadness2, hãy cùng tìm hiểu một số thanh ghi quan trọng trong CPU. Các thanh ghi này là nơi lưu trữ thông tin và dữ liệu mà CPU sử dụng để thực hiện các phép toán.
-
RAX (64-bit) / EAX (32-bit): Đây là thanh ghi chính để lưu trữ kết quả của các phép toán. EAX thường được sử dụng trong các phép toán số học.
-
RBX (64-bit) / EBX (32-bit): Thanh ghi này thường được dùng để lưu trữ dữ liệu hoặc địa chỉ trong bộ nhớ. Nó có thể được sử dụng để giữ giá trị của các biến.
-
RCX (64-bit) / ECX (32-bit): Thanh ghi này thường được sử dụng làm thanh ghi đếm, đặc biệt trong các vòng lặp và phép toán chuỗi.
-
RDX (64-bit) / EDX (32-bit): RDX thường được sử dụng để lưu trữ tham số cho các hàm, đặc biệt là khi gọi hàm. Nó cũng có thể chứa kết quả của các phép toán phức tạp.
-
RSI (64-bit) / ESI (32-bit): Đây là thanh ghi nguồn, thường được sử dụng để trỏ đến vùng nhớ nơi chứa dữ liệu cần xử lý.
-
RDI (64-bit) / EDI (32-bit): Thanh ghi này thường được sử dụng như thanh ghi đích, lưu trữ địa chỉ của dữ liệu mà chúng ta muốn ghi vào.
-
RSP (64-bit) / ESP (32-bit): Đây là thanh ghi con trỏ ngăn xếp, giúp quản lý ngăn xếp của chương trình, lưu trữ địa chỉ của phần tử tiếp theo trong ngăn xếp.
-
RBP (64-bit) / EBP (32-bit): Thanh ghi này thường được sử dụng để lưu trữ địa chỉ của khung ngăn xếp hiện tại, giúp theo dõi các biến cục bộ trong hàm.
Việc nắm rõ các thanh ghi này sẽ giúp bạn hiểu rõ hơn về cách game quản lý và cập nhật các giá trị trong quá trình chơi, giúp cho việc đọc hiểu code assembly dễ dàng hơn. Điều này rất quan trọng để thực hiện các thao tác hack hiệu quả và đạt được kết quả như mong muốn.
Kết luận
Như vậy, qua hai thử thách CubeMadness1 và CubeMadness2, chúng ta đã có cơ hội thực hành với cách sử dụng Cheat Engine để can thiệp vào các giá trị trong game. Bài học rút ra từ CubeMadness1 là chúng ta có thể dễ dàng chỉnh sửa điểm số hiển thị, trong khi ở CubeMadness2, thách thức lớn hơn đòi hỏi chúng ta phải tìm hiểu sâu hơn về logic cập nhật điểm và sử dụng các kỹ thuật debug nâng cao.
Việc phân tích mã máy và hiểu được cách mà game xử lý các giá trị là điều cần thiết để thành công trong những thử thách khó hơn. Sự kiên nhẫn và kỹ năng giải quyết vấn đề sẽ giúp bạn trở thành một hacker game hiệu quả hơn. Hy vọng rằng bài viết này đã giúp các bạn có thêm kinh nghiệm thực tiễn và hứng thú hơn với thế giới hack game. Hãy tiếp tục khám phá và chinh phục những thách thức khác trên Hackthebox nhé!