Level 06에 이어서 Level 07을 풀어보겠습니다.
실행해 보니 위와 같은 메시지가 출력됩니다.
C드라이브의 이름이 "CodeEngn"일 경우 시리얼이 생성된 다는 것을 보니..
프로그램 내부에서 C드라이브의 이름 값을 가져오는 함수가 있을 것 같네요.
그리고 Serial을 넣는 프로그램이지만, 문제 자체에서 CodeEngn이 어떤것으로 변경되는지 찾는 문제 이기에
Serial값을 찾는 것 보다는, CodeEngn이 어떻게 변경되는지 초점을 두어 분석하면 될 것 같습니다.
올리디버거에서 코드부분에 우클릭하여 "All intermodular calls"를 클릭하면 프로그램에서 불러오는 함수들의 목록을 볼 수 있습니다.
예상 했던 것과 같이, 드라이브의 정보를 받아오는 함수가 존재합니다.
해당 부분에 브레이크포인트를 걸고 문제대로 C드라이브에 이름을 "CodeEngn"으로 변경 뒤, 실행해 보겠습니다.
위 처럼, GetVolumeInformationA함수 실행 이후 해당 볼륨의 이름값을 가져오는 것을 알 수 있습니다.
이제 "CodeEngn"이라는 문자열이 어떻게 변경되는지만 분석하면 끝납니다.
다음에는 lstrcatA 라는 함수가 기다리고 있습니다.
인자 값으로 "4562-ABEX"문자열과 좀 전에 볼륨 이름을 얻어낸 "CodeEngn" 문자열을 인자로 받습니다.
함수 이름에서 유추해보면 String값을 이어붙어주는 함수 일것 같다는 생각이드네요.
C언어 함수중에 strcat이라는 함수가 있죠. (프로그래밍을 하다보면 이름만 보고도 쉽게 유추가 가능합니다.)
역시나 생각처럼 두 문자열이 이어 붙어졌습니다.
중요한 것은 다음부터 입니다.
DL값에 2를 넣고, 아래의 ADD를 4번 수행 한 후, DL값을 1씩 줄이고 JNZ명령어를 사용하는 것으로 보아 반복문으로 보여집니다.
즉, 2번을 반복하고 빠져 나오는 명령어인것이죠.
ADD명령어를 수행하는 메모리 주소로 가보니 앞에서 만들어진 문자열이 들어 있습니다.
ADD명령어가 영향을 미치는 부분은 0x0040225C ~ 0x0040225F 까지 이므로, "Code"문자열만 해당 됩니다.
ADD명령어로 0x0040225C~0x0040225F의 Hex값을 1씩 증가 시키고 이를 1번더 반복합니다.
예를들어 "CodeEngn"의 첫번째 문자 C는 Hex값으로 43입니다.
43을 1 증가시키면 44가 되게 되고, 44는 문자로 D가 됩니다.
따라서, 1번 루프가 돌게 되면 "CodeEngn" -> "DpefEngn"이 되고,
한번 더 반복 되므로 "DpefEngn" -> "EqfgEngn"이 됩니다.
따라서 최종적으로 "CodeEngn" -> "EqfgEngn"이 되게 됩니다.
문제에서는 "CodeEngn"이 "어떤것"으로 변경 되는지를 찾는게 문제이므로 답은 "EqfgEngn"이 됩니다.