본문 바로가기

CodeEngn

[CodeEngn] Basic RCE L11

<문제>

 

<풀이>

Basic RCE L09번 문제와 매우 유사한 문제이다.(그래서 09번 문제 라이트업의 내용을 일부 인용한다.)

 

먼저 문제에서 말하는 StolenByte에 대해 알아본다.

StolenByte에 대한 여러 설명을 읽어보니 공통적으로 언패킹, OEP PUSH, JMP 등의 키워드를 사용하여 설명하고 있다.

같은 키워드를 이용해 StolenByte를 간단하게 설명하면

 

StolenByte란,

패킹된 파일을 디버깅 등을 목적으로 언패킹했을 때 파일이 정상적으로 실행되지 못하게 하기 위해 OEP JMP한 뒤에 넘겨줘야할 인자값 등을 JMP 전에 PUSH 명령어를 이용해 넘겨줌으로써 언패킹하여 OEP부터 코드가 실행되면 PUSH 해준 인자값을 찾을 수 없는 상태가 되어 실행 파일이 깨지도록 만드는 것이다. OEP 이전에 PUSH로 입력해준 명령어가 언패킹 이후에는 도둑맞은 꼴이 되므로 StolenByte라는 용어를 쓰는 것 같다.

 

이제 본격적으로 문제를 풀어본다.

우선 문제 파일을 다운로드하고, 7-Zip File Maneger로 압축을 푼다.

 

11.exe를 실행해본다.

메시지 박스가 뜬다.

OK를 클릭해본다.

 

파일을 찾을 수 없다는 메시지가 뜬다.

OK를 클릭하면 프로그램이 종료된다.

 

프로그램을 실행해봤을 때는 별로 중요한 정보를 알아낸 게 없다.

 

StolenByte는 패킹과 관련이 있으므로

09.exe가 패킹되어있는지부터 확실하게 확인한다.

PE 파일을 정적 분석할 때 사용하는 툴인 PEiD를 이용해 11.exe를 열어본다.

UPX로 패킹되어 있다.

 

OEP를 확인하기 위해 언패킹을 해본다.

언패킹 한 파일을 디버거로 열었을 때 프로그램 시작 위치가 OEP가 될 것이다.

 

 

UPX로 패킹되어있는 파일을 언패킹하는 툴 중 하나인 upx303w을 이용해 언패킹한다.

upx303w.zip
0.31MB

 

위의 폴더를 다운로드한 후 압축을 푼다.

압축을 푼 폴더 안에 언패킹할 파일 08.exe를 옮겨넣고,

해당 폴더에서 cmd 창을 연다.

upx -d 언패킹할파일

명령어를 입력하면 언패킹이 완료된다.

 

 

OEP를 찾기 위해 디버거로 언패킹한 파일을 열어본다.

파일을 열었을 때 프로그램의 시작 위치가 00401000으로 잡힌다.

이 부분이 OEP임을 알 수 있다.

 

그런데 OEP부터 여러줄의 NOP이 나오고

실질적으로 프로그램이 시작하는 부분의 주소는 0040100C 이다.

 

언패킹된 파일에서는 StolenByte가 말그대로 도둑맞은 상태이기 때문에

StolenByte를 찾기 위해서는 패킹된 상태의 파일에서 찾아야 한다.

 

이제 다시 패킹된 상태의 11.exe를 디버거로 열어 코드의 시작부분인 0040100C JMP하는 명령어를 찾아본다.

해당 명령어의 앞쪽에 PUSH 명령어 부분이 있으면 그것이 StolenByte일 것이다.

디버거로 패킹된 상태의 11.exe를 열고

스크롤을 내리면서 OEP인 0040100C로 JMP하는 명령어를 찾았다.

 

그리고 그 앞부분에 PUSH명령어 세 줄을 찾을 수 있다.

세 줄의 명령어는 OP코드로

6A 00

68 00204000

68 12204000

이다.

 

이 OP코드를 연속적으로 나열하고 맨 앞에 OEP를 붙여 문제에서 요구하는 형식을 맞춰준다.

004010006A0068002040006812204000

 

 

 

 

 

 

<정답제출>

코드엔진의 Auth페이지에 Key 값으로 004010006A0068002040006812204000를 입력하면 Success!!가 뜬다.

 

'CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L13  (0) 2023.11.12
[CodeEngn] Basic RCE L12  (0) 2023.11.09
[CodeEngn] Basic RCE L10  (0) 2023.11.05
[CodeEngn] Basic RCE L09  (0) 2023.11.04
[CodeEngn] Basic RCE L08  (0) 2023.11.02