Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다. 이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면 파일을 HexEdit로 오픈 한 다음 0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다. 문제 : Key값과 + 주소영역을 찾으시오. Ex) 7777777????????
프로그램을 실행시키면 key 값을 입력하는 창이 나타난다. 틀린 번호를 입력해도 경고메세지 등이 출력되지 않는다.
패킹이 되어있지 않아 x32dbg에서 프로그램을 열면 바로 내부 로직을 확인할 수 있다.

Search for 기능을 통해 문자열을 탐색한 결과, 성공 시 출력될 것으로 보이는 문자열을 발견할 수 있었다. 해당 주소로 이동한다. 전체 코드 길이가 길지 않아 조금만 스크롤을 내려도 찾을 수 있다.
분기점의 전체적인 흐름은 다음과 같다.

우선 사용자 입력을 받아 EAX레지스터에 저장한다. 32bit 프로그램에서 대부분 함수의 리턴값은 EAX 레지스터에 저장된다고한다.
테스트를 위해 key값에 "12345"를 입력했다. GetDlgItemInt 함수 호출이 끝난 후, EAX 레지스터를 확인해보면 "3039"라는 값이 저장되어있다. 10진수 정수 "12345"를 16진수로 변경한 값이 "3039"이다.

mov 명령어로 ESI 레지스터에 오프셋 403000 주소에 있는 "Oqiq..." 긴 문자열을 저장한다. (반복을 위해 사용됨)
이후 cmp 명령어로 ESI 레지스터에 값이 저장되어있는지 확인한다. 직전에 mov로 값을 저장했기 때문에 Zero Flag(ZF)는 0(False)이 된다. 따라서 jne문에 설정된 주소 401071로 점프한다.

esi 레지스터에 저장된 문자열 중 4byte(dword)만큼을 ebx 레지스터에 저장한다.
ESI에 데이터가 존재한다면 call 12.40110F 구문으로 EAX EBX에 대한 연산을 진행한다.
call 12.40110F 함수 내부 코드는 다음과 같다.
0040110F | 51 | push ecx
00401110 | 52 | push edx
00401111 | 8BD3 | mov edx, ebx
00401113 | 8BC8 | mov ecx, eax
00401115 | 40 | inc eax
00401116 | F7D0 | not eax
00401118 | 43 | inc ebx
00401119 | F7D3 | not ebx
0040111B | 40 | inc eax
0040111C | 43 | inc ebx
0040111D | 23C2 | and eax, edx
0040111F | 23D9 | and ebx, ecx
00401121 | 03C3 | add eax, ebx
00401123 | 5A | pop edx
00401124 | 59 | pop ecx
00401125 | C3 | ret
; EAX 레지스터에는 NOT > +1 > AND EAX, 초기EBX
; EBX 레지스터에는 +1 > NOT > +1 > AND EBX, 초기EAX

위 연산 결과 EAX와 EBX 레지스터에 다른 값이 저장된 것을 확인할 수 있다.
이후 ESI 레지스터에 저장된 문자열을 4byte 삭제한다. (ESI 레지스터는 스택이므로 최사위 주소를 4 더함으로써 데이터를 삭제한다.)
레지스터 연산 후 다시 cmp 구문으로 점프하고, 아직 ESI 레지스터에 문자열이 남아있는지 확인한다.
처음엔 call 구문을 통해 EAX와 EBX레지스터가 복잡하게 바뀌기 때문에 Key값을 알아내는 게 어려울 것이라고 생각했다. 하지만 반복이 종료되었을 때 EAX의 레지스터 값을 확인해보면 처음 확인했던 3039 그대로인 것을 확인할 수 있다.

반복을 종료했을 경우 cmp eax, 7A2896BF 구문을 통해 EAX 레지스터에 저장된 값이 7A2896BF인지 비교한다.
만약 두 값이 일치하지 않는다면(=ZF가 0) 성공 구문 이후 주소로 점프한다.
즉, key값은 7A2896BF를 10진수로 변환한 2049480383이다.

다음으로, 성공 구문 대신 key값이 출력되게 하기 위해서 HxD에서 변조를 시도한다. 변조한 위치는 0D3B~0D45이다. 왜 ~D44까지가 아닌가 싶었는데 어셈블리 코드에서 문자열 마지막에는 null을 추가해야 함을 깜빡하고있었다.
(이때 파일 전체 크기가 변경되도록 key값을 붙여넣으면 파일 실행이 안 되니 주의하자)
따라서 문제에서 요구한 정답은 key값 2049480383 + 변조 위치 0D3B+0D45 = 20494803830D3B0D45

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