Posted by: dqtln Jan 1 2004, 09:47 AM Victim : Syllogism CrackMe #2 Tools : OllyDbg v1.09d Crack file : Syllogism-crackme2.exe Cracked by : dqtln site biw.rult.at dùng OllyDbg tìm đến thông báo lỗi , ta thấy như sau CODE 004013F7 |. E8 BA760000 CALL <JMP.&USER32.GetDlgItemTextA>; \GetDlgItemTextA =>đặt breakpoint 004013FC |. 6A 32 PUSH 32; /Count = 32 (50.) 004013FE |. 68 D1B54000 PUSH Syllogis.0040B5D1; |Buffer = Syllogis.0040B5D1 00401403 |. 6A 69 PUSH 69; |ControlID = 69 (105.) 00401405 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]; |hWnd 00401408 |. E8 A9760000 CALL <JMP.&USER32.GetDlgItemTextA>; \GetDlgItemTextA 0040140D |. E8 D6FEFFFF CALL Syllogis.004012E8 =>trace into 00401412 |. 85C0 TEST EAX,EAX 00401414 |. 75 18 JNZ SHORT Syllogis.0040142E 00401416 |. 6A 00 PUSH 0; /Style = MB_OK|MB_APPLMODAL 00401418 |. 68 ED914000 PUSH Syllogis.004091ED; |Title = "ERROR" 0040141D |. 68 C6914000 PUSH Syllogis.004091C6; |Text = "Please Deposit 25 cents and try again." bi giờ ta đến 004012e8 xem hàm kiểm tra serial CODE 004012E8 /$ 55 PUSH EBP ở đây có một số dòng 004012FF |. 50 PUSH EAX; |Arg1 00401300 |. E8 EB110000 CALL Syllogis.004024F0; \Syllogis.004024F0 =>trace into nếu thích 00401305 |. 83C4 0C ADD ESP,0C 00401308 |. 33F6 XOR ESI,ESI =>esi=0 0040130A |. EB 1E JMP SHORT Syllogis.0040132A 0040130C |> 8A0437 /MOV AL,BYTE PTR DS:[EDI+ESI] =>đưa từng ký tự chuỗi name vào al 0040130F |. 50 |PUSH EAX; /Arg1 =>đẩy từng ký tự lên stack 00401310 |. E8 83FFFFFF |CALL Syllogis.00401298; \Syllogis.00401298 =>trace into để xem mã hóa chuỗi name thành serial 00401315 |. 59 |POP ECX ở đây có một số dòng 00401349 |. E8 A2110000 CALL Syllogis.004024F0; \Syllogis.004024F0 0040134E |. 83C4 0C ADD ESP,0C =>nếu trace down đến đây ta sẽ thấy serial tương ứng với name bên cửa sổ Registers (FPU) , d ecx = serial đúng 00401351 |. 68 D1B54000 PUSH Syllogis.0040B5D1 ở đây có một số dòng 00401380 \. C3 RETN ta đến 00401298 xem sao CODE 00401298 /$ 55 PUSH EBP 00401299 |. 8BEC MOV EBP,ESP 0040129B |. 83C4 C8 ADD ESP,-38 0040129E |. 53 PUSH EBX 0040129F |. 56 PUSH ESI 004012A0 |. 57 PUSH EDI 004012A1 |. 8B5D 08 MOV EBX,DWORD PTR SS:[EBP+8] =>đưa từng ký tự chuỗi name vào ebx 004012A4 |. 0FBEF3 MOVSX ESI,BL =>đưa từng ký tự chuỗi name vào esi 004012A7 |. 56 PUSH ESI; /Arg1 004012A8 |. E8 FB2B0000 CALL Syllogis.00403EA8; \Syllogis.00403EA8 =>trace into , đơn giản đổi từng ký tự chuỗi name thành chữ hoa 004012AD |. 59 POP ECX 004012AE |. 8BD8 MOV EBX,EAX =>đưa ký tự đã đổi thành chữ hoa vào ebx 004012B0 |. BE 3D914000 MOV ESI,Syllogis.0040913D; ASCII "4B7YS8K39D1NM1K9R8Q9A9A5A1A2N1P0A5V5X3B2W2J3L5U6Y3E3" =>đưa chuỗi mặc định "4B7YS8K39D1NM1K9R8Q9A9A5A1A2N1P0A5V5X3B2W2J3L5U6Y3E3" vào esi 004012B5 |. 8D7D C8 LEA EDI,DWORD PTR SS:[EBP-38] 004012B8 |. B9 0D000000 MOV ECX,0D 004012BD |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 004012BF |. A4 MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 004012C0 |. 0FBEC3 MOVSX EAX,BL =>đưa từng ký tự của name đã đổi thành chữ hoa vào eax 004012C3 |. 8A9445 46FFFFF>MOV DL,BYTE PTR SS:[EBP+EAX*2-BA] =>[ebp-38+eax*2-ba+38] vào dl vd ký tự ta nhập là l thì đổi sang chữa hoa là L có mã 4c 4c*2+38-ba=16h=22 , tức lấy ký tự thứ 22 của chuỗi mặc định đưa vào dl chuỗi mặc định có 52 ký tự , ký tự đầu tiên là ký tự thứ 0 cho đến ký tự cuối là 51 004012CA |. 8815 28914000 MOV BYTE PTR DS:[409128],DL =>lưu ký tự mới tính tại [409128] 004012D0 |. 0FBECB MOVSX ECX,BL =>đưa từng ký tự của name đã đổi thành chữ hoa vào ecx 004012D3 |. 8A844D 47FFFFF>MOV AL,BYTE PTR SS:[EBP+ECX*2-B9] =>[ebp-38+ecx*2-ba+38] vào al 004012DA |. A2 29914000 MOV BYTE PTR DS:[409129],AL =>lưu ký tự mới tính tại [409129] 004012DF |. 5F POP EDI 004012E0 |. 5E POP ESI 004012E1 |. 5B POP EBX 004012E2 |. 8BE5 MOV ESP,EBP 004012E4 |. 5D POP EBP =>khôi phục các thanh ghi 004012E5 \. C3 RETN tớ xem đoạn mã hóa không kỹ lắm với lại biết sơ sơ asm nên hình như có vấn đề trong cái đoạn mã hóa từ địa chỉ 00401298 bác nào thử qua có sai xót thì bảo nhá ban đầu chương trình đổi từng ký tự chuỗi name nhập vào thành ký tự hoa , lấy mã hex của từng ký tự chuỗi name đã được đổi thành chữ hoa tính toán ra một con số trong chuỗi mặc định có 52 ký tự , ký tự đầu tiên là 0 cho đến ký tự cuối là 51 con số được tính toán ra là số thứ tự trong chuỗi mặc định đó name : dqtln serial : K3A5B2A5A name : langdangngayqua serial : A54BA2M1K34BA2M1A2M14BY3A5W24 Posted by: moonbaby Jan 3 2004, 02:40 PM QUOTE Homepage : http://crackme.de CrackMe : CrackMe3.zip (CrackMe3.exe ) Coder : BadSector ( MASM32 / TASM32 ) Type : Name / Serial Packed : N / A Crack Tool : OllyDbg 1.09d Unpack Tool : N / A Request : Correct Serial Rule : N/A Note : N/A Đặt BreakPoint tại điểm sau : QUOTE 004011F6 /$ 33DB XOR EBX,EBX Sau khi load thì Olly dừng tại đây. Giai đoạn mã hoá được tiến hành hai lần : Giai đoạn mã hoá thứ nhất : QUOTE Đưa từng ký tự của chuỗi U nhập vào trừ đi giá trị của CL ( ECX hiện thời là chiều dài chuỗi U nhập), kết quả được lưu ngay tại vị trí này hay nói cách khác ký tự mới tạo thành thay thế ký tự ban đầu của U nhập. 004011FB |> 288B FF204000 /SUB BYTE PTR DS:[EBX+4020FF],CL Kiểm tra chuỗi nhập có khoảng trắng hay không, nếu có sẽ xử lý theo cách khác. 00401201 |. 80BB FF204000>|CMP BYTE PTR DS:[EBX+4020FF],20 00401208 |. 74 06 |JE SHORT crackme3.00401210 0040120A |. 43 |INC EBX < === Tăng EBX lên 1 0040120B |. 49 |DEC ECX < === Giảm ECX đi 1 0040120C |.^ 75 ED |JNZ SHORT crackme3.004011FB < === Lặp đến hết chuỗi. 0040120E |. EB 0A |JMP SHORT crackme3.0040121A < === Nếu hết chuỗi thì nhảy ra ngoài. Nếu chuỗi nhập có khoảng trắng thì sẽ gán bằng giá trị hiện thời của CL ( ECX ) 00401210 |> 008B FF204000 |ADD BYTE PTR DS:[EBX+4020FF],CL 00401216 |. 43 |INC EBX < === Tăng EBX lên 1 00401217 |. 49 |DEC ECX < === Giảm ECX đi 1 00401218 |.^ 75 E1 \JNZ SHORT crackme3.004011FB < === Lặp đến hết chuỗi. Chuỗi được mã hoá ở giai đoạn này sẽ thay thế chuỗi U nhập ban đầu ở cùng một vị trí trong bộ nhớ. Giai đoạn mã hoá thứ hai. QUOTE Giá trị ban đầu là chiều dài chuỗi U nhập ( giá trị sau khi thoát khỏi vòng lặp đầu tiên ) 0040121A |> 4B DEC EBX < === EBX = EBX – 1 0040121B |. 33C9 XOR ECX,ECX < === ECX = 00h Đưa từng ký tự của chuỗi được mã hoá ở giai đoạn trên vào EAX, nhưng do ở đây EBX ban đầu chính là chiều dài chuỗi nhập và sau mỗi vòng lặp lại giảm đi 1 nên chuỗi sẽ được đưa vào là chuỗi ngược. 0040121D |> 0FB683 FF2040>/MOVZX EAX,BYTE PTR DS:[EBX+4020FF] 00401224 |. 83F8 41 |CMP EAX,41 < === So sánh với 041h 00401227 |. 73 03 |JNB SHORT crackme3.0040122C < === Nhảy nếu không nhỏ hơn 00401229 |. 83C0 20 |ADD EAX,20 < === EAX = EAX + 020h 0040122C |> 83F8 5A |CMP EAX,5A < === So sánh với 05Ah 0040122F |. 76 03 |JBE SHORT crackme3.00401234 < === Nhảy nếy nhỏ hơn hoặc bằng. 00401231 |. 83E8 20 |SUB EAX,20 < === EAX = EAX – 020h Đưa giá trị mới này lưu ở địa chỉ 0040214F ( vì ban đầu ECX = 00h ) 00401234 |> 8881 4F214000 |MOV BYTE PTR DS:[ECX+40214F],AL 0040123A |. 4B |DEC EBX < === EBX = EBX - 1 0040123B |. 41 |INC ECX < === ECX = ECX + 1 0040123C |. 83F9 04 |CMP ECX,4 < === Chuỗi mã hoá lần đầu là 4 ký tự. 0040123F |. 74 07 |JE SHORT crackme3.00401248 < === 4 ký tự sau được mã hoá cách khác. So sánh ECX ( chiều dài chuỗi được xử lý ) với giá trị được lưu ở địa chỉ SS:[EBP-4]. Giá trị này là chiều dài chuỗi + 1 vì ta thêm ký tự ASCII “-“ vào sau ký tự thứ 4. Nếu chưa hết thì lại tiếp tục vòng lặp. Nếu đã hết chuỗi thì thoát ra ngoài. 00401241 |. 3B4D FC |CMP ECX,DWORD PTR SS:[EBP-4] 00401244 |.^ 75 D7 |JNZ SHORT crackme3.0040121D < === lặp tiếp nếu chưa hết 00401246 |. EB 0A |JMP SHORT crackme3.00401252 < === Thoát ra khỏi vòng lặp 00401248 |> C681 4F214000>|MOV BYTE PTR DS:[ECX+40214F],2D < === ASCII = “-“ 0040124F |. 41 |INC ECX < === ECX = ECX + 1 00401250 |.^ EB CB \JMP SHORT crackme3.0040121D < === Tiếp tục quá trình lặp. Sau khi kết thúc giai đoạn mã hoá thứ hai, ta đến ngay lệnh này. QUOTE 00401252 |> \E8 6BFFFFFF CALL crackme3.004011C2 Trace thẳng vào trong ta đến : 004011C2 $ 33C9 XOR ECX,ECX < === ECX = 00h : là biến đếm của vòng lặp. Đưa từng ký tự của S nhập vào EAX 004011C4 > 0FBE81 272140>MOVSX EAX,BYTE PTR DS:[ECX+402127] Đưa từng ký tự của chuỗi mã hoá vào EBX. 004011CB . 0FBE99 4F2140>MOVSX EBX,BYTE PTR DS:[ECX+40214F] Ở đây ta thấy có một điều đặc biệt là tại sao lại so sánh với 1 ?? Thực sư đây là một giai đoạn mã hoá chuỗi được tạo thành ở trên lần cuối. Nhưng không mã hoá toàn bộ mà chỉ mã hoá ký tự thứ hai mà thôi. Theo câu lệnh ta sẽ thấy là giá trị của ký tự thứ hai sẽ được cộng thêm 1. 004011D2 . 83F9 01 CMP ECX,1 < === So sánh ECX với 1 < === Rất quan trọng.!!!! 004011D5 . 74 16 JE SHORT crackme3.004011ED < === Nhảy đến giai đoạn mã hoá thứ ba. 004011D7 . 3BC3 CMP EAX,EBX < === so sánh từng ký tự của S nhập và S thực với nhau. 004011D9 . 74 03 JE SHORT crackme3.004011DE < === Nhảy đến thông báo sai ngay. 004011DB . EB 7B JMP SHORT crackme3.00401258 004011DD . C3 RETN 004011DE > 83F8 00 CMP EAX,0 < === Kiểm tra xem đã kết thúc chuỗi chưa 004011E1 . 75 06 JNZ SHORT crackme3.004011E9 < == Nếu kết thúc thì đến thông báo đúng 004011E3 . E9 85000000 JMP crackme3.0040126D 004011E8 . C3 RETN 004011E9 > 41 INC ECX < === ECX = ECX + 1 004011EA .^ EB D8 JMP SHORT crackme3.004011C4 < === Tiếp tục vòng lặp. Kết luận : QUOTE 1- Quá trình mã hoá chuỗi thực chất là ba gia đoạn chú không phải là hai. 2- Gian đoạn thứ hai bao hàm trong quá trình kiểm tra chuỗi và chỉ diễn ra đối với ký tự thứ hai mà thôi . 3- Và sau ký tự thứ tư sẽ được thêm vào “-“ Vậy : QUOTE User : Moonbaby Serial : XA>>-IIHE User : HVA-CrAcKeRtEaM Serial : L@BP-M?D;XHXATHY . chuỗi chưa 00 4 01 1 E1 . 75 06 JNZ SHORT crackme3 .00 4 01 1 E9 < == Nếu kết thúc thì đến thông báo đúng 00 4 01 1 E3 . E9 8 500 000 0 JMP crackme3 .00 4 01 2 6D 00 4 01 1 E8 . C3 RETN 00 4 01 1 E9 > 41 INC ECX. đến 00 4 01 2 e8 xem hàm kiểm tra serial CODE 00 4 01 2 E8 /$ 55 PUSH EBP ở đây có một số dòng 00 4 01 2 FF |. 50 PUSH EAX; |Arg1 00 4 01 3 00 |. E8 EB 1 10 000 CALL Syllogis .00 402 4F0; Syllogis .00 402 4F0. nhau. 00 4 01 1 D9 . 74 03 JE SHORT crackme3 .00 4 01 1 DE < === Nhảy đến thông báo sai ngay. 00 4 01 1 DB . EB 7B JMP SHORT crackme3 .00 4 01 2 58 00 4 01 1 DD . C3 RETN 00 4 01 1 DE > 83F8 00 CMP EAX ,0 <