Patching Binaries bằng Ghidra

Ghidra

Trong bài trước tôi đã hướng dẫn các bạn làm sao để dịch ngược phần mềm bằng Ghidra. Trong bài viết này tôi sẽ hướng dẫn làm sao để chỉnh sửa lại tệp nhị phân và thay đổi luồng thực thi hay còn gọi là “patching binary” bằng công cụ Ghidra. Để tìm hiểu cách sử dụng phần mềm cơ bản bạn có thể xem qua bài viết ở trên.

Luồng thực thi trong Assembly bạn có thể tham khảo qua bài viết này của tôi Assembly Flags.

Tôi sẽ ví dụ bằng một đoạn chương trình C. Nhận thông tin người dùng nhập từ bàn phím, và nếu pcode = code (4477) thì sẽ hiển thị ra chuỗi “Ok, this is your bank account.” còn nếu không “Wrong pin, bye!“.

// bankdetails.c
#include <stdio.h>

int main(int argc, char *argv[])
{
  int code = 4477;
  int pcode;
  printf("Hello, please enter your 4 pin code: ");
  scanf("%d", &pcode);
  if (code == pcode)
  {
    printf("Ok, this is your bank account.\n");
  }
  else
  {
    printf("Wrong pin, bye!\n");
  }
  return 0;
}

Biên dịch đoạn code trên bằng cách sử dụng gcc.

gcc bankdetails.c -o bankdetails

Sau khi biên dịch xong chúng ta sẽ có file ELF (Executable and Linkable Format) tên bankdetails (ở đây tôi sử dụng hệ điều hành Ubuntu 20.04).

Nhấn “OK” để tiếp tục.

Tại sidebar bên trái Symbol Tree -> Functions -> main để hiển thị code assembly trong cửa sổ Listing. Tại địa chỉ 001011fe là so sánh code với pcode của người dùng nhập vào.

// code C
  if (code == pcode)
  {
    printf("Ok, this is your bank account.\n");
  }

// Assembly
001011fe 39 45 f4 CMP dword ptr [RBP + local_14], EAX
00101201 75 0e    JNZ LAB_00101211

Nếu kết quả CMP của local_14 với EAX (0x117d) mà không bằng nhau sẽ nhảy tới label LAB_00101211 và hiện ra chuỗi “Wrong pin, bye!“. Nếu bằng nhau sẽ tiếp tục đi xuống dưới và hiển thị ra chuỗi “Ok, this is your bank account.

Để chỉnh sửa lại luồng thực thi của chương trình có rất nhiều cách, trong trường hợp này tôi sẽ làm như sau:

Tại địa chỉ 00101201 bạn nhấn chuột phải chọn Patch Instruction hoặc nhấn tổ hợp phím Ctrl + Shift + G.

Cách 1: Xóa label LAB_00101211 và sửa lại cú pháp JNZ thành NOP, như vậy sau khi so sánh xong thì chương trình sẽ tiếp tục chuyển xuống các instruction tiếp theo, câu lệnh nhảy đã bị xóa bỏ.

Cách 2: Sửa lệnh nhảy JNZ thành JZ, chỉ cần nhập pcode khác 4477 thì sẽ luôn hiển thị ra chuỗi “Ok, this is your bank account.“.

Sau khi chỉnh sửa xong trên thanh công cụ chọn File -> Export Program… hoặc nhấn phím O.

Sau đó nó sẽ hiển thị ra thông báo thông tin export.

Vì tôi đang muốn patching file ELF lên tôi sẽ chọn format là ELF, trong trường hợp bạn sửa các file trên hệ điều hành khác thì chọn đúng định dạng là được.

Sau khi xong các bạn chọn “OK“. Nó sẽ hiện thêm thông báo các thông tin của file mới tạo, bạn cũng chỉ cần nhấn “OK“.

Chạy thử lại file vừa đã chỉnh sửa xong. Nếu chạy trên Ubuntu hoặc MacOS nhớ cấp quyền để thực thi file.

chmod +x filename

Như vậy là bạn đã chỉnh sửa file binary thành công. Hy vọng bài viết này hữu ích với bạn.

Tham khảo:

  1. https://materials.rangeforce.com/tutorial/2020/04/12/Patching-Binaries/
  2. https://rderik.com/blog/using-radare2-to-patch-a-binary/