우선 문제 파일을 다운받으면 7z로 압축되어있다.
7zip을 다운받아 압축을 해제 하고 실행해보자.



주어진 문제는 HDD를 CD-Rom으로 인식 시키는 것이다.
x32dbg로 열어서 OEP로 가보자

코드를 보면 첫번째 MessageBoxA를 호출하는 함수가 보인다.
그림1을 띄우는 코드이다.
그 이후 GetDriveTypeA라는 함수를 호출하고 0x00401024주소의 cmp구문을 실행후 결과에 따라 Error또는 YEAH!라고 성공을 의미하는 듯한 메시지 박스를 호출하는 분기문이 보인다.
GetDriveTypeA함수를 호출한 후 레지스터를 확인하면 다음과 같다.

EAX레지스터에 값 3이 반환이 되었다.
이후 구문을 보면 esi값은 총 3을 증가시키고, eax의 값은 2만큼 감소 시킨다.
그러면 cmp구문에서 각각의 레지스터 값은 eax 1, esi 00401003이 된다.
그렇다면 계산을 해봤을때 EAX레지스터의 값은 GetDriveTypeA함수가 반환한 값 -2가 00401003이어야하므로 00401005가 되어야한다.
하지만 GetDriveTypeA라는 함수의 공식문서를 확인하면 반환값은 정해져있다.

최대가 6까지이다.
사실 여기서 대충 유추하기론 ESI의 값이 초기에 0이었다는 가정하에 5가 반환이 되면 딱 맞는 답이다.
그런데 ESI가 00401000으로 설정되어있는게 이상해서 다른 사람이 풀이 한것도 찾아봤는데 다른사람들은 ESI값이 0으로 잘 설정 되어있었다,,,
그래서 머리를 굴린 결과 나만의 방법을 찾았다.

여기 코드를 잘보면 중간에 jmp 01.401021이라는 아무의미 없이 다음 구문으로 점프하는 가비지 코드가 2바이트 있다.
보면 알겠지만 우린 저 esi값이 증감 이전에 0으로만 만들어지면 된다.
그래서 코드를 xor을 사용해서 아래와 같이 수정했다.

xor 구문이 딱 2바이트 크기여서 증감구문을 한줄씩 아래로 밀고 esi를 초기화 하는 코드를 넣으니 딱 맞았다.
이렇게 수정하고 eax값을 GetDriveTypeA함수 호출 이후 5로 수정하니 성공했다.

그리고 비교문에서 각각의 레지스터 값을 확인하면 다음과 같다.

EAX와 ESI모두 3으로 동일하다.

그리고 정답은 예상한대로 5가 맞았다.
이 문제의 의도는 사실 레지스터의 증감 코드를 잘 확인해서 EAX의 값을 유추하는 것이었는데 생각외로 ESI 레지스터의 초깃값이 0이 아니라 EP로 설정되어있는 탓에 애를 좀 먹었다. 하지만 중간에 있던 가비지 코드를 이용해서 문제를 해결 할 수 있었다.