이번에 풀어볼 문제는 CodeEngn Basic 7번 문제입니다.
우선 문제를 살펴보아야 합니다.
문제의 핵심은 컴퓨터 C 드라이브의 이름에 따라 시리얼 키가 생성되고, 이것의 이름이 CodeEngn
일 경우 이 문자열이 어떤 것으로 변하는지 확인하는 것입니다.
지금부터 문제에서 제공된 프로그램을 살펴보겠습니다.
위 사진과 같이 시리얼 키를 입력하는 입력창과 Check 버튼이 존재합니다.
만약 시리얼 키가 일치하지 않는다면, 위와 같은 MessageBox
를 출력합니다.
가장 먼저 이 프로그램에서 사용되는 주요 함수는 다음과 같습니다.
위 함수 중 lstrcatA 함수에 BP(Break Point)를 걸어 실행해보겠습니다.
lstrcat 함수의 결과는 C 드라이브의 이름인 "AAAA"와 문자열 "4562-ABEX"가 합쳐진 것을 볼 수 있습니다.
위 사진을 보면 dl
의 값을 2로 설정하였고 ds
의 40225C
부터 40225F
주소의 값에 0x1
을 더합니다. 결괏값으로 "AAAA4562-ABEX"
에서 "CCCC4562-ABEX"
로 변하였으므로 해당 코드는 문자열의 시작 주소인 0x0040225C
부터 0x4
만큼 떨어진 주소0x0040225F
에 각각 0x1
만큼 더하는 것을 2번 반복하는 작업을 합니다.
그 다음 다시 lstrcat 함수를 호출하여 두 문자열을 합쳐 "L2C-5781CCCC4562-ABEX"로 만듭니다.
lstrcat 함수가 종료되고 0x004010ED
에서 사용자의 입력을 push
하고 0x004010F7
에서 생성된 시리얼 키를 push
한 뒤, lstrcmpiA 함수에서 두 문자열을 비교하여 일치할 경우, "Yep, you entered a correct serial!"을 MessageBoxA를 통해 출력합니다. 일치하지 않는다면 "The serial you entered is not correct!"를 MessageBoxA를 통해 출력합니다.
분석 단계에서 코드의 전체적인 구조와 원리를 파악하였으니 문제의 핵심이었던 C 드라이브의 이름이 CodeEngn
일 경우 이 문자열이 어떤 것으로 변하는지 확인하는 작업을 해보겠습니다.
이 프로그램은 C 드라이브의 이름을 가져와 C 드라이브의 이름 + "4562-ABEX"
의 문자열로 만든 뒤, 합친 문자열의 시작 지점부터 0x4
만큼 떨어진 지점까지의 값을 0x1
만큼 2번 변경합니다.
변경된 문자열은 다시 한 번 "L2C-5781" + 변경된 문자열
로 합쳐집니다.
따라서 만약 C 드라이브의 이름을 CodeEngn으로 변경하게 된다면
C ---------------------> E
o ---------------------> q
d ---------------------> f
e ---------------------> g
Engn은 변경되지 않으므로 문제의 정답은 "EqfgEngn"
시리얼 키는 "L2C-5781EqfgEngn4562-ABEX"가 됩니다.
문제의 정답을 입력하면
Success!!가 출력되는 것을 확인할 수 있습니다!
다음 게시글은 CodeEngn Basic 8번 풀이로 돌아오겠습니다.