Jaeseo's Information Security Story

Codeengn Basic RCE 1번 문제 본문

Write UP/Codeengn - basic

Codeengn Basic RCE 1번 문제

Jaeseokim 2019. 10. 14. 00:45

01.exe 풀이 해설 - HDD CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가

 

일단 프로그램을 구동 한 다음 구조를 살펴본다.

구조를 살펴보니 GetDriveTypeA를 실행 한 다음 리턴 값을 받고 비교를 하여 CD-Rom인지 아닌지를 확인 하는 프로그램 이다.

일단 작동이 시작 되면 메시지 박스를 출력한 다음 GetDriveTypeA API를 통해 리턴값을 eax에 저장을 하게 되는데 이때 인터넷 검색을 통해 어떤 리턴 값이 Cd-Rom 인지를 찾아 보았다.

CD-ROMeax5를 리턴 받아야 한다는 사실을 알게 되었다.

그런 다음 GetDriveTypeA API를 실행 한다음의 레지스터값과 그다음에 실행되는 어셈블리어를 분석하였다.

GetDriveTypeA API의 리턴값은 3으로 반환을 받았다.

이때 CD-ROM의 리턴값은 5를 받아야 하기 때문에 EAX의 레지스터를 5로 수정 한다.

그다음 ESI1 증가시켜 401000 à 401001로 변경이 되었고

EAX1 다운 시켜 5 -> 4로 변경이 되었다.

그 다음 JMP 401021로 이동한다.

그다음 ESI1씩 증가 두번을 하여 401001 -> 401003으로 변경이 되었다.

그리고 EAX1를 다운 시켜 4 -> 3으로 변경이 되었다.

이때 CMP를 하여 EAXESI를 비교 하게 되는데

401003 3를 비교 하기 때문에 ZF0를 얻게 되고 CD-ROM이 아니라는 메시지가 출력 될것을 예상 하게 되었다.

ESI의 초기값이 401000이라는 값이 오기 떄문에 결국은 실제 “C:\\”CD-ROM이여도 오작동 한다는 것을 알게 되었다.

고로 해결 방법은 여러가지 방법이 나오게 되는데 ESI또는EAX 둘중 하나를 같게 수정 하는 방법과

또는 CMP를 한다음 ZF1로 변경하여 JMP를 작동하게 만든다.

그러면 최종적으로 위와 같은 화면을 볼수 있게 된다.

일단 이 문제를 제작자가 원하는 GetDriveTypeA의 리턴값은 5 이지만, 실제로 동작하도록 하는 리턴값은 401005이다.

정답 : GetDriveTypeA == 5 or 401005

01.7z
0.00MB

pass : codeengn

 

'Write UP > Codeengn - basic' 카테고리의 다른 글

Codeengn Basic RCE 6번 문제  (0) 2019.11.15
Codeengn Basic RCE 5번 문제  (0) 2019.10.14
Codeengn Basic RCE 4번 문제  (0) 2019.10.14
Codeengn basic RCE 3번 문제  (0) 2019.10.14
Codeengn Basic RCE 2번 문제  (0) 2019.10.14
Comments