[리버싱] OllyDbg 를 이용한 CrackMe1.exe 크랙하기
Updated:
OllyDbg 를 이용하여 CrackMe1.exe 크랙하는 방법에 대해 기술한다.
- OllyDbg, x64Dbg, Immunity Dbg 셋 중 하나를 설치한다.
- 파일을 열고, 필요한 코드를 찾아가 Break Point를 설정한다.
- 크랙하기
1. OllyDbg, x64Dbg, immunity Dbg 셋 중 하나를 설치한다.
OllyDbg 의 경우 64 비트 환경에서 구동하기 위해서는 별도의 설정들이 필요하기 때문에, x64Dbg 의 압축버전 또는, ImmunityDbg 의 installer 를 통해 설치하는 것이 정신건강에 이롭다. 3개의 디버거 모두 OllyDbg 를 기반으로 하고 있기에 기능상 큰 차이는 없고, x64 Dbg, Immunity Dbg 가 확장팩 정도라 생각하면 된다. x64 Dbg 는 메뉴기능에 한국어를 지원하며, Immunity Dbg 는 python script(2.7.1) 를 지원한다.
도구는 많이 사용해봐야 한다는 마음으로, 3가지 모두를 설치해서 사용해본다.
2. 파일을 열고, 필요한 코드를 찾아가 break point 를 설정한다.
2.1. 처음 파일을 열게 되면, 다음과 같은 화면이 뜬다.
이때 좌측 상단의 7775CE37 과 같은 메모리 주소는 시스템 영역이다.
2.2. F9 를 눌러 실행을 하거나, [우클릭]-[View]-[Module ‘CrackMe1’] 을 클릭한다.
2.3. 다음과 같이 메모리 주소 영역이 00401000, 프로그램 영역으로 변경된 것을 알 수 있다.
2.4. 코드의 원하는 부분을 보기 위하여, [우클릭]-[Search for]-[All referenced text strings] 기능을 이용한다.
2.5. 크랙이 성공했을 때, 나오는 문자열로 추정되는 “Congratulations” 을 클릭하여 해당 부분으로 이동한다.
2.6. 해당 코드 부분의 앞뒤 영역을 보면서 break point 를 설정한다.
보통 분기문(JMP, JNZ, 등등)에 설정한다.
3. 크랙하기
3.1. F9 를 눌러 프로그램을 실행시킨다.
break point 에 아직 걸리지 않은 상태이므로, 프로그램 상에서 serial 번호를 입력하여 진행시킨다.
3.2. test 문자열로 “1234” 를 입력해본다.
다음과 같이 break point 에 걸린 것을 알 수 있다.
3.3. F8 (Step Over) 기능을 통해 한줄씩 코드를 실행시키며, 레지스터 값을 분석한다.
MOV EAX, 31333736 // EAX 레지스터에 0x31333736 을 넣는다.
CMP EAX, DWORD PTR DS:[ESI] // EAX 값에서 ESI 주소에 있는 값을 뺀 값이 0 일 경우, Zero flag 를 1로 설정한다.
JNZ SHORT CrackMe1.00401172 // Zero flag 가 1이 아닐 경우, 해당 주소로 점프한다.
MOV EAX, 37333234 // EAX 레지스터에 0x37333234 을 넣는다.
CMP EAX, DWORD PTR DS:[ESI+4] // EAX 값에서 ESI+4 주소에 있는 값을 뺀 값이 0 일 경우, Zero flag 를 1로 설정한다.
JNZ SHORT CrackMe1.00401172 // Zero flag 가 1이 아닐 경우, 해당 주소로 점프한다.
3.4. ESI 값을 확인해보기 위해서, 좌측하단의 창에서 Ctrl + G 를 통해, ESI 주소로 이동하면 다음과 같이 값을 확인할 수 있다.
3.5. 결과 종합
3.6. “67314237” 을 입력했을 때의 결과 확인
Comments