정답은 무엇인가

프로그램을 실행하면 다음과 같이 정답을 입력할 수 있는 터미널이 열린다. 문제는 없는데 정답은 있슨...

11번 문제까지는 x32dbg로 실행해야했지만, 12번 문제부터는 x64dbg로 실행해야 한다.

Search for 기능으로 오답 시 출력되는 문구를 찾아 분기점을 찾으려 했지만, Search for에서는 해당 문자열이 검색되지 않는다.
따라서 F8 단축키를 통해 직접 코드를 넘기면서 "Bad Luck! ..." 문자열이 출력되는 부분을 탐색했다. 그 결과, call mscorlib.ni.7FFBCA2BC4B0 구문에서 해당 문자열이 출력됐다.

해당 부분에서 반복적으로 정답 입,출력문이 실행되고 있었다.
1번 함수로 "Please enter ..." 문을 출력하고, 2번 함수로 사용자 입력값을 받는다.
2번 함수 결과로 리턴된 RAX, RBX 레지스터 값을 3번 함수를 통해 비교한다. 3번 함수의 결과 두 레지스터 데이터가 일치하면 al 레지스터에 1이 저장된다. 리턴값(al 레지스터 값)이 1이면 je 구문을 건너뛰고 성공 구문을 출력한다.
3번 함수의 내용은 다음과 같다.
00007FFBC6277E30 | 48:3BCA | cmp rcx, rdx
00007FFBC6277E33 | 74 1B | je 7FFBC6277E50
00007FFBC6277E35 | 48:85C9 | test rcx, rcx
00007FFBC6277E38 | 74 11 | je 7FFBC6277E4B
00007FFBC6277E3A | 48:85D2 | test rdx, rdx
00007FFBC6277E3D | 74 0C | je 7FFBC6277E4B
00007FFBC6277E3F | 48:8D05 1A000000 | lea rax, [rip+0x1A] ; 7FFBC6277E60
00007FFBC6277E46 | FF E0 | jmp rax
00007FFBC6277E49 | F3 C3 | rep ret
00007FFBC6277E4B | 33 C0 | xor eax, eax
00007FFBC6277E4D | EB FA | jmp 7FFBC6277E49
00007FFBC6277E4F | 90 | nop
00007FFBC6277E50 | B0 01 | mov al, 1
00007FFBC6277E52 | EB F5 | jmp 7FFBC6277E49
만약 RAX, RBX 두 레지스터 값이 일치하지 않는다면 "Bad Luck! ..." 구문을 출력하고 위 과정을 반복한다.

2번 함수 실행 후 RAX, RBX 값을 확인한 결과, HEX 값에 Leteminman이라는 문자열이 저장된 것을 확인할 수 있다.

정답 발견은 쉬웠지만 코드가 길어서 정답이 분기되는 위치를 찾는 게 어려웠던 것 같다. 하나하나 F8, F7 눌러보며 정답 레지스터가 있는 곳을 찾아다닌 것도....🫠 BreakPoint를 어디에 설정할 것인지도 중요했던 문제였던 것 같다.
코드엔진 깃허브에 가면 다양한 풀이를 확인할 수 있다.