본문 바로가기
리버싱/CodeEngn 문제해결

Basic L01

by 멍청이 개발자 2026. 9. 15.
반응형

우선 문제 파일을 다운받으면 7z로 압축되어있다.

7zip을 다운받아 압축을 해제 하고 실행해보자.

그림0. 문제화면
그림1. 실행했을때 화면
그림2. 확인을 누르면 에러가 뜬다

주어진 문제는 HDD를 CD-Rom으로 인식 시키는 것이다.

x32dbg로 열어서 OEP로 가보자

코드를 보면 첫번째 MessageBoxA를 호출하는 함수가 보인다.

그림1을 띄우는 코드이다.

그 이후 GetDriveTypeA라는 함수를 호출하고 0x00401024주소의 cmp구문을 실행후 결과에 따라 Error또는 YEAH!라고 성공을 의미하는 듯한 메시지 박스를 호출하는 분기문이 보인다.

GetDriveTypeA함수를 호출한 후 레지스터를 확인하면 다음과 같다.

그림3. GetDriveTypeA호출 이후 레지스터

EAX레지스터에 값 3이 반환이 되었다.

이후 구문을 보면 esi값은 총 3을 증가시키고, eax의 값은 2만큼 감소 시킨다.

그러면 cmp구문에서 각각의 레지스터 값은 eax 1, esi 00401003이 된다. 

그렇다면 계산을 해봤을때 EAX레지스터의 값은 GetDriveTypeA함수가 반환한 값 -2가 00401003이어야하므로 00401005가 되어야한다.

하지만 GetDriveTypeA라는 함수의 공식문서를 확인하면 반환값은 정해져있다.

그림4. GetDriveTypeA의 반환값

최대가 6까지이다.

 

사실 여기서 대충 유추하기론 ESI의 값이 초기에 0이었다는 가정하에 5가 반환이 되면 딱 맞는 답이다.

그런데 ESI가 00401000으로 설정되어있는게 이상해서 다른 사람이 풀이 한것도 찾아봤는데 다른사람들은 ESI값이 0으로 잘 설정 되어있었다,,,

 

그래서 머리를 굴린 결과 나만의 방법을 찾았다. 

그림5. 증감코드

여기 코드를 잘보면 중간에 jmp 01.401021이라는 아무의미 없이 다음 구문으로 점프하는 가비지 코드가 2바이트 있다.

보면 알겠지만 우린 저 esi값이 증감 이전에 0으로만 만들어지면 된다. 

그래서 코드를 xor을 사용해서 아래와 같이 수정했다.

그림6. 수정한 코드

xor 구문이 딱 2바이트 크기여서 증감구문을 한줄씩 아래로 밀고 esi를 초기화 하는 코드를 넣으니 딱 맞았다.

이렇게 수정하고 eax값을 GetDriveTypeA함수 호출 이후 5로 수정하니 성공했다.

그림7. EAX레지스터 값을 임의로 5로 수정했다.

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

그림8. EAX값과 ESI값을 확인

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

그림9. CD-Rom으로 인식시키는데 성공했다.

 

그리고 정답은 예상한대로 5가 맞았다.

 

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

반응형

'리버싱 > CodeEngn 문제해결' 카테고리의 다른 글

Basic L06  (0) 2026.09.15
Basic L05  (0) 2026.09.15
Basic L04  (0) 2026.09.15
Basic L03  (0) 2026.09.15
Basic L02  (0) 2026.09.15