Professional Documents
Culture Documents
Crackinglessons
Crackinglessons
Trước hết ta sẽ kiểm tra bằng DIE , ta thấy được entry point là 004013bf
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:
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.
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:
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ả: