프로그램을 실행해보면 자신이 있는곳을 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 |