본문 바로가기

Hacking/Reversing

CodeEngn_basic_1

basic RCE L01

 

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


본격적으로 문제를 풀기 위해서 우선은 프로그램을 실행시켜보자

 

 

프로그램을 실행시켰더니 당신의 HD를 CD-Rom이라고 생각하게 만들라는 텍스트를 출력한다. 

그 뒤에 확인을 누르면

 

 

 Error창과 함께 지금의 HD는 CD-Rom이 아니라고 출력한다.

 


 

자 이제 프로그램은 실행시켜 봤으니 이제 디버거인 ollydbg로 파일을 디버깅 해보자

 

 

우선 이 프로그램을 대충 분석해보면 massagebox로 "Make me think your HD is a CD-Rom"라는 문구를 출력한뒤에 현재 드라이브의 타입을 가져온 뒤에 그 값을 esi에 저장한 뒤 eax와 비교해서 같으면 성공을 출력하는 코드부분으로 점프하고 그렇지 않으면 실패가 뜨는 코드부분으로 그대로 진행된다. 

여기에서 우리가 유심히 봐야 하는 부분은 비교문( JE )이다.

 

 

위의 cmp로 EAX와 ESI를 비교하는데 그 아래에 JE는 같을 때 점프한다는 의미를 가지고 있기 때문에 EAX와 ESI가 같으면 성공부분으로 점프한다. 

CMP 부분의 값을 똑같은 값 ( EAX, EAX 또는 ESI, ESI ) 로 변경하면 우리가 원하는 성공부분을 출력시킬 수는 있겠지만

CodeEngn에서 원하는 정답인 GetDriveTypeA의 리턴값을 알기 위해서는 일단 GetDriveTypeA를 호출하는 부분의 바로 아래에 BP를 걸면 어떤 값을 리턴하는지 알아낼 수 있을것이다.

 

 

 

BP를 걸어보면 EAX에 3이라는 값이 리턴되었다는 것을 알 수 있다.  ( EAX에는 리턴된 값이 저장된다. )

 

 

보면 CMP를 하기 전에 ESI에는 INC를 3번 진행하고 EAX에 DEC를 2번 진행하는 걸 볼 수 있는데 INC는 operand에 1을 더해주는 역할을 하고 DEC는 operand에 1을 빼주는 역할을 하기 때문에 EAX - 2, ESI + 3을 해준다. 

 

 

결과 EAX에는 1이라는 값이 할당되어있고 ESI에는 3이라는 값이 할당되어 있다. ( ESI의 3 앞에 있는 0040100는 주소같은 것?이니 무시한다. )

우리는 이 두 값을 같게 하기 위해서 우리는 어느 한쪽의 값을 조작해야하는데 우리는 GetDriveTypeA의 리턴값을 조작해야하기 때문에 GetDriveTypeA의 리턴값에 +2를 해주면 된다.

'Hacking > Reversing' 카테고리의 다른 글

CodeEngn_basic_6  (0) 2020.06.11
CodeEngn_basic_5  (0) 2020.06.09
CodeEngn_basic_4  (0) 2020.06.07
CodeEngn_basic_3  (0) 2020.06.07
CodeEngn_basic_2  (0) 2020.06.06