CodeEngn Basic RCE L10 Write-Up
파일 링크: https://codeengn.com/challenges/
CodeEngn.com [코드엔진] - Challenges
코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 비공개 워크숍을 현업 실무자들과 함께 운영하고 있습니다. 리버스엔지니어링이라는 하나의 큰 주제로 소프트웨어 보안에 대한 다양한 시각과 연구주제에 대한 정보공유를 추구하고 있으며, 상업적 이익 없이 작은 예산으로 운영하고 있어 큰 예산으로 운영하는 다른 컨퍼런스에 비해 여러 가지로 부족 할 수 있습니다.
codeengn.com
풀어보자.
파일을 실행하면 Name, Serial 값을 입력받아 등록해준다.
Detect It Easy 도구로 파일을 보면 ASPack으로 패킹되어 있음을 알 수 있다.
올리디버거로 파일을 보면 PUSHAD 명령어를 수행한다. OEP로 점프하기 전에 POPAD 명령어가 수행될 것이기 때문에 ESP 레지스터의 값에 하드웨어 브레이크 포인트를 설정한다.
그리고 실행하면 POPAD 명령어가 수행되고 중지된다. RETN 명령어는 현재 ESP가 가리키는 스택 값을 주소로 점프하는데, RETN 명령어가 수행되기 전 PUSH 명령어로 0x00445834 값을 스택에 저장한다.
따라서 0x00445834 주소로 점프하는 것이다. 이 곳이 OEP다.
OllyDumpEx 플러그인으로 덤프를 뜨자. Entry Point에 Image Base 값을 뺀 0x00045834를 입력한다.
덤프뜨면서 IAT가 깨졌을 수 있기 때문에 LordPE 도구로 리빌드해주자.
올리디버거로 덤프뜬 파일을 실행하면 OEP부터 디버깅을 할 수 있다.
code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열들을 확인할 수 있다. "Regi" 문자열을 검색하면 위와 같이 등록을 성공했을 때 출력되는 문자열을 확인할 수 있다.
"Regi ~~" 문자열이 사용되는 루틴을 보면 0x004454D4 주소에서 분기하는데, 이전 명령어들에 의해 Name, Serial을 비교하고 성공인지 실패인지 결정할 것이다.
Auth Key 값은 OEP와 [사진 12]에서 확인한 분기 명령어의 OPCODE이다.