본문 바로가기

Reverse Engineering/CodeEngn Basic

[리버싱] CodeEngn Basic RCE L19

문제 설명


개념 설명

AutoIt:
Windows
작업을 자동화하는 스크립팅 언어이자 도구

원래는 반복적이고 시간이 많이 걸리는 작업을 자동화하기 위해 만들어짐.
ex)
파일 관리, 윈도우 간 전환, 특정 버튼 클릭 등 사람이 직접 해야 할 작업을 코드로 작성하여 자동으로 수행

 

디버깅 함수: Isdebuggerpresent

 

timeGetTime함수:

Windows API에서 사용되는 함수로, 시스템이 시작된 이후 경과된 시간을 밀리초 단위로 반환

이 함수는 시스템이 부팅된 후부터 현재까지 얼마나 시간이 흘렀는지 측정할 때 사용

 

컴파일: 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정

* Java : 컴파일의 결과로 자바가상머신(JVM)에서 실행가능한 “.class” 파일이 생긴다.

 

디버깅: 자신이 만든 프로그램 내부에 숨겨져 있는 논리적인 오류를 찾아내는 작업이다.

* 단순한 오타로 인한 에러이거나 예상치 못한 논리적 에러일 수도 있다.


문제 풀이

UPX 파일로 압축 되어 있으니 압축을 풀어준다.

압축을 열고 파일을 풀어준다.

프로그램을 실행해보니 AutoIt script로 컴파일 되어 있다고 뜬다.

이를 해결하기 위해서는 프로세스를 디버깅해주는 함수를 찾아야 한다.

 

Search for > All intermodular calls로 들어가 함수를 찾아보자.

 

디버깅하는 함수의 이름은 IsDibuggerPresent이다.

 

해당 부분에서 찾을 수 있다.

 

여기에 브레이크 포인트를 걸고, 살펴보자.

해당 부분에서 EAX 값이 같지 않다면 해당 주소값으로 점프한다.

해당 주소값에는 아까 나왔던 오류 메세지가 나와있는 것을 확인할 수 있다.

 

해당 값은 같은 값이 아닌 것 같으니 같으면 점프하도록 바꿔주도록 하자.

바꾸고 실행시키면 다음과 같이 점프하지 않는 것을 발견할 수 있다.

 

그리고 실행시키면 다음과 같은 값이 뜬다.

 

이제 정상적으로 실행되는 파일을 저장하고 다시 살펴보자.

 

문제는 이 프로그램이 몇 밀리세컨드 뒤에 종료되는가였으니 시간과 관련된 함수를 찾아보자.

timeGetTime함수를 찾으면 된다.

 

해당 부분에서 하나를 찾을 수 있었다.

 

이제 모든 timeGetTime 함수에 브레이크 포인트를 걸어주자. 

우클릭 후 해당 부분을 클릭하면 된다.

 

브레이크 포인트를 걸고 확인해보니 해당 부분만 EDI 값을 호출하는 것을 확인할 수 있었다. 여기를 살펴보자.

 

더보기

SUB EAX, ESI
EAX 값을 감소시키는 연산
이 부분이 반복적으로 실행되면서 시간이 줄어드는 방식일 수 있음.
만약ESI가 일정 시간(:밀리세컨드단위)을 나타내는 값이라면,
프로그램이 몇 초 후에 종료되는지를 계산하는 데 중요한 단서가 됨

 

CMP EAX, DWORD PTR DS:[EBX+4]

비교되는 메모리 값 (DWORD) 32비트 값으로, 밀리세컨드 또는 타이머 값을 의미

 

JNB

흐름을 통해 일정 시간이 지난 후 프로그램이 종료되거나 다른 동작을 할 수 있는 구조

따라서 이 부분이 수상하다고 볼 수 있다.

 

EBX+4 주소값에 들어있는 값(시간)이 끝나면 종료되는 것 같으니 어떤 값인지 살펴보자.

 

일단 해당 위치의 EBX값은

이다. + 4를 하면 8AF87C이다.

 

해당 주소값에는

2B 70이 들어있다. (DWORD + 리틀 앤디안 방식)

참고용

 

따라서 정답은 2B 70 , 즉 이진수로 11120이다.