2015년 4월 12일 일요일

CodeEngn Basic RCE L01

오늘부터 CodeEngn의 리버싱 문제인 Basic RCE를 풀어보겠습니다.
정답은 적지 않고 풀이 방법을 적겠습니다.

1번 문제입니다
HDD를 CD-Rom으로 인식하기 위한 GetDriveTypeA의 리턴값을 찾는 문제입니다.
GetDriveType API를 검색해보면 답을 쉽게 얻을 수 있지만
내부를 확인해 보겠습니다.


처음 프로그램을 키면 위와 같이 나옵니다.


CD롬이 아니라고 뜨는군요.
OllyDbg로 열어보겠습니다.


프로그램이 매우 간단합니다.

소스를 분석해보자면
MessageBox로 처음 봤던 박스를 보여줍니다.
GetDriveType을 사용했기에 EAX에 드라이브값에 따른 숫자가 들어갑니다.

그후
INC ESI   //  ESI+1
DEC EAX //  EAX-1
JMP 00401021은 바로 아래 구문으로 이동하는것이므로 무시합니다.
INC ESI  //  ESI+1
INC ESI  //  ESI+1
DEC EAX  //  EAX-1
CMP EAX, ESI

CMP 구문입니다. 
CMP 구문은 두 인자를 비교한 후 값이 같으면 ZF(제로플래그)를 1로 바꾸어줍니다
(첫인자 - 두번째 = 0 이면 값이 ZERO이므로 ZERO Flag == 1
0이 아니면 값이 ZERO가 아니므로 ZERO Flag == 0)

위 구문은 EAX와 ESI의 값을 비교합니다.

JE 00401030 

JE는 점프 구문으로 Jump If Equal의 약자로 ZF가 0
값이 같을때 실행됩니다.

00401030은 성공 구문이므로

EAX와 ESI가 값이 같다면 성공하는 것입니다.

위 계산식을 정리하면
EAX에 값을 넣고
DEC EAX 2번, INC ESI두번을 하고 값을 비교합니다.

EAX(구하려는값)-2=INC(0)+3

이란 식이 만들어집니다.

답은 따로 적지않겟습니다.

댓글 없음:

댓글 쓰기