Basic RCE L012 - 코드 엔진

2020. 12. 5. 18:57문제연습/CodeEngn (REC)

반응형

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

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

 

 

Basic RCE L012 - 코드 엔진

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

blog.naver.com

 

이번 문제는 더미 데이터를 통한 분석 난독화 기법이 약간 적용되어 있습니다.

난독화 부분은 따로 분석하지 않으므로 풀이에 참고하시길 바랍니다.

Dummy data???

 

1. 문제 내용

입력 키와 주소영역을 찾는 문제입니다.

차근차근 분석해 보도록 하겠습니다.

 

 

2. 문제 해설

문제 분석)

- PE 스펙

터보 어셈블리어로 작성된 프로그램인 듯하며, 특별한 패킹은 확인되지 않았습니다.

 

- 실행 정보

초기 실행 화면, 입력 실행 모습, About 창

한가지 이상한 점은 그냥 텍스트를 입력해서 check 버튼을 눌러도 아무런 반응이 없습니다.

일단 이 정도 정보를 가지고 분석에 착수하도록 하겠습니다.

 

 

immunity 분석)

- 문자열 정보

 

- 함수 정보

일단 처음에 입력된 키가 맞을 경우 출력될 문자열로 의심되는 부분이 확인되었습니다.

해당 주소 0x0040108B로 이동해 보도록 하겠습니다.

 

해당 주소로 가보니 MessageBoxA 함수의 인자로 넣는 과정을 확인하였습니다.

아까 실행해봤듯이, 성공 메시지를 출력하기 전에 텍스트를 입력받는 부분이 반드시 존재할 것입니다.

이 메시지 박스 함수 위에 또 다른 함수가 호출되는 게 있는지 확인해봐야겠습니다.

 

1. GetDlgItemInt 함수

 

함수의 기능을 알아보니 다음과 같습니다.

이 함수는 WM_GETTEXT 메시지로 대화 상자 컨트롤의 텍스트를 읽어 정수형으로 변환해 리턴해 준다. 만약 읽는 텍스트가 INT_MAX 또는 UINT_MAX 범위보다 더 클 경우 이 함수는 0을 리턴한다.

(출처 - http://www.soen.kr/lecture/win32api/reference/Function/SetDlgItemInt.htm)

 

Win32 API Reference

설명 대화상자의 컨트롤에 정수값을 대입한다. 이때 컨트롤은 버튼, 에디트, 스태틱 등의 텍스트 표현이 가능한 컨트롤이어야 한다. 이 함수는 정수를 문자열로 변환한 후 WM_SETTEXT 메시지를 컨

www.soen.kr

 

즉, 우리가 입력한 데이터를 처리하는 함수인 듯합니다.

아주 긴 문자열을 복사한 다음 call 12.0040110F를 하고 있습니다,

해당 주소로 이동해 보니 다음과 같은 코드가 존재했습니다.

 

일종의 for 반복 문이 존재하는 듯합니다.

이 부분을 IDA로 확인하면 다음과 같이 표시됩니다.

 

확인을 해보니 v4변수(=eax)가 2049480383이라는 값과 같으면 성공 메시지를 띄우는 듯합니다.

일단 immunity로 실행하면서 확인해 보도록 하겠습니다.

 

CMP EAX, 7A2896BF 부분에 중단점을 걸고 실행한 다음, 1이라는 값을 입력 후 다시 실행하면 다음과 같은 eax값이 나옵니다.

즉, 입력한 데이터가 eax에 저장됨을 알 수 있습니다.

이를 통해 우리가 프로그램에 2049480383을 입력하면 우리가 원하는 메시지 창을 띄울 수 있습니다.

한번 입력창에 2049480383를 입력해 보도록 하겠습니다.

 

2049480383를 입력한 모습, 입력 후 인증에 성공한 모습

일단 문제에서는 입력에 성공할 시, 헥스 에디터를 이용하여 인증 성공메시지를 출력하지 않고 key 값을 출력하도록 하라고 했습니다.

 

일단, 헥스 에디터로 넣어서 성공 메시지 부분을 확인해 보면 다음과 같습니다.

이 부분을 우리가 원하는 값 2049480383(= 7A2896BF)으로 덮어 버리고 나머지를 00으로 채우겠습니다.

이제 저장 후 실행해 보도록 하겠습니다.

 

정상적으로 실행된 모습입니다.

즉, 0x00000d3b ~ 0x00000d61 영역을 key 값 텍스트로 덮어 씌우면 우리가 원하는 결과를 출력할 수 있습니다.

 

따라서 문제 정답은 20494803830d3b0d61가 됩니다.

 

 

 

 

- 더미 데이터 분석 부분 -

여기는 반복문 부분이며 실제 문자 비교 strcmp를 구현한 부분은 두 번째 사진입니다.

 

한 가지 이상한 점은 xor 연산을 not, or, and 연산만으로 구현을 하더라도 x ^ y == (~x & y) | (x & ~y) 형식으로 표현이 되는데 왜 굳이 1을 더한 걸까요??

일단 함수 부분을 조금 더 확인해 보도록 하겠습니다.

 

1) 비교 함수 부분

 

2) aOqiqb4ehm4jism 주소에 저장된 문자열 들

 

 

반응형

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

Malware Analysis L01  (0) 2022.01.04
Basic RCE L014 - 코드 엔진(진행중)  (0) 2021.01.11
Basic RCE L010 - 코드 엔진  (0) 2020.11.30
Basic RCE L09 - 코드 엔진  (0) 2020.11.23
Basic RCE L07 - 코드 엔진  (0) 2020.11.17