코드엔진 Basic RCE L01 Write UP

War Game

2019. 6. 26. 23:31

반응형

프로그램을 실행해보면 자신이 있는곳을 CD-Rom으로 인식하게끔 하라고 한다.

올리 디버거를 통해 프로그램을 뜯어보면 굉장히 짧은 코드가 눈에 보인다.

해당 프로그램에 들어있는 함수들은 총 3가지이다.

 

MessageBoxA - 시스템 아이콘, 단추 집합 및 상태 또는 오류 정보와 같은 간단한 응용 프로그램 관련 메시지가 포함된 모달 대화 상자를 표시한다. 메시지 상자는 사용자가 클릭 한 단추를 나타내는 정수 값을 반환한다.

 

GetDriveTypeA - 디스크 드라이브가 이동식, 고정식, CD-Rom, Ram 디스크 또는 네트워크 드라이브 중 어느것인지를 결정한다.

 

ExitProcess - 호출 프로세스와 모든 스레드를 종료합니다.

 

사용된 함수들을 보면 해당 문제에서는 GetDriveTypeA 부분을 자세히 봐야한다는걸 알 수 있다.

그렇기 때문에 GetDriveTypeA를 MSDN을 통해 자세히 알아보자.

GetDriveTypeA의 리턴값을 확인해보면 CD-Rom의 경우 5를 반환해주는걸 알 수 있다.

이 프로그램은 어떤 값을 반환하는지 알기 위해 프로그램에 BP를 걸어준 후 실행해보자.

레지스터를 확인해보면 EAX에 3의 값이 들어가있다.

그리고 아래 코드들을 지나가면 EAX에는 최종적으로 1이 들어가게 된다.

해당 연산을 파악하기 위해 연산에 사용된 어셈블리 명령어를 정리해보자.

 

INC - 1+

DEC - 1-

 

INC는 1을 더해주고 DEC는 1을 빼준다.

여기서 ESI는 데이터를 조작하거나 복사시에 소스 데이터의 주소가 되는 지접이다.

 

연산을 읽어보면 ESI에는 총 3이 더해지고, EAX에는 총 2가 빠지게 된다.

그 후 CMP연산을 통해 두 값을 뺄 때 0이 안되므로 ZF에는 1이 안올라가게 되고,

JE를 타지 못하고 그대로 실패 문자열에 도달하게 된다.

 

해당 문제를 해결하기 위해선 ZF를 1로 올려주면 된다는 간단한 결론에 도달하게 된다.

JE문에 도달했을 때 ZF를 1로 올려주면 JE문을 타고 성공문자열로 넘어갈 수 있다.

성공

반응형

'War Game' 카테고리의 다른 글

코드엔진 Basic RCE L06 Write UP  (0) 2019.06.30
코드엔진 Basic RCE L05 Write UP  (0) 2019.06.27
코드엔진 Basic RCE L04 Write UP  (0) 2019.06.27
코드엔진 Basic RCE L03 Write UP  (0) 2019.06.27
코드엔진 Basic RCE L02 Write UP  (0) 2019.06.27