<리버싱 핵심 원리>로 공부하였다.
06 abex' crackme #1 분석
관련 이전 게시물 : https://pepperhaneul.tistory.com/84?category=890252
일단 처음에 한 번 실행해보았다. 그럼 위와 같은 대화상자가 뜬다. OK를 눌러보았다.
위와 같이 Error 메시지 박스가 떴다. 여기서 OK를 누르면 종료된다. 이제 디버거에서 디스어셈 코드를 확인해보자.
위 코드를 한 줄 한 줄 분석해보자.
401000~40100E : MessageBoxA() 호출
401013~401018 : GetDriveTypeA() 호출
ESI = 1 (환경에 따라 첫 시작 값이 다르다면 다른 값이 나올 수도 있다. 아래도 마찬가지)
EAX = 2
의미 없는 JMP 명령
ESI = 2
ESI = 3
EAX = 1
401024 : CMP문 -> EAX와 ESI 비교
401026 : JE문 -> 비교한 두 값이 같으면 40103D 주소로 점프하고 다르면 그냥 밑으로 진행
다를 때
401028로 이동
401028~401036 : Error MessageBoxA() 호출
40103B : 401050으로 이동
같을 때
40103D로 이동
40103D~40104B : YEAH MessageBoxA() 호출
401050 : 프로그램 종료
그럼 이제 분석을 끝냈으니 크랙을 해보자.
분석한 내용대로라면 비교하고 결과에 따라 이동되는 주소가 달라진다. 그러므로 같을 때 점프하는게 아니라 다를 때 점프를 하게 한다면 우리는 같을 때 뜨는 메시지 박스를 볼 수 있을 것이다. 이는 JE 명령어를 JMP 명령어로 바꾸면 된다.
그럼 크랙에 성공한 화면을 볼 수 있다.
※ 코드에서 파라미터 순서의 반대로 호출한다. 스택의 FILO 구조 때문이다.