Study
CodeEngn Basic 07 본문
7. CodeEngn Basic 07
7.1 문제 풀이
해당 파일에서 사용되는 함수 목록이다.
드라이브 정보를 추출하는 함수로 보이는 부분을 찾았다. BP를 걸고 진행하여 해당 함수로 가보자.
해당 함수를 호출하기 위한 인자들이 스택상에 쌓인 모습이다.
여기서 잠깐 멈추고 MSDN에서 GetVolumeInformationA 함수에 대한 정보를 찾아보자.
첫 번째 인자 lpRootPathName에 대한 설명이다.
NULL을 지정하면 현재 경로의 루트 디렉터리가 지정된다.
내 경우, 파일이 존재하는 곳은 바탕화면이므로 루트 디렉터리는 C:\가 된다.
문제를 풀기 위해서는 드라이브 이름을 CodeEngn으로 바꾼 후 시도해야 하는데.. 어.. 그냥 바꾸기 싫었다.
그렇다고 "로컬 디스크"라는 이름으로 관찰하고싶지도 않았기 때문에 일단은 "D:\"를 인자로 넣어 실행해보았다.
함수 인자 수정은 다음과 같이 하면 된다.
우선 스택상에 lpRootPathName 값으로 입력된 주소가 NULL이기 때문에 새로 문자열의 주소로 수정해주어야 한다.
나는 사용되지 않는 위치에 "D:\"를 입력해두었다.
그 후
스택에서 lpRootPathName의 값을 해당 주소로 수정한다.
그다음 함수를 실행시키면 EAX에는 함수 성공을 알리는 1이 저장되고, 버퍼인 VolumeNameBuffer 멤버의 값인 0040225C위치에 문자열 "GSP1RMCkHPFRER_KO_DVD"가 입력된다.
이 문자열이 어떻게 되는지 더 실행시켜보자.
DL 레지스터에 2가 세팅되고 반복문이 돌면서 DL이 1씩 감소한다. 2번 반복된다는 의미이고 그 내용은 한번 루프가 돌 때마다 0040225C~0040225F 위치의 값을 각각 1씩 증가시키는 내용이다.
루프를 1회 돌자 해당 위치의 값이 HTQ2가 되었다.
그럼 여기에서 정답을 추측해볼 수 있다.
CodeEngn을 넣었다면 Code 부분의 Hex 값이 각각 2씩 증가한 형태가 된다.(____Engn)
7.2 Comment
이 문제에서 얻어가야 할 것은 무엇인가...
'Reversing > 코드엔진' 카테고리의 다른 글
CodeEngn Basic 06 (0) | 2019.06.15 |
---|---|
CodeEngn Basic 05 (0) | 2019.06.15 |
CodeEngn Basic 04 (0) | 2019.06.15 |
CodeEngn Basic 03 (0) | 2019.06.13 |
CodeEngn Basic 02 (0) | 2019.06.13 |