리버싱/리버싱 문제 코드엔진

코드엔진 Basic RCE L01

상세 2021. 5. 13. 00:52

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

답 : 5

 

 

이 문제는 리버싱 과정 없이 사실 구글에 GetDriveTypeA라는 함수를 검색후 마이크로소프트 문서에서 CDROM일 경우의 리턴값을 찾아서 답을 입력해서 풀수도 있는 단순한 문제이다. 그러나 이렇게 문제를 푸는건 프로그램의 동작방식을 분석하는 방법이 아니므로 OllyDbg로 파일을 열고 분석해보았다.

 

일단 디버거로 분석하기전 그냥 프로그램을 실행해서 프로그램이 어떻게 동작하는지 살펴보았다.

1번 사진
2번 사진

처음에  1번 사진이 뜨고 자신이 나의 하드디스크를 CD-ROM으로 인식하게 만들라고 말한다.

확인을 누르면 CD-ROM이 아니라고 말하며 다시 확인을 누르면 프로그램이 종료된다.

프로그램의 동작방식은 이정도면 알게 되었으니 이제 디버거로 분석해보자.

 

이 프로그램은 길이가 상당히 짧다. 그만큼 분석하기 쉽다는 의미인것 같다. 

중요한 코드부분별로 나누어서 설명하겠다.

 

00401002 ~ 0040100E

0040100E의 MessageBoxA 서브루틴을 호출하기 위해 인자를 스택에 집어넣는 중이다. 

0040100C까지 실행하면 스택에 방금 집어넣은 인자들이 새로 들어있는게 보인다.

이 인자들을 통해 MessageBoxA(1번 사진 참고)를 띄운다. 자세히 보면 전달된 Text와 Caption이 

각각 메세지박스의 프레임과 텍스트로 쓰였다는것을 알 수 있다.

 

00401013 ~ 00401018

00401013을 보면 다음줄에 있는 GetDriveTypeA함수가 호출되기전 무언가를 스택에 집어넣는것으로 보아

함수의 인자라는것을 짐작할수 있다. 자 이제 문제에 나왔던 GetDriveTypeA함수가 등장했다. 구글에

검색해서 어떤 함수인지 알아보자.

사진을 보면 인자는 1개로 드라이브의 루트 디렉토리라고 한다. (뭔지 정확히는 잘 모르지만 일단 넘어가자.)

그후 함수가 호출되면 리턴값으로 3이 리턴된다는것을 알 수 있다. (인자로 하드 디스크의 루트 디렉토리를 줬나 보다.)

함수를 실행하니 EAX 레지스터가 3으로 바뀌었다. 아마 함수가 리턴한 값을 저장했나보다.

 

0040101D ~ 00401023

INC, DEC가 계속 등장하는데 각각 레지스터의 값을 1씩 더하고 빼는 명령어이다.

그럼 잘 살펴보면 INC ESI 명령어가 3번 나오고 DEC EAX가 2번 나오는데 

EAX 레지스터는 3 - (1 * 2) = 1 이된다. 그리고 ESI레지스터는 00401000 + (1 * 3) = 00401003이 된다.

(원래 00000003이 되어야 한다는데 나는 왜 이렇게 나오는지 잘 모르겠다.)

 

00401024 ~ 00401026

CMP EAX, ESI가 보이는데 이 명령어는 두 값을 비교해서 같으면 제로 플래그 값을 1로 바꾼다.

그후 JE SHORT 0040103D라는 명령어가 있는데 이 명령어는 만약 제로플래그가 1이면 

(JUMP EQUAL) 0040103D로 점프한다는 의미이다.

 

그러나 위에서 말했든 두 값은 1과 3으로 다르니 실행되지 않고 그냥 밑으로 내려간다.

00401028 ~ 0040103B

비교한 값이 같지 않으므로 처음에 보았던 메시지 박스 (사진 2)가 뜨고 프로그램이 종료된다.

(이때 밑에 있는 0040103D ~ 0040104B는 실행되지 않는다.)

 

0040103D ~ 00401050

만약 CMP EAX, ESI 를 비교했을때 같다면 실행하게 된다.

익숙한 형태를 보니 메시지 박스에 어떤 말이 나올지는 예상이 간다. 실제로 함수가 실행되면 이런 성공화면이 뜬다.

성공화면

성공화면 보기

그렇다면 이 화면은 어떻게 띄울까? 방법은 여러가지이다. 자주 보았던 JMP 명령어을 바꾸어 바로 여기로 점프되게 할수도 있고 아까의 비교 명령이 참이 되게 레지스터 값을 점프문을 통해 같게 할수도 있다. 마지막으로 중요한 결과 분기점인 JE SHORT 0040103D라는 명령어에서는 제로 플래그가 1이면 점프한다고 했으니 비교명령어 실행후 제로 플래그를 1로 바꾸고 F8을 눌러 점프 명령어를 실행하면 성공화면을 띄울수 있다.

'리버싱 > 리버싱 문제 코드엔진' 카테고리의 다른 글

코드엔진 Basic RCE L06  (0) 2021.07.13
코드엔진 Basic RCE L05  (0) 2021.05.25
코드엔진 Basic RCE L03  (0) 2021.05.18
코드엔진 Basic RCE L02  (0) 2021.05.18
코드엔진 Basic RCE L04  (0) 2021.03.20