Unpack을 한 후 Serial을 찾으시오.
6번 문제는 5번문제와 유사한 방식으로 풀이했기 때문에 자세한 설명은 5번 문제 게시글에 작성하였음.

프로그램을 실행하면 다음과 같이 시리얼 번호를 입력할 수 있는 창이 나타난다.

시리얼번호를 입력하지 않거나 잘못된 시리얼 번호를 입력하면 "Wrong serial!!!" 이라는 문자열을 확인할 수 있다.

Ollydbg에서 06.exe를 실행하면 다음과 같이 PUSHAD 명령어를 사용한 것을 확인할 수 있다. = UDX를 이용해 패킹을 진행했음을 알 수 있다.

문제에서 Unpack을 하라고 지시했기 떄문에 바로 UDX Unpacking을 진행한다.

5번 문제와 마찬가지로 에러 메세지 String을 검색해서 에러 메세지가 출력되는 부분 앞뒤에 분기가 존재하는지 살펴보자.

우클릭 > Search for > All referenced text strings
우클릭 > Search for text > Wrong 검색 > 해당되는 항목 더블클릭

에러 메세지가 포함된 코드 앞뒤를 살펴보면 흐름은 위와 같다.
GetDigItemTextA 함수를 통해 사용자 입력값을 오프셋 004235D4 위치에 저장한다.
사용자 입력값과 아스키 문자열 AD46DFS547을 인자로 받는 00401290 함수 내부 코드를 GPT에게 분석시켜보니, strcmp()와 유사한 문자열 비교 함수라고 한다.
즉, 아스키 문자열 AD46DFS547이 사용자 입력 문자열과 동일한지 확인하고, 동일하지 않을 경우 에러 메세지를 출력하는 오프셋 004010A3 위치로 이동시킨다.

BreakPoint를 설정하고 정답이 아닌 임의의 문자열을 입력한 결과, CALL 구문 함수에 대한 리턴값으로 EAX 값 1이 반환된다.
따라서, CALL unpacked.00401290 구문은 사용자가 입력한 시리얼 번호가 AD46DFS547 와 일치할 경우 0을, 일치하지 않을 경우 1을 반환하여 분기 처리를 하고 있음을 알 수 있다.
즉, 시리얼 번호는 AD46DFS547라고 추측할 수 있다.

문제 전문을 보면 시리얼번호와 OEP를 합한 문자열을 정답으로 제출하라고 되어있다.
Unpack을 한 후 Serial을 찾으시오. 정답인증은 OEP + Serial Ex) 00400000PASSWORD
OEP는 직접 실행, POPAD 명령어 이후 JMP로 이동하는 부분, 분석 도구 등을 통해 알 수 있다고 한다.
코드엔진 깃허브에서 다양한 풀이 방법을 확인할 수 있다.