Be Expert

[Reversing] CodeEngn basic RCE L05 풀이 본문

Reversing

[Reversing] CodeEngn basic RCE L05 풀이

psswrd 2020. 4. 13. 16:46

출제사이트 : https://codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 비공개 워크숍을 현업 실무자들과 함께 운영하고 있습니다. 리버스엔지니어링이라는 하나의 큰 주제로 소프트웨어 보안에 대한 다양한 시각과 연구주제에 대한 정보공유를 추구하고 있으며, 상업적 이익 없이 작은 예산으로 운영하고 있어 큰 예산으로 운영하는 다른 컨퍼런스에 비해 여러 가지로 부족 할 수 있습니다.

codeengn.com

문제에 프로그램을 받아 일단 실행해봤습니다. 문제가 등록키를 찾으라는 것이고, 프로그램 또한 올바른 이름과 등록키를 입력하면 풀리는 문제임을 알겠네요.

 

등록키를 찾는 문제
이름을 입력하지 않았을 때 

 

PE파일 뷰어로 확인했는데, 프로그램이 UPX(패킹된 파일)임을 확인했습니다. 패킹 여부를 확인하는 방법은 여러가지라고 합니다. 

 

PE파일 뷰어로 확인

저는 upx.exe 를 이용하여 파일을 언패킹하였습니다. upx.exe 프로그램과 언패킹하려는 파일이 같은 디렉토리에 있는 것이 좋습니다.

https://github.com/upx/upx/releases/tag/v3.94

 

upx.exe 사용하여 언패킹

올리디버거로 언패킹한 파일을 열어 텍스트 문자만 확인하였습니다.

 

오른쪽 마우스 > Search for > All referenced text strings

 

프로그램을 실행해서 확인했던 경고창의 문구들을 발견했습니다. 현재 보고있는 화면은 텍스트만 출력해온 것이기 때문에 전후과정을 모두 보기 위해 해당 주소를 더블클릭하여 들어가보겠습니다.

 

텍스트 문자만 출력하였을 때

"Wrong Seral,try again!" 메시지를 출력하는 주소로 점프하는 명령어를 발견했습니다.

JNZ SHORT 05.0040F8C

 

오류메시지를 출력하는 주소로 가는 명령어

ZF(Zero Flag)를 비교하는 CMP와 같은 구문이 없으므로 바로 위에 부분에 BP(브레이크 포인트, F2 누르면 됩니다)를 설정해주었습니다. CALL 부분에서 어떤 함수를 호출하여 JNZ가 실행되는지 확인하기 위함입니다.

 

F9을 누르면 실행이 되고 BP가 설정된 440F34 에서 멈춥니다. 이름과 비밀번호를 임의대로 넣어주었습니다.

 

 

이후에 BP 부분부터 F7 을 눌러 한 줄씩 실행해보면 EAX 와 EDX에 저장된 데이터를 비교하는데, 오른쪽 레지스터에 저장된 데이터 값을 확인하면, 앞서 입력한 이름은 EAX에 저장되어 있습니다.

 

EAX와 EDX 확인

Ctrl + F2 를 눌러 재시작하고 이름에 psswrd 대신 ' Registered User '를 입력했습니다. 그런데, 문제가 있습니다. 입력한 ASCII 코드 값은 같은데, 입력된 16진수 값이 다릅니다.. -_- ..  

 

이 부분은 좀 더 공부하여 나중에 수정하도록 하고, 일단 강제로 16진수에 값을 동일하게 입력해주었습니다. 

 

 

이후에는 흰색 블럭이 설정된 주소까지 오면 JNZ가 보이고, 위와 똑같은 과정을 수행하면 됩니다. 사실 이때부터는 저 GFX로 시작하는 문자열이 플래그겠다.. 싶었습니다.

 

등록키값 또한 EAX와 EDX를 비교하는데, 앞서 입력한 12345 값이 EAX에 들어가있고 EDX는 ' GFX-754-IER-954 '가 저장되어 있습니다. 

 

name : Registered User

key : GFX-754-IER-954

 

Comments