Đây là một challenge thuộc thể loại Reverse. Link của challenge : https://ctflearn.com/challenge/368
Ở challenge này, file tải về là một file tên là bitecode.txt :
Giống như tên của challenge thì những dòng code trong file .txt này là Java bytecode. Java bytecode là một tập cáccâu lệnh dành cho Java Virtual Machine, khi một chương trình java được biên dịch thì bytecode được sinh ra. Java bytecode được hiểu mà mã máy dành cho JVM dưới dạng file .class
Mình tìm hiểu một số cấu trúc lệnh của java bytecode và phân tích được nội dung của code như sau:
Từ đó, có thể suy ra chức năng của hàm checkNum(int) có chức năng như sau, nhưng với code python :D
Để tìm được flag của challenge này, mình phải tìm được giá trị của tham số param0 sao cho hàm trả về True. Để có thể tìm được giá trị đó, mình nghĩ cách đơn giản nhất đó là brute force thôi, chắc là sẽ khá lâu để có kết quả. Vì vậy mình chọn cách tính tay :D
Ta có gọi param0 = x thì :
(x << 3) ^ (x^ 52502459) == -889275714
Rút gọn được thành : (x << 3) ^ x = 525024598 ^ -889275714
Chuyển về cơ số 16 :
(x << 3) ^ x = 0xd5b587e8 (1)
Ta thấy (x<< 3) có 3 bit 0 ở vị trị có trọng số nhỏ nhất nên từ đó ta có thể tìm được 3 bit ở vị trị có trọng số thấp nhất của x bằng cách XOR 3 bit có trọng số nhỏ nhất của số biểu diễn nhị phân của vế phải của (1).
Bây giờ có được 3 bit đầu tiên của x rồi, tiếp tục dịch trái 3 bit là sẽ có được 3 bit tiếp theo của số (x << 3). Ta lại tiếp tục các bước XOR và dịch bit như trên nhưng với các vị trí bit có trọng số lớn hơn.
Đến cuối cùng, mình thu được kết quả x = 0xaf5d12a8, chuyển về thập phân là giá trị 2942112424. Mình thử submit với flag CTFlearn{2942112424} và thất bại. Vậy là mình chuyển số trên về cơ số 2 và sau đó chuyển lại về cơ số 10 để lấy giá âm là của số nhị phân đó là -1352854872. Tiếp tục thử submit CTFlearn{-1352854872} và thành công :D