이 프로그램의 등록키는 무엇인가

프로그램을 실행시켰을 때 일치하지 않는 이름과 등록키를 사용할 경우, 다음과 같은 알림창이 나타난다.
![]() | ![]() |
|---|
Ollydbg에서 05.exe파일을 실행시켜보면, 왼쪽 사진과 같이 문자열이 모두 분리된 모습을 확인할 수 있으며, 시작 위치(Entry Point)에는 PUSHAD 명령어가 작성된 것을 확인할 수 있다.
PUSHAD는 UPX로 패킹했을 때 확인할 수 있는 명령어로, 모든 범용 레지스터의 값을 스택에 PUSH 하는 명령어이다.
POPAD는 스택에 존재하는 값을 레지스터에 저장하는 명령어로,POPAD명령어 이후 원본 프로그램이 시작된다 (OEP)

HxD를 통해 확인했을 때, UPX로 패킹되어있다는 문장을 확인할 수 있다.
패킹이란 윈도우 실행파일(PE파일)을 압축해 파일 사이즈를 줄이는 동작을 의미한다. 패킹을 하게 되면 원본 코드가 압축되어 앞선 사진처럼 무작위 바이트 시퀀스로 보이게 된다.
이글루 사이트에 패킹에 관한 상세한 설명이 업로드되어있어 참고하면 좋을 것 같다.
우선 코드 확인을 위해 언패킹을 진행한다. UPX는 깃허브에서 다운받을 수 있다.

upx -d -o "출력 파일 이름" "언패킹할 파일 이름"
파일 언패킹을 시도한다.

언패킹한 파일을 Ollydbg로 열어보면 코드를 정상적으로 확인할 수 있음을 알 수 있다.

usernmae과 serial번호가 일치하지 않을 경우 다음과 같은 알림창이 나타난다. "Wrong Serial,try again!" 텍스트가 존재하는 코드 앞뒤로 시리얼 넘버를 확인하고, 그에 따른 분기를 처리하는 부분이 있을 것으로 추측할 수 있다.

우클릭 > Search for > All referenced text strings

수많은 text string을 일일이 살펴보기는 어려우니 검색 기능을 이용한다.
우클릭 > Search for text

검색 결과 중 원하는 아이템을 더블클릭하면 해당 오프셋으로 이동된다.

이동된 오프셋 앞뒤 코드를 살펴보면, JNZ 구문을 통해 분기를 나누고 있음을 확인할 수 있다.
MOV EAX, MOV EDX 구문으로 함수의 인자를 설정하고, EDX에는 아스키 문자열 GFX-754-IER-954 값을 할당했다.
CALL unpacked.00403B2C 구문을 따라 오프셋 00403B2C로 이동하면 함수의 내용을 확인할 수 있다.
0403B2C
00403B2C /$ 53 PUSH EBX
00403B2D |. 56 PUSH ESI
00403B2E |. 57 PUSH EDI
00403B2F |. 89C6 MOV ESI,EAX
00403B31 |. 89D7 MOV EDI,EDX
00403B33 |. 39D0 CMP EAX,EDX
...(생략)...
00403BC6 |. 75 02 JNZ SHORT unpacked.00403BCA
00403BC8 |. 38FD CMP CH,BH
00403BCA |> 5F POP EDI
00403BCB |. 5E POP ESI
00403BCC |. 5B POP EBX
00403BCD \. C3 RETN
GPT에게 물어보니 두 메모리 블럭 EAX, EDX의 값이 동일한지 확인하는 로직이라고 한다.
즉, EAX 값이 GFX-754-IER-954인지 확인하는 함수를 기준으로 JNZ 구문을 실행하고 CALL 함수의 결과 리턴값이 0이 아닐 경우 "wrong serial ~" 알림창을 출력하는 00440F72 오프셋으로 이동한다.
따라서 프로그램의 등록키는 GFX-754-IER-954로 추측할 수 있다.

사용자명도 위와 동일한 방법으로 Registered User임을 확인할 수 있다.

코드엔진 깃허브에 가면 다양한 방식의 풀이를 확인할 수 있다.