Wargame/CodeEngn Basic RCE

CodeEngn Basic RCE L10 Write-Up

0xe82de_ 2019. 8. 19. 00:41
728x90
728x90
728x90

파일 링크: https://codeengn.com/challenges/

 

CodeEngn.com [코드엔진] - Challenges

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

codeengn.com

[사진 1]

풀어보자.

 

 

[사진 2]

파일을 실행하면 Name, Serial 값을 입력받아 등록해준다.

 

 

[사진 3]

Detect It Easy 도구로 파일을 보면 ASPack으로 패킹되어 있음을 알 수 있다.

 

 

[사진 4]

올리디버거로 파일을 보면 PUSHAD 명령어를 수행한다. OEP로 점프하기 전에 POPAD 명령어가 수행될 것이기 때문에 ESP 레지스터의 값에 하드웨어 브레이크 포인트를 설정한다.

 

 

[사진 5]

그리고 실행하면 POPAD 명령어가 수행되고 중지된다. RETN 명령어는 현재 ESP가 가리키는 스택 값을 주소로 점프하는데, RETN 명령어가 수행되기 전 PUSH 명령어로 0x00445834 값을 스택에 저장한다.

따라서 0x00445834 주소로 점프하는 것이다. 이 곳이 OEP다.

 

 

[사진 6]
[사진 7]

OllyDumpEx 플러그인으로 덤프를 뜨자. Entry Point에 Image Base 값을 뺀 0x00045834를 입력한다.

 

 

[사진 8]
[사진 9]

덤프뜨면서 IAT가 깨졌을 수 있기 때문에 LordPE 도구로 리빌드해주자.

 

 

[사진 10]

올리디버거로 덤프뜬 파일을 실행하면 OEP부터 디버깅을 할 수 있다.

 

 

[사진 11]

code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열들을 확인할 수 있다. "Regi" 문자열을 검색하면 위와 같이 등록을 성공했을 때 출력되는 문자열을 확인할 수 있다.

 

 

[사진 12]

"Regi ~~" 문자열이 사용되는 루틴을 보면 0x004454D4 주소에서 분기하는데, 이전 명령어들에 의해 Name, Serial을 비교하고 성공인지 실패인지 결정할 것이다.

 

 

Auth Key 값은 OEP와 [사진 12]에서 확인한 분기 명령어의 OPCODE이다.

728x90
728x90