Basic RCE L09 - 코드 엔진

2020. 11. 23. 19:25문제연습/CodeEngn (REC)

반응형

 

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

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

 

Basic RCE L09 - 코드 엔진

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

blog.naver.com

 

 

이번 문제는 조금 고민이 많은 문제였습니다.

풀이가 불안정하므로 본문에 작성한 링크를 참고해주시길 바랍니다.

 

StolenByte???

 

1. 문제 내용

StolenByte를 구하시오.

Ex) 75156A0068352040

 

Author: abex

File Password: codeengn

 

 

2. 문제해설

초기 실행 정보)

1. 초기 실행 화면 2. 실행 에러 화면

어떤 key 파일 정보를 확인하는 프로그램으로 추정되는군요.

일단 패킹 여부를 확인한 뒤 좀 더 세부적인 분석을 진행하도록 하겠습니다.

 

파일 정보)

upx 패킹이 확인되었으므로 패킹을 풀도록 하겠습니다.

 

 

패킹을 풀고 파일을 실행해 보니 이상 현상이 발생했습니다.

아까 처음 실행한 패킹 파일과 비교했을 때, 차이점은 오류 창이 발생한다는 점입니다.

 

1. 문자열 깨짐 2. 정상적인 문구 출력

올리 디버거로 확인하면 다음과 같습니다.

 

 

진입점으로 표시된 부분과 MessageBoxA 함수 인자 부분을 유심히 확인해보시길 바랍니다.

 

MessageBoxA function (winuser.h) - Win32 apps

Displays a modal dialog box that contains a system icon, a set of buttons, and a brief application-specific message, such as status or error information. The message box returns an integer value that indicates which button the user clicked.

docs.microsoft.com

 

- StolenByte (아래 링크를 이용해 주시길 바랍니다.)

 

Stolen Byte(Remove OEP)

<설명> - 원본 코드의 일부를 패커/프로텍터가 생성한 메모리 영역으로 옮겨 실행시키는 기법 - 만약 프로세스 메모리를 덤프 시키면 OEP 코드의 일부가 제거되어서 실행이 정상적으로 되지 않는

gatsbyv.tistory.com

MessageBoxA 함수 인자는 hWnd, lpText, lpCaption, uType 이렇게 총 4개의 인자를 받아와야 합니다.

이들의 인자가 전달되지 않아 MessageBoxA 함수는 기본 값으로 출력하여 에러 창으로 표시된 것입니다.

 

StolenByte 기법은 oep 근처의 코드를 복사하여 다른 분리된 메모리에서 실행하기에, 이 과정을 모르고 그대로 덤프를 뜨면 위와 같이 일부 코드가 잘려나가는 문제가 발생합니다.

다시 말하자면 복사되는 코드를 우리가 확인하고 덤프 파일에 그대로 집어넣어 주면 정상 실행되지 않을까요????

 

 

다시 한번 패킹된 원본 실행파일을 올리 디버거에 넣어 보도록 하겠습니다.

(여기서부터는 upx 패킹에서 oep 찾는 방법에 대한 기본적인 이해가 필요합니다. 아래 링크 내용을 숙지해주시고 글을 읽어주세요.)

 

[ Reversing ] UPX - OEP 확인

1. UPX - OEP 확인 OEP : Original Entry Point - 패킹된 파일의 실제 프로그램 시작 부분 입...

blog.naver.com

 

원본 패킹 파일을 다시 올리 디버거로 넣고 pushad, popad, jmp oep 부분을 찾은 화면입니다.

지금 jmp 부분에 중단점을 설정하고 f9을 눌러 실행하면 0x0040100C(oep) 주소에 우리가 원하는 정상적으로 패킹이 풀린(오류 없는) 코드들이 나올 겁니다.

또한, oep 주변에 이상한 코드들이 보이는데 이들은 MessageBoxA 함수의 인자로 보입니다.

 

주황색 부분은 함수의 인자 부분으로 의심되는 코드이며, 빨강 박스는 언 패킹한 파일에서 없었던 인자 부분으로 추측한 부분입니다.

한번 oep 주소로 넘어가서 확인해 보도록 하겠습니다.

 

네, 추측한 내용이 맞는 듯합니다.

즉, oep 이전에 존재하는 코드들과 언 패킹한 파일의 사라진 코드 부분의 용량을 계산해 봅시다.

 

61 6a 00 68 00 20 40 00 60 12 20 40 00 : 총 12 바이트

 

90*12 : 총 12 바이트.

따라서 StolenByte 크기는 12바이트입니다.

 

만약 손상을 복구하고 싶다면 위 NOP에 아까 찾은 코드를 붙여 넣어 주거나,

또는 패킹 파일의 oep 주소(0x0040100c) - 0xC(12바이트)를 뺀 주소로 점프하도록 코드를 수정한 뒤, 수정된 oep로 점프하는 부분부터 덤프를 뜨면 됩니다.

 

정확한 방식은 아래 링크를 이용해 주세요.

 

[CodeEngn] Basic RCE L09 풀이 (StolenByte)

CodeEngn Basic RCE L09 문제 분석 이번 문제는 StolenByte를 구하는 문제이다. StolenByte는 이 문제에서 처음 들어봐서 구글링해보니, 일종의 안티디버깅 기법이라고 한다. 의미 그대로 일부 코드 조각을

liveyourit.tistory.com

 

upx 언패킹하기 - MUP(Manual UnPacking)

upx로 패킹된 프로그램을 MUP로 upacking하는 방법을 알아보겠습니다. 예제 프로그램은 CodeEngn Basic 6번 문제로 하겠습니다. 파일 : 실행 화면은 아래와 같습니다. peid와 stud_pe로 패킹되어 있는지 확인

bbolmin.tistory.com

이상 풀이를 마칩니다!!!

 

반응형

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

Basic RCE L012 - 코드 엔진  (0) 2020.12.05
Basic RCE L010 - 코드 엔진  (0) 2020.11.30
Basic RCE L07 - 코드 엔진  (0) 2020.11.17
Basic RCE L06 - 코드 엔진  (0) 2020.03.19
Basic RCE L05 - 코드 엔진  (0) 2020.03.18