본문 바로가기

CodeEngn

[CodeEngn] Basic RCE L01

<문제>

 

<풀이>

1. 문제 다운로드

우선 문제에 들어있는 첨부파일을 다운로드한다.

문제에 있는 디스크 아이콘을 클릭하면 01.7z 라는 이름의 파일을 다운로드할 수 있다.

 

https://www.7-zip.org/ 에서 7zip을 다운로드하여 설치한다.

7zip은 압축을 풀 때 사용할 툴인데, 리버싱 문제파일을 일반적인 방식으로 압축해제할 경우, 악성코드로 인식되어 제대로 압축이 안 풀리는 경우가 있어서 이 툴을 사용한다.

 

 

2. 문제 파일 실행

설치한 7-Zip File Maneger 를 실행한다.

다운로드한 01.7z 파일이 위치한 경로로 이동한다.

해당 파일을 클릭하여 선택한 뒤 파란 - 아이콘을 클릭해 Extract 한다.

 

password는 문제에 써있는 codeengn을 입력하면 된다.

OK를 클릭하면 Extract to: 에 설정한 경로에 압축이 풀린 파일이 생긴다.

 

 

이제 생성된 폴더로 들어가보면 01.exe 라는 실행파일을 확인할 수 있다.

더블클릭하여 실행해본다.

위와 같은 창이 뜬다.

HD를 CD-Rom으로 인식하도록 만들라는 문구를 확인할 수 있다.

 

일단 OK를 클릭해 프로세스를 진행시켜본다.

CD-ROM 이 아니라는 문구가 뜬다.

OK를 클릭하면 프로세스가 종료된다.

 

 

3. 디버깅

디버깅 툴은 여러가지가 있다. 대부분 기능이 비슷하여 본인에게 편한 것을 다운받아 사용하면 된다.

> 올리디버거

https://ladybug.tistory.com/entry/%EC%98%AC%EB%A6%AC%EB%94%94%EB%B2%84%EA%B1%B0Ollydbg-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95

> 이뮤니티디버거

https://www.immunityinc.com/products/debugger/

 

 

디버거를 이용해 01.exe를 열어본다.

문제에서 GetDriveTypeA 함수의 리턴값이 무엇이 되어야 하느냐고 묻고 있다.

따라서 GetDriveTypeA 함수를 CALL 하는 부분에 Breakpoint를 건다.

(해당 명령어 줄을 클릭하고 F2 를 누르면 된다.)

 

서로 다른 문구를 출력하는 두 개의 MessageBoxA 함수가 있다.

하나는 Error이고 하나는 YEAH!이다.

Ok, I really think that your HD is a CD-ROM! :p를 출력하는 YEAH!가 있는 함수를 실행해야 한다.

 

어떤 MessageBoxA 함수를 실행할지 분기되는 명령어는 00401026주소에 있다.

JEZF(Zero Flag) 가 0이면 아래의 실행흐름으로 진행되고 1이면 operand에 있는 주소로 Jump한다.

이 부분에도 Breakpoint를 건다.

 

ZF의 값에 영향을 주는 명령어로는 CMP, TEST 등이 있다.

JE 명령어가 실행되기 전에 호출되는 명령어들을 살펴본다.

JE 명령어가 실행되기 직전에 CMP 명령어가 실행된다.

CMP 명령어는 EAXESI의 값을 비교한다.

두 값이 같으면 ZF가 1이 될 것이다.

 

CMP EAX,ESI 를 실행하기 전에

ESI는 INC 즉, 1씩 값을 증가시키는 명령어를 3번 수행하고,

EAX는 DEC 즉, 1씩 값을 감소시키는 명령어를 2번 수행한다.

 

메뉴바에서 파란색 실행아이콘을 클릭해서

첫번째 breakpoint를 걸어놓은 GetDriveTypeA 함수까지 도달한 후

한번 더 F8를 눌러 GetDriveTypeA 함수를 실행하고 return한다.

 

GetDriveTypeA 함수의 return 결과를 확인해보면 EAX는 00000003, ESI는 00401000이 되어있다.

 

이 상태에서 계속 실행해보면

EAX는 2번 감소해서 00000001이 되고,

ESI는 3번 증가해서 00401003이 된다.

 

두 값이 일치하지 않으므로

CMP EAX,ESI 결과 ZF는 0이 되고,

00401026 주소에 있는 JE 명령어를 실행했을 때

Error를 출력하는 MessageBoxA 함수로 진행된다.

 

두 값이 일치하려면

GetDriveTypeA 함수의 return 결과 EAX가 00000003이 아니라 00401005이어야 한다.

 

실행흐름을 GetDriveTypeA 함수에서 return 한 지점에 위치시키고

레지스터 영역에서 EAX를 더블클릭해서 값을 00401005로 변경해준다.

 

OK를 클릭하고 F8로 한 줄 씩 실행시켜보면

JE 명령어를 만났을 때 YEAH!에 해당하는 MessageBoxA 함수를 호출하는 것을 확인할 수 있다.

 

 

 

<정답 제출>

GetDriveTypeA의 리턴값을 찾는 문제였다.

찾은 리턴값은 00401005인데, 004010000은 코드부분의 주소이므로 답으로 5를 입력한다.

https://ch.codeengn.com/auth 로 들어가서 Key에 5를 입력하면 Success!가 뜬다.

'CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L06  (1) 2023.11.02
[CodeEngn] Basic RCE L05  (0) 2023.09.23
[CodeEngn] Basic RCE L04  (0) 2023.09.23
[CodeEngn] Basic RCE L03  (0) 2023.09.23
[CodeEngn] Basic RCE L02  (0) 2023.09.23