Phân tích và giải mã các bài toán reverse engineering trong BUUCTF

Giới thiệu về quá trình phân tích

Bài viết này sẽ hướng dẫn cách phân tích và giải mã các bài toán reverse engineering từ cuộc thi BUUCTF. Mỗi bài toán đều yêu cầu sử dụng các công cụ như IDA Pro, DIE, và kỹ năng đọc mã giả (pseudo-code) để tìm ra flag.

Bài 1: Easy Reverse

Đầu tiên, ta kiểm tra tệp tin bằng công cụ DIE, phát hiện rằng đây là một chương trình 64-bit và không có shell. Tiếp theo, mở file bằng IDA Pro và nhấn phím F5 để xem mã giả. Từ đó, dễ dàng nhận thấy flag là:

flag{this_Is_a_EaSyRe}

Bài 2: Reverse1

Tương tự bài trước, dùng DIE để kiểm tra thông tin cơ bản của tệp tin. Sau đó, mở bằng IDA Pro và sử dụng tổ hợp phím SHIFT + F12 để liệt kê tất cả các chuỗi in được. Ta phát hiện chuỗi "this is the right flag".

Nhấn đúp chuỗi này và sử dụng lệnh CTRL + X để tìm địa chỉ tham chiếu đến chuỗi. Nhấn F5 để chuyển sang chế độ pseudo-code. Dựa vào đoạn mã sau:

if (!strncmp(Str1, Str2, strlen(Str2))) {
    printf("this is the right flag!\n");
} else {
    printf("wrong flag\n");
}

Chuỗi cần tìm chính là Str2. Quan sát kỹ hơn, thấy rằng ký tự 'o' đã được thay thế thành '0'. Vì vậy, flag cuối cùng là:

flag{hell0_w0rld}

Bài 3: Reverse2

Sau khi xác định cấu trúc của tệp tin qua DIE, mở bằng IDA Pro và tiếp tục sử dụng tổ hợp phím SHIFT + F12. Lần này, chuỗi quan trọng là "input the flag". Theo dõi chuỗi này bằng lệnh CTRL + X và chuyển sang pseudo-code bằng F5.

Qua đoạn mã sau:

for (i = 0; i <= strlen(flag); ++i) {
    if (flag[i] == 'i' || flag[i] == 'r') {
        flag[i] = '1';
    }
}

Thấy rằng các ký tự 'i' và 'r' trong chuỗi flag đã bị thay thế thành '1'. Do đó, flag chính là:

flag{hack1ng_fo1_fun}

Bài 4: File Inside

Kiểm tra tệp tin với DIE, phát hiện đây là một chương trình 32-bit không có shell. Sử dụng IDA Pro để phân tích sâu hơn. Ban đầu, cố gắng tìm kiếm chuỗi flag bằng cách sử dụng SHIFT + F12, nhưng kết quả thu được không hữu ích.

Sau khi phân tích thêm, nhận thấy biến v5 chứa giá trị tương ứng với flag. Nộp thử v5 và nhận được kết quả đúng:

flag{49d3c93df25caad81232130f3d2ebfad}

Bài 5: Happy New Year

Kiểm tra tệp tin bằng DIE, phát hiện có lớp UPX. Cần tiến hành giải nén lớp UPX trước khi phân tích. Sử dụng công cụ universal unpacker để xử lý.

Sau khi giải nén, mở tệp tin bằng IDA Pro và sử dụng các bước tương tự như trên. Đoạn mã quan trọng là:

strcpy(Str2, "HappyNewYear!");
printf("please input the true flag:");
scanf("%s", Str1);
if (!strncmp(Str1, Str2, strlen(Str2))) {
    puts("Correct flag");
} else {
    puts("Wrong flag");
}

Vì vậy, flag là:

flag{HappyNewYear!}

Bài 6: XOR Challenge

Phân tích tệp tin bằng DIE, phát hiện không có lớp bảo vệ nào. Mở bằng IDA Pro và tìm kiếm chuỗi quan trọng bằng cách sử dụng SHIFT + F12. Theo dõi chuỗi này bằng lệnh CTRL + X và chuyển sang pseudo-code bằng F5.

Đoạn mã liên quan:

for (i = 1; i < 33; ++i) {
    buffer[i] ^= buffer[i - 1];
}
if (!strncmp(buffer, global, 33)) {
    printf("Success");
} else {
    printf("Failed");
}

Từ đoạn mã này, ta biết rằng mỗi ký tự trong buffer đã được thực hiện phép XOR với ký tự trước nó. Sử dụng đoạn mã Python sau để khôi phục lại flag ban đầu:

data = [102, 10, 107, 12, 119, 38, 79, 46, 64, 17,
        120, 13, 90, 59, 85, 17, 112, 25, 70, 31,
        118, 34, 77, 35, 68, 14, 103, 6, 104, 15,
        71, 50, 79, 0]

result = chr(data[0])
for i in range(1, len(data)):
    result += chr(data[i] ^ data[i - 1])

print(result)

Kết quả thu được là:

flag{QianQiuWanDai_YiTongJiangHu}

Thẻ: IDAPro DIE ReverseEngineering BUUCTF xor

Đăng vào ngày 18 tháng 6 lúc 19:49