Basic RCE L05 - 코드 엔진

2020. 3. 18. 00:31문제연습/CodeEngn (REC)

반응형

 

본 티스토리 블로그는 PC에 최적화되어 있습니다.

모바일 유저분들은 아래 네이버 블로그를 이용해 주세요.

 

Basic RCE L05 - 코드 엔진

본 네이버 블로그는 모바일에 최적화되어 있습니다.PC 유저분들은 아래 티스토리 블로그를 이용해 주세요...

blog.naver.com

 

 

안녕하세요, ICMP입니다.

이번 시간에는 코드 엔진의 다섯 번째 문제 Basic RCE L05를 풀어보도록 하겠습니다.

UPX Packing???

1. 문제 내용

이 프로그램의 등록키는 무엇인가

 

Author: CodeEngn

File Password: codeengn

 

 

2. 문제 해설

7z 압축을 풀고 프로그램을 실행해 보도록 하겠습니다.

음, 일단 실행을 시키니 어떤 시리얼을 입력하고 등록하는 프로그램인 것 같습니다.

일단 아무 값이나 넣고 Register now ! 버튼을 눌러보도록 하겠습니다.

 

버튼을 누르니 아래와 같은 창이 뜨는군요.

입력한 값이 틀렸다고 합니다. 그러면 올리 디버거로 분석을 시도하겠습니다.

 

 

음??? 디버거로 분석을 시도하려고 하니 위와 같은 문구가 뜹니다.

요약하자면 데이터가 압축 또는 암호화되어 있어서 디버깅 결과가 불안정하다는 내용입니다.

 

혹시 패킹이 되어있나???

 

일단 PE 분석, 패킹 여부 등을 확인해봐야겠습니다.

7z 압축을 풀고 Stub_PE에 파일을 집어넣었습니다.

UPX 패킹이 감지되었군요. 일단 UPX 패킹을 풀도록 합시다.

 

(사실 7z 압축을 풀고 바로 exe 파일을 실행시켜도 정상작동합니다.

그 이유는 프로그램도 실행이 되려면 code를 원래 상태로 돌려놓아야 하기 때문입니다.

 

즉, 프로그램의 작동을 위해 패킹을 푸는 루틴이 존재하고 언 패킹 루틴이 끝나면 비로소 정상적인 작동이 이루어지며, 프로그램의 실제 실행되는 지점을 OEP라고 합니다.

 

그러나 패킹을 풀지 않으면 압축을 푸는 알고리즘, 암호화 알고리즘을 만나서 분석하는데 적지 않은 시간이 투입되며 패킹을 한 파일을 IDA로 정적 분석을 하려고 하면 우리가 원하는 OEP 지점의 코드를 보여주지 않기에 마찬가지로 분석하는 데 시간이 걸립니다.

 

그러므로 패킹을 하지 않고 파일을 분석한 풀이는 다음에 제가 실력을 더 쌓으면... 추가로 풀이를 올리도록 하겠습니다.)

 

리눅스에 옮겨 저번 시간에 설치한 UPX를 이용해 파일의 압축을 풀도록 하겠습니다.

(리눅스 환경에서 UPX 설치, 사용하는 방법은 아래 링크를 이용해 주세요.)

 

4. flag - Pwnable.kr 해설

네이버 블로그는 모바일 환경에 최적화되어 있습니다.PC 유저분들은 아래 티스토리 블로그를 이용해 주세...

blog.naver.com

 

그럼 UPX 패킹을 풀도록 하겠습니다. (터미널에 UPX -d "파일 이름" 입력 후 Enter)

언 패킹을 완료했으면 다시 윈도우로 옮겨와서 올리디버거로 분석을 시작하도록 하겠습니다.

 

언 패킹한 파일을 디버거에 넣은 모습입니다. 경고 창이 안 뜨는군요.

 

그럼 본격적으로 분석해 보도록 하겠습니다.

일단 프로그램 내에 존재하는 문자열을 검색해 보도록 하겠습니다.

방금 프로그램을 실행했을 때 보았던 문구들이 여기에 있군요.

일단 이 문구를 호출하는 모든 주소에 중단점을 설정하고 프로그램을 실행해 보도록 하겠습니다.

 

중단점을 설정했는데 프로그램이 정상적으로 출력하다 Register now!라는 버튼을 누른 후 중단점을 만났습니다.

 

계속해서 실행해 보겠습니다.

실행하니 Wrong ~~~ 문자열을 회면에 출력하고 다시 입력창을 띄웁니다.

 

그럼 이번에는 입력하는 공간을 공백 상태로 만든 다음 다시 등록 버튼을 눌러보도록 하겠습니다.

 

등록 버튼을 누르니 어떤 주소로 이동합니다.

그럼 주석?의 의미를 추측해 볼 때 아마 이렇게 작동되는 듯합니다.

 

1. 입력된 값이 공백인지(입력이 정상적으로 이루어졌는지) 검사한다.

 

2. 만약 name 또는 Serial 가 공백이면 call 05unpack.0043D068 한다.

(call 되기 전에 mov를 통해 문자열을 복사하는 과정이 존재하는 것으로 보아 05unpack.0043D068의 인자로 들어가는 듯합니다.)

 

3. 입력된 값이 공백이 아니면 입력된 name과 Serial는 05unpack.00403B2C 안으로 들어가 어떠한 과정을 거친다.

 

4. 05unpack.00403B2C 처리 이후 ZF가 0면 Congrats! ~~~를 출력하고, 0이 아니면 Wrong~~~을 출력하고 다시 입력을 받는다.

 

 

전반적인 루틴은 이렇게 되는 것 같습니다. 그런데 조금 의심되는 부분이 있습니다.

바로 3번 과정입니다.

05unpack.00403B2C가 call 되기 전에 mov를 통해 ASCII 문자열을 복사하는 과정이 존재합니다.

 

즉, 05unpack.00403B2C은 문자열 비교 함수이고 사용자가 입력한 값과 비교하기 위해 문자열을 넣는 것 같습니다.

 

제가 12341234로 name을 입력한 후 05unpack.00403B2C에 들어가서 분석하니 다음과 같은 결과가 나왔고 05unpack.00403B2C는 문자 비교 함수가 맞는 것 같습니다.

만약 입력한 값(ESI 레지스터)가 저장된 값(EDI 레지스터)과 같으면 00403BCA으로 이동하여 비교 함수를 탈출합니다.

 

드디어 모든 퍼즐이 맞추어졌습니다.

문자열 검사 함수를 통과하여 Congrats! ~~~를 출력하기 위해서는 Name은 Registered User로 입력하고 Serial은 GFX-754-IER-954로 입력해야 합니다.

 

 

한번 입력한 후 결과를 보도록 하겠습니다.

예상대로 검증을 통과하고 원하는 결과가 출력되었습니다.

 

즉, Basic RCE L05의 정답은 아래와 같습니다.

Name : Registered User

Serial : GFX-754-IER-954

 

 

오늘은 여기까지입니다!!!

다음 시간에는 Basic RCE L06 문제를 풀어 보도록 하겠습니다.

이상, ICMP였습니다!!!

반응형

'문제연습 > CodeEngn (REC)' 카테고리의 다른 글

Basic RCE L07 - 코드 엔진  (0) 2020.11.17
Basic RCE L06 - 코드 엔진  (0) 2020.03.19
Basic RCE L04 해설 - 코드 엔진  (0) 2020.03.17
Basic RCE L01 해설 - 코드 엔진  (0) 2020.03.13
codeengn.com 준비  (0) 2020.03.13