[문제]
[풀이]
문제 파일을 다운하여 임의의 문자열을 넣고 실행해보면 error 메시지가 출력된다.
GetDlgItemText 함수와 GetVolumeInformation함수, strcat함수가 눈에 띈다.
GetDlgItemText 함수는 입력 값을 가져온다.
00401097 6A 00 push 0 ; RootPathName = NULL
-> RootPathName = NULL이면 C:\를 말한다!
GetVolumeInformation함수는 드라이버의 정보를 가져온다.
가져온 정보는 위의 버퍼에 저장된다!
004010A8 E8 94000000 call <jmp.&KERNEL32.lstrcatA> ; \lstrcatA
-> strcat 함수: 문자열 붙여주는 함수, 인자 값으로 4562-ABEX와 07.0040225C 값을 가져와서 붙여준다.
-> 07.0040225C는 드라이버 이름을 가리키는데 현재 비어있으므로 strcat 함수를 호출 후에도 4562-ABEX가 된다!
004010AD |. B2 02 mov dl, 2
004010AF |> 8305 5C224000 >/add dword ptr ds:[40225C], 1
004010B6 |. 8305 5D224000 >|add dword ptr ds:[40225D], 1
004010BD |. 8305 5E224000 >|add dword ptr ds:[40225E], 1
004010C4 |. 8305 5F224000 >|add dword ptr ds:[40225F], 1
004010CB |. FECA |dec dl
004010CD |.^75 E0 \jnz short 07.004010AF
-> dl 에 2를 넣고 각 자리에 대한 add 1을 진행한다.
각 자리 값 값을 연산하여 L2C-5781뒤에 붙여주면서 최종 시리얼 값을 나타낸다.
C드라이브 이름을 문제에서 제시한 CodeEngn으로 변경한 후에 이 과정을 살펴보면 이해가 잘된다.
C드라이브 이름을 바꿔준 뒤에 07.exe 파일을 ollydbg로 열어서 실행해보면,
GetVolumeInformation 함수 호출후에 CodeEngn이 들어간 것을 볼 수 있다.
strcat 함수를 지나고 나면 4562-ABEX가 CodeEngn 뒤에 덧붙게 된다.
mov dl 2부분을 통해서 2번 반복하는 것을 알 수 있고, 각각 진행해보면 다음과 같다.
CodeEngn -> DodeEngn
CodeEngn -> DpdeEngn
CodeEngn -> DpeeEngn
CodeEngn -> DpefEngn
===================2번째 반복========================
CodeEngn -> DpefEngn -> EpefEngn
CodeEngn -> DpefEngn -> EqefEngn
CodeEngn -> DpefEngn -> EqffEngn
CodeEngn -> DpefEngn -> EqfgEngn이 되고 strcat 함수를 지나면서 최종적으로 EqfgEngn4562-ABEX이 된다.
이후에는 strcat이 다수 호출되는데,
1번째 strcat 부분을 지나면 L2C-5781이 EqfgEngn4562-ABEX과 합쳐질 준비를 하게 되고,
2번째 strcat 부분을 지나면 L2C-5781EqfgEngn4562-ABEX로 최종 시리얼이 완성된 것을 볼 수 있다.
해당 값을 실행 파일에 넣어보면 정답 메시지가 출력되는 것을 볼 수 있다.
'Wargame > CodeEngn' 카테고리의 다른 글
[CodeEngn] Basic RCE L09 (0) | 2021.08.11 |
---|---|
[CodeEngn] Basic RCE L08 (0) | 2021.08.04 |
[CodeEngn] Basic RCE L05 (0) | 2021.07.29 |
[CodeEngn] Basic RCE L04 (0) | 2021.07.22 |
[CodeEngn] Basic RCE L03 (0) | 2021.07.22 |