CodeEngn Write Up/Basic

CodeEngn Basic RCE L10 Write Up

서원근양학계정 2022. 2. 10. 08:45

문제:OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오.
정답인증은 OEP + OPCODE
EX) 00400000EB03

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com

 

먼저 문제 파일을 실행시켜보겠습니다.

 

이런 창이 뜨는데 아무것도 입력할 수 없습니다.

 

이제 PEiD로 열어보겠습니다.

 

ASPack이라는 새로운 패커로 패킹되어있는 것을 확인할 수 있습니다.

패킹에 대한 내용은 여기를 참고해주세요.

https://brainfreeee.tistory.com/33

 

패킹(Packing)에 대하여

패킹(Packing)이란? 패킹(Packing)은 실행압축이라는 뜻을 가지고 있습니다. 실행압축이란 말 그대로 압축을 푸는 과정 없이 바로 실행시킬 수 있는 압축방법입니다. 실행압축은 일반적인 압축인 Z

brainfreeee.tistory.com

 

인터넷에서 ASPack의 패킹을 푸는 도구를 찾을 수도 있겠지만 이번에는 도구 없이 직접 언패킹을 해보겠습니다.

언패킹에 대한 내용은 여기를 참고해주세요.

https://brainfreeee.tistory.com/34

 

언패킹(Unpacking)에 대하여

언패킹(Unpacking)이란? 언패킹이란 패킹의 반대되는 개념으로, 패킹했던 파일의 패킹을 푸는 것을 의미합니다. 패킹된 프로그램이 실행되면 먼저 패킹이 된 원본 코드를 언패킹시키는 해제하는

brainfreeee.tistory.com

 

먼저 문제 파일을 OllyDBG로 열어줍니다.

그리고 코드의 첫 부분을 보면 PUSHAD가 있습니다.

 

PUSHAD는 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI를 스택에 PUSH하는 명령어입니다.

레지스터들을 스택에 PUSH하는 이유는 패킹을 풀 때 레지스터를 사용하게 되는데

패킹을 다 푼 뒤 레지스터의 값을 복구시키기 위해서입니다.

따라서 패킹을 푸는 코드를 모두 실행한 뒤 PUSHAD에 반대되는 POPAD를 실행하게 됩니다.

 

이 점을 이용해서 레지스터의 값이 스택에 PUSH된 다음 ESP의 주소에 HW BP(HardWare BreakPoint)를 걸어서 POPAD에서 프로그램을 멈추게 할 수 있습니다.

 

먼저 PUSHAD를 실행시켜보겠습니다.

 

바뀐 ESP의 값을 메모리의 주소로 해서 이동합니다.

 

이제 ESP의 주소에 HW BP를 걸어줍니다.

 

그리고 F9를 이용해서 실행시키면 POPAD에서 멈추게 됩니다.

 

이제 RETN을 실행시키면 OEP로 이동하게 됩니다.

 

OEP에 있는 코드가 다 깨져있네요.

Ctrl + A를 통해서 코드를 재분석할 수 있습니다.

 

그래도 대부분이 깨져서 보이네요.

 

어쨌든 언패킹은 되었으니 문자열 검색 기능을 이용해보겠습니다.

 

여기서 성공했을 때의 메시지가 출력되는 것 같습니다.

위쪽의 코드를 분석하다 보면 이 부분을 넘어가는 명령어가 있습니다.

 

OPCODE는 CPU가 수행할 작업을 결정하는 값으로 주소의 오른쪽에 있는 값입니다.

 

Flag: 004458347555

 

'CodeEngn Write Up > Basic' 카테고리의 다른 글

CodeEngn Basic RCE L12 Write Up  (1) 2022.02.21
CodeEngn Basic RCE L11 Write Up  (0) 2022.02.17
CodeEngn Basic RCE L09 Write Up  (1) 2022.01.05
CodeEngn Basic RCE L08 Write Up  (1) 2021.10.05
CodeEngn Basic RCE L07 Write Up  (0) 2021.09.30