문제는 다음과 같다.

우선 파일을 PEView로 보니 따로 패킹이 되어있거나 하진 않은것 같다.

프로그램을 한 번 실행해보자.

위와 같이 시리얼을 입력 할 수 있는 창이 뜨고 체크버튼을 누르면 에러가 뜬다.
x32dbg로 열어서 OEP에 가보자.

코드를 보면 눈에 띄는 점이 GetDlgItemTextA다. 이를 통해서 아마 사용자가 입력한 시리얼을 가져올 것이다.
해당 지점에 BP를 걸고 "Hello"를 입력후 체크버튼을 눌러봤다.

402324주소로 사용자가 입력한 값이 저장되었다.
이후 보이는 함수는 GetVolumeInformationA라는 함수이다.

공식문서에 써있는 GetVolumeInformationA라는 함수를 보면 매개변수를 8개 받는다.
위에서도 8번의 push문을 통해서 매개변수를 전달해주는 모습을 볼 수 있다.
GetVolumeInformationA의 반환값은 공식문서에 따르면 오류가 생겼을경우엔 0이외엔 0이 아닌 다른 값이 들어있다고 한다.
그리고 매개변수를 보면 알겠지만 주석에 out이라고 적혀있는곳은 매개변수가 포인터로 전달된다. 포인터에 값을 새기는 형식이다.

GetVolumeInformationA의 두번째 매개변수인 lpVolumeNameBuffer로는 40225c의 주소가 전달된다.
이 값과 "4562-ABEX" 를 매개변수로 하여 lstrcat을 호출한다.

공식문서를 보면 지정된 볼륨의 이름을 저장시킨다.
그 말인즉슨 lstrcat에서 lpVolumeNameBuffer(0x40225c) + 4562-ABEX가 일어난다는 것이다.
그래서 GetVolumeInformationA함수를 실행후 40225c주소의 값을 확인해보면 NULL값 0이 들어있다.
그 이유는 간단하다.

Cmd에서 vol명령어를 쳐보면 C드라이브에는 볼륨이름이 없는것을 볼 수 있다.
그래서 문제에서 말한것은 C드라이브의 이름이 CodeEngn으로 지정되었을 경우를 가정했다.
그렇다면 40225c주소에는 CodeEngn이 저장되었을 것이고 lstrcat을 실행후 40225c주소에는 CodeEngn4562-ABEX라고 저장되었을 것이다.

암호화라고 하기엔 뭐하지만 아무튼 40225c부터 이후 4번째 글자 까지 1씩 증가시키는 코드를 총 2회 반복한다.
dl에 2를 넣은후 dl이 0이 될때까지 반복을 하고 있다.
그렇다면 CodeEngn4562-ABEX는 2씩 증가하면 EqfiEngn4562-ABEX가 되었을것이다.
그 이후 lstrcat함수로 L2C-5781에 EqfgEngn4562-ABEX값을 더한다. 그럼 결과는 L2C-5781EqfgEngn4562-ABEX가 된다.
이후 이 값을 사용자가 입력했던 "Hello"와 lstrcmpi라는 함수를 호출하여 비교한다.
물론 현재로썬 40225c가 4562-ABEX값 그대로 이므로
암호화 코드에서 6784-ABEX가 되고 L2C-5781에 더해지면 L2C-57816784-ABEX가 된다.

그렇다면 이번엔 드라이브 이름을 직접 CodeEngn으로 변경후 시도 해보았다.


위와 같이 잘 작동하는 것을 알 수 있다.
문제에서 CodeEngn이 어떤것으로 변경되냐고 물었으므로 정답은 EqfgEngn 이다.
이 문제는 간단한 어셈블리어 코드로 암호화 작업을 하는 것을 파악하는 문제인것 같다.