코드엔진 Basic RCE L07 문제를 풀어보았다.
문제는 다음과 같다. 컴퓨터 C드라이브의 이름이 CodeEngn일 경우 시리얼이 생성될 때 CodeEngn은 '어떤것'으로 변경되는지 물어보고 있다.(B는 오타인 것 같다.)
먼저 파일을 실행시켜 아무 값이나 넣어보았다. 틀렸다는 창이 뜬다.
DIE에 올려보았다. 패킹되어있지는 않았다고 뜬다.
IDA에 올려보자. 다음과 같은 win32api가 뜨는데, 대화상자를 띄워주는 DialogBoxparamA에서 DialogFunc에 들어갔다.
함수가 sub_401056, sub_4010112D 이렇게 두개 보이는데 아래쪽 함수는 종료 함수라서 위쪽 함수에 들어가봤다. 위에서부터 분석해보자.
가장 먼저 보이는 함수는 GetDlgItemTextA함수이다. 대화 상자의 컨트롤과 연결된 제목 또는 텍스트를 검색하는 함수라는데, 그리 중요해보이지는 않는다.
다음으로 보이는 함수는 GetVolumeInformationA함수이다. 파일 시스템 및 볼륨에 대한 정보를 검색하는 함수로, 문제와 직접적으로 관련된 함수로 보인다.
특히 두번째 인자인 VolumeNameBuffer가 중요해보이는데, C드라이브의 이름이 문제에서 필요하기 때문이다.
그 다음으로 보이는 함수는 lstrcatA이다. lstrcat함수는 한 문자열을 다른 문자열에 추가하는 함수이다.
lstrcatA(VolumeNameBuffer, String2)을 했으므로 VolumeNameBuffer의 문자열과 String2의 문자열이 합쳐져 VolumeNameBuffer에 들어간다.
즉, VolumeNameBuffer = VolumeNameBuffer + String2가 되는 것이다.
그리고 v6번(2번) 만큼의 연산을 한다. 이 연산(do while) 부분은 디버깅을 하여 자세히 알아보았다.
<! 디버깅 과정 !>
C드라이브의 이름을 CodeEngn으로 바꾸고 x64dbg로 디버깅해봤다.
디컴파일된 코드에서 v6은 레지스터에서 dl과 같다. CodeEngn에서 'Code'부분의 아스키코드를 1씩 증가시켜 덮어씌우는(add 명령어) 과정을 2번(v6번=dl번) 반복한다.
모든 과정을 끝낸 후에는CodeEngn
이EqfgEngn
로 변경된 것을 확인할 수 있다.
이러한 과정을 통해 VolumeNameBuffer는 EqfgEngn
이 되었고, String는 4562-ABEX
이므로 lstrcatA(VolumeNameBuffer, String2)에 의해 VolumeNameBuffer는 EqfgEngn4562-ABEX
가 된다.
다음 디컴파일된 코드로 넘어가보았다. 아래의 코드에 의해 byte_402000에는 L2C-5781
과 VolumeNameBuffer의 문자열이 추가되게 된다.
VolumeNameBuffer가 EqfgEngn4562-ABEX
이므로 byte_402000는 aL2c5781인 L2C-5781
에 EqfgEngn4562-ABEX
을 더한 L2C-5781EqfgEngn4562-ABEX
가 된다!
마지막으로 lstrcmpiA함수로 byte_402000와 String를 비교한다.