Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 13

#Crackme1

Trước hết ta sẽ kiểm tra bằng DIE , ta thấy được entry point là 004013bf

Mở x32dbg và xác nhận entry point


Khi run tiếp thì sẽ ra cửa sổ nhập pass, ta sẽ break ở đó. Ta tìm các string references
và tìm location của chuỗi thông báo “try again”:

Phía trên có thông báo congrats - thông báo mà ta muốn hiển thị

Ta có thể thấy 1 tham chiếu GetDIgItemTextA để lấy item từ text nhập pass.

Dòng 00401139 có 1 jump, dựa theo dòng test eax ở trên để so sánh với “cr4ckingL3ssons”, nếu eax = 0
thì dòng congrats được hiển thị, ngược lại sẽ nhảy đến thông báo sai. Như vậy pass là cr4ckingL3ssons.

Nếu ta muốn luôn hiển thị well done, ta cần sửa giá trị của eax thành 0 để luôn đúng.
#Crackme 2
Ta chạy và có dialog hiện lên:

Ta sẽ đặt breakpoint và đi vào hàm (step into):


Ở đây ta thấy nó đang đọc file keyfile.txt và hàm CreateFileA. Đọc định nghĩa hàm, hàm trả về false nếu
bị lỗi khi mở file.

Dòng 00401049 có lệnh move từ eax (là giá trị của CreateFileA) vào esi. Dòng 0040104B cố gắng so sánh
esi với FFFFFFFF (-1), là xác định xem liệu mở file có lỗi hay không (điều này thể hiện qua dòng 0040105F
(lệnh ReadFileEx).

Như vậy, ta có thể giải quyết bằng cách tạo file keyfile.txt và cho tên bất kì, sau đó mở lại file để check:

#Crackme 3
Ở dòng 00401029 có 1 jump dựa theo việc so sánh ở dòng 0040101D để hiện
messagebox ở dòng 00401039.
Ta sẽ sửa jne thành je để bypass box đầu.

Ta đã skip box đầu, tiếp tục tìm vị trí box 2.

Giữa MessageBoxA và PostQuitMessage, ta cần jump đến vị trí đó, nhưng do không
có lệnh jump sẵn nên ta cần set jump command. Ta sửa dòng 0040110D thành push
0x401121, và pass được box 2:
Ở đoạn registered, ta thấy dòng 004010D8 có lệnh je dựa trên lệnh compare eax ngay
trên. Ta sửa thành jne để nó không jump xuống dòng unregistered (cho giá trị khác
nhau).

#Crackme 4
Đi đến dòng hiển thị hộp thoại, step into vào hàm
Sau khi ta step into:

Dòng 00401056 lấy giá trị ngày từ ecx, ecx được nạp vào từ dòng 0040103D, trừ với
ngày hiện tại ở dòng 00401042 (eax lấy từ GetLocalTime, sau lệnh
CreateDialogProgramA) và thực hiện test.
Ở dòng 0040103D, ta chỉ cần sửa 1E thành 1 giá trị lớn bất kì, ví dụ 2000.
Sau khi patch file ta đã gia hạn được số ngày trial như hình bên dưới:

#Crackme 5
Tìm vị trí của dòng try again và kéo lên:
Ta thấy hàm GetDlgItemTextA để lấy text từ message box. Đặt breakpoint ở đó và
xem xét bên dưới:

Sau khi step over đến dòng 0040116A, ta thấy chuỗi %s-%d… - đó là định dạng
chuỗi – số, có thể đây là chỗ để generate key. Chạy them vài bước nữa, key sẽ được
tạo ra, đó là sự kết hợp của tên người dùng và chuỗi số cố định, là 32571021.
#Crackme 6
Ta tìm đến dòng thông báo thứ nhất:

Có 1 lệnh jump nhảy đến do chưa registered và hiện các thông báo register như trên.
Do đó ta fill with nop từ dòng 004010A7 đến 00401086 (để không hiển thị dialog
nữa):
Để thay đổi trạng thái khi ấn re-check, ta cần tìm đoạn not registered:

Đặt breakpoint tại các điểm đó và chạy thử:

Khi chạy đến breakpoint 1, ấn re-check sẽ nhảy sang breakpoint 2:

Ta đặt breakpoint ở lệnh je. Nhận thấy là nó sẽ nhảy vào thông báo Nag not removed,
và ZF cần được đổi sang 0:
Nhưng đến đây nó lại đi vào 1 lệnh jump khác, và “jump is not taken” cho thấy nó sẽ
không nhảy đến đó, vì thế cần phải cho phép jumpo bằng cách đổi ZF thành 1, khi đó
đã thay đổi được trạng thái:

1. Crackme #7:
Ta tìm vị trí của mục Registered:

Bài lab gợi ý đến eax value. Ta nhìn thấy cả eax và ecx đều nhận là 5, và khi trừ đi
(lệnh sub) thì eax = 0, dẫn đến kết quả phép test eax, eax là đúng và dẫn đến dòng
unregistered. Do đó, phải cho eax và ecx khác nhau bằng cách sửa 1 trong 2, ví dụ sửa
ecx thành 6:
Khi đó logic thay đổi và nó sẽ qua dòng registered:

#Crackme 8
Tìm đến vị trí registered:

Ta thấy có 1 lệnh jump dựa trên lệnh compare giá trị dòng 7260D0 và 0, nếu bằng
nhau thì ZF = 1 và lệnh nhảy thực hiện. Ta cần ngăn chặn việc jump bằng cách thay
đổi giá trị dòng 7260D0 thành 1 số khác 0:
Kết quả:

You might also like