Breakpoint at kernel32.7C85994E INT3 command at ntdll.DbgBreakPoint Access violation when executing [00000000] Breakpoint at kernel32.7C862C10 Illegal instruction Integer division by
Trang 1LEA EAX,DWORD PTR SS:[EBP-124]
PUSH EAX
PUSH 7
CALL kernel32.GetCurrentProcess < - Here is trick! This API returns FFFFFFFF Change EAX to 0
PUSH EAX
CALL DWORD PTR DS:[<&ntdll.NtQueryInform>;
ntdll.ZwQueryInformationProcess
TEST EAX,EAX
Cho dù có khác, các bạn cũng tìm được điểm giống, là cái này :
PUSH7
CALL kernel32.GetCurrentProcess
Rồi sửa EAX = FFFFFFFFh thành EAX = 0
2 OEP và stolen Code:
Không có cách tổng quát để tìm ra được đúng OEP (nếu có cách tổng quát thì có thể viết script tìm OEP.)
Thay vào đó là tôi đã theo vết và kể cả việc thử nghiệm nhiều lần mã, exceptions, breakpoints Tôi đã tìm ra nơi mà những lệnh nhảy imports được định vị, khi crackme được unpack bởi trình bảo vệ, tôi thủ đặt BP trên hầu hết khối Import (không thành vấn đề vì crackme này nhỏ)
Ừm, bạn nên check tất cả options exception trong Olly, rồi run crackme:
Sau đó, nhìn vào cửa sổ log:
Log data
Message
Access violation when reading [00000000]
Access violation when reading [FFFFFFFF]
Module C:\WINDOWS\system32\advapi32.dll
Access violation when reading [FFFFFFFF]
Trang 2Breakpoint at kernel32.7C85994E
INT3 command at ntdll.DbgBreakPoint
Access violation when executing [00000000] Breakpoint at kernel32.7C862C10
Illegal instruction
Integer division by zero
Breakpoint at USER32.77D6F3DC
Access violation when executing [00000000] Breakpoint at kernel32.7C862C10
Integer division by zero
Access violation when reading [00000000]
Access violation when reading [8003F41E]
Integer division by zero
Access violation when reading [00000000]
Access violation when reading [FFFFFFFF]
Access violation when reading [FFFFFFFF]
Access violation when reading [8003F418]
Illegal instruction
Integer division by zero
Breakpoint at kernel32.7C812E10
INT3 command at 00396555
Integer division by zero
Integer division by zero
Integer division by zero
Integer division by zero
Integer division by zero
Integer division by zero
Illegal instruction
Integer division by zero < - This one
Trang 3New thread with ID 00000304 created
Breakpoint at kernel32.7C85994E
Ngoại lệ cuối cùng là “Integer division by zero” Restart lại Olly, uncheck option
“Integer division by zero”, Vì thế khi run Olly, ta sẽ được ngắt trên Ngoại lệ đó Sau vài lần ta sẽ ở đây:
F7F0 DIV EAX < - Exception
55 PUSH EBP
8BEC MOV EBP,ESP
8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
6A 00 PUSH 0
68 CC971025 PUSH 251097CC
6A 00 PUSH 0
FF50 18 CALL DWORD PTR DS:[EAX+18]
5D POP EBP
C2 0800 RETN 8
55 PUSH EBP
8BEC MOV EBP,ESP
8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
8B00 MOV EAX,DWORD PTR DS:[EAX]
3D 1D0000C0 CMP EAX,C000001D
74 0E JE SHORT UnPackMe.00415FD0
3D 940000C0 CMP EAX,C0000094
75 41 JNZ SHORT UnPackMe.0041600A
B9 AB92AD01 MOV ECX,1AD92AB
EB 05 JMP SHORT UnPackMe.00415FD5
B9 4E90AD01 MOV ECX,1AD904E
E8 00000000 CALL UnPackMe.00415FDA
5A POP EDX
8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
81EA 893CBA00 SUB EDX,0BA3C89
Trang 48D940A EFAB0CFF LEA EDX,DWORD PTR DS:[EDX+ECX+FF0CABEF]
8990 B8000000 MOV DWORD PTR DS:[EAX+B8],EDX
33C9 XOR ECX,ECX
8948 04 MOV DWORD PTR DS:[EAX+4],ECX
8948 08 MOV DWORD PTR DS:[EAX+8],ECX
8948 0C MOV DWORD PTR DS:[EAX+C],ECX
8948 10 MOV DWORD PTR DS:[EAX+10],ECX
C740 18 55003333 MOV DWORD PTR DS:[EAX+18],33330055
33C0 XOR EAX,EAX
5D POP EBP
C3 RETN
33C0 XOR EAX,EAX
40 INC EAX
5D POP EBP
C3 RETN
33C0 XOR EAX,EAX
8D44C0 03 LEA EAX,DWORD PTR DS:[EAX+EAX*8+3]
010424 ADD DWORD PTR SS:[ESP],EAX
C3 RETN
Lúc này section mã được unpack hoàn toàn Tôi đặt một memory breakpoints trên section mã và run chúng ta sẽ tới được “FALSE OEP”
Xem xét một chút
Đầu tiên, crackme này có section mã là 00404000, thứ hai là Obsidium luôn nhảy tới ‘FALSE OEP” dù cho nó không “chôm” BYTES, nó sẽ nhảy tới những mã nhị phân ở xa
Chúng ta hãy kiểm tra ngăn xếp, chúng ta sẽ thấy SEH handler mà sẽ điều khiển ngoại lệ:
0012FF94 0012FFE0 Pointer to next SEH record
0012FF98 00415FB3 SE handler
Trang 5Ta đặt breakpoints tại 0x00415FB3, Shift+F9, sau đó F8 đến RETN chúng ta sẽ tới ntdll.dll:
Sau đó, chúng ta đặt memory breakpoints trên section của Obsidium:
Tại section 0041500 Sau đó ,Shift+F9, ta tới đây:
F7 vào địa chỉ 004161EB:
Trrace F8 liên tục, các bạn sẽ thấy có một vòng lặp giải mã :
Trace ra khỏi vòng lặp bằng cách F2 tại 004162CD RETN, rối Shift+F9 tới RETN, F7, ta đến nơi này: