#About
Author : Abex
Korean :
컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 "어떤것"으로 변경되는가
English :
Assuming the drive name of C is CodeEngn, what does CodeEngn transform into in the process of the serial construction
#Contents
해당 문제는 C드라이브의 볼륨명을 참조 해, 여러 변환을 통해 최종적으로 변경되는 시리얼 키 값을 구하는 것이 목표이다
#Solution
[그림 1] - 실행 화면
해당 문제 역시 시리얼 키를 구한 뒤 검증을 거치는 로직으로 프로그램이 짜여있고
분석해야 할 사항은 로직의 세부분석을 통해 지문에 주어진 문제와 연관짓는 것이다
[그림 2] - 초기 화면
올리디버거로 07.exe 파일을 열었을 때 초기화면이며, 해당 프로그램에 사용된 함수와 텍스트 값을 아래와 같이 추출했다
[그림 3] - 함수 리스트
[그림 4] - 텍스트 리스트
함수 리스트를 보면 GetVolumeInformationA라는 함수를 볼 수 있고 이름에서 부터 볼륨 정보를 가져옴을 유추할 수 있다
[그림 5] - 값 참조 리스트
[그림 5]는 GetVolumeInformationA 함수에서 값을 참조하는 목록이며 VolumeNameBuffer를 통해
볼륨네임 즉, 드라이브 명을 가져옴을 알 수 있으며 문제와 관련있음 또한 알 수 있다
[그림 6] - Break Point at GetVolumeInformationA
해당 함수의 동작을 알아보기 위해 브레이크 포인트를 건 후, 변화를 살펴보니 아래와 같이
메모리 주소 0040225C에 C드라이브 볼륨명을 PUSH 함을 알 수 있다
[그림 7] - C 드라이브 명
[그림 8] - C드라이브 이름 값 참조
[그림 9] - 볼륨명 변환 코드
lstrcatA 함수를 거치고 나면 "4562-ABEX"와 C드라이브 볼륨명인 CodeEngn이 합쳐지게 되며
004010AD~004010CD 부분의 코드가 의미하는 바를 해석하면, DL에 2를 넣고 메모리주소 40225C~40225F
부분의 값을 참조해 +1 연산 시키는 구문이며 총 2회를 반복 후 004010AF로 점프하는 구문이다
40225C부터 40225F에 어떤 값이 담겨 있는지 확인을 해보았더니 아래와 같이 볼륨명이 할당되어 있음을 알 수 있었다
[그림 10] - 메모리 할당 값 확인
따라서 메모리주소 40225C~40225F는 "Code"라는 문자를 의미하며 +1연산을 진행하면
Dpef가 되고 +1 연산을 한번 더 하게 되면 아래와 같이 Eqfg가 됨을 알 수 있다
[그림 11] - +1 연산 2회 반복
[그림 12] - 입력 값 검증
[그림 11]처럼 Code가 Eqfg로 바뀐 후 코드를 실행하다보면 L2C-5781과 EqfgEngn4562-ABEX와 합쳐진 뒤 String1이 되며
lstrcmpiA 함수를 통해 String1과 사용자의 임의의 시리얼 입력 값이었던 "Loddy"와 비교 후
리턴 값이 0 즉, String1과 String2가 일치하다면 00401117로 분기 후 Yep, you entered a correct serial!이라는 값을 출력한다
따라서 사용자 시리얼 입력 값은 임의의 값이었던 Loddy가 아닌, L2C-5781EqfgEngn4562-ABEX가 되야하며
아래와 같이 해당 값을 시리얼로 입력해주었을때 올바른 메시지가 나옴을 확인할 수 있다
[그림 13] - 인증
'Wargame' 카테고리의 다른 글
CodeEngn Basic 9 (0) | 2017.09.26 |
---|---|
CodeEngn Basic 8 (0) | 2017.09.25 |
CodeEngn Basic 6 (0) | 2017.09.13 |
CodeEngn Basic 5 (0) | 2017.09.08 |
CodeEngn Basic 4 (0) | 2017.09.05 |