티스토리 뷰
ABEX` CRACKME 1번문제
push 0 ; uType
push offset Caption ; "abex' 1st crackme"
push offset Text ; "Make me think your HD is a CD-Rom."
push 0 ; hWnd
call MessageBoxA
push offset RootPathName ; "c:\\"
call GetDriveTypeA
inc esi
dec eax
jmp short $+2
loc_401021:
inc esi
inc esi
dec eax
cmp eax, esi
jz short loc_40103D
loc_40103D: ; uType
push 0
push offset aYeah ; "YEAH!"
push offset aOkIReallyThink ; "Ok, I really think that your HD is a CD"...
push 0 ; hWnd
call MessageBoxA
우리가 해야할 일을 OK, I really think that your HD is a CD 문자열을 띄우는 것이다.
그 부분은 loc_40103D로 JMP해야 되는데, loc_401021 마지막 부분에 eax와 esi가 같아야 한다.
그 전 연산을 보면 GetDriveTypeA 함수를 호출하고
esi를 한번 더함, eax 한번 뺌, esi 한번 더함, esi 한번 더함, eax한번 뺌, eax와 esi를 비교 한 후
같으면 문자열 출력
즉 3 = eax - 2 가 되어야 한다. 그러면 eax가 5가 되어야 한다. 직접 띄워 보도록 하자.
그런데 OLLYDBG로 들어가보면 EAX를 5로 설정 해도 성공이 되지 않는다.
그건 기본적으로 ESI에 0x401000이 들어가기 때문에 EAX는 최종적으로 3 ESI는 최종적으로 0x4010003이 들어가게 된다.
ESI가 처음 0이었다면 성공 했을 것이다. 어셈블리를 바꿔서 강제적으로 loc_40103D에 가게 하도록 하자.
JE SHORT 0040103D 를
JMP SHORT 0040103D 로 바꾸면 JMP는 무조건 분기 이기 때문에 EAX나 ESI에 무엇이 들어가더라도
무조건 성공하게 될 것이다.
YEAH!