CodeEngn basic 20

코드엔진 basic 20번 문제풀이

프로그램을 실행해보면 아무 화면도 뜨지 않는 것을 볼 수 있다.

basic20

PEiD로 살펴본 결과 패킹이 되어있지 않으므로 바로 올리 디버거를 사용하여 파일을 연 뒤 EP인 401000까지 실행한다.

basic20-1

이제 분석을 시작해보면 일단 CreatrFileA함수를 사용해 CRACKME3.KEY라는 파일을 열고 ReadFile함수를 사용해 파일을 읽은 뒤 파일의 바이트를 반환하여 주소 00401066에서 12h(18)과 비교하여 같지 않으면 실패 구간으로 가는 것을 알 수 있다. 그래서 CRACKME3.KEY라는 18바이트 크기의 파일을 만들고 실행을 해봤지만 아래와 같이 실패 하였다.

basic20-2

다시 올리 디버거로 돌아가서 분석을 해보면 아래의 주소 00401074에서 CRACKME3.KEY에 입력한 값을 A-N으로 XOR 하고 그 값을 반환하는 것을 알 수 있었고 주소 0040108B에서 남은 나머지 4개의 문자를 반환하고 주소 00401093에서 4자리 반환 값과 [4020F9]에 들어있는 값을 비교하는 것을 알 수 있었다.

basic20-3

[4080F9]값에 들어있는 주소를 찾아보면 7B553412인 것을 알 수 있었다. 실행을 계속해보면서 분석을 해보면 주소 00401074에 있는 call 00401311에서 A-N까지XOR 하여 반환한 값이 성공 메시지로 사용되는 것을 확인할 수 있다. A-N을 XOR 하여 CodeEngn이 나오게 해야 하고 같은 값을 XOR 하면 0이 되면서 뒤에 있는 값을 무시하고 반환하므로 02 2D 27 21 00 28 20 26 49 값을 입력하면 CodeEngn이 되는 것을 알 수 있었다. 이제 뒤에 4자리 값을 붙여보면 02 2D 27 21 00 28 20 26 49 7B 55 31 12가 되지만 파일의 크기가 18바이트가 되어야 하므로 202D27210028202649 + 임의의 값 + 7B553412 값이 정답인 것을 확인할 수 있다.

basic20-5

basic20-4