상세 컨텐츠

본문 제목

CodeEngn Basic RCE L10

REVERSING/Reversing Study

by koharin 2021. 5. 10. 18:12

본문

728x90
반응형

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


파일이 패킹되어있는 것 같다. Detect It Easy 툴을 사용해서 PE 파일 정보를 확인했다.

horsicq.github.io/

위 사이트에서 die_win64_portable_3.01.zip 을 다운받았다.

압축해제 후, die.exe를 실행하면 바로 사용가능하다.

Aspack v2.0으로 패킹된 것을 확인했다.

 

Aspack 언패킹 방법 

1. Hardware breakpoint 

2. RETN 0C 찾고 BP를 걸어서 OEP를 찾는다.

 

두 번째 방법을 사용한다.

과정은 다음과 같다.

 

1. PUSHAD: 현재 레지스터를 스택에 저장

2. 원본코드를 특정 메모리에 복구

3. POPAD: 원래의 레지스터값을 복구

4. OEP로 분기

 

1) OEP 찾기

 

1. PUSHAD 명령어 찾기

- x32dbg에서는 F9로 패킹된 PE 파일의 EntryPoint로 이동할 수 있고, PUSHAD 명령어를 확인할 수 있다.

- 현재 레지스터(EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI)를 스택에 저장한다.

  • 프로그램 주소 '00456001'에서 멈추는데, 이곳이 패킹된 파일에서의 EntryPoint로, Detect It Easy로 확인한 진입점과 동일하다.

  • PE를 눌러서 IMAGE_NT_HEADERS 하위의 IMAGE_OPTIONAL_HEADER로 가보면, AddressOfEntryPoint인 00056001ImageBase인 00400000을 확인할 수 있다.
  • 프로그램이 메모리에 로딩 시 ImageBase + AddressOfEntryPoint(상대주소)로 저장되므로, 진입점은 00400000 + 00056001 =00456001 이다.

 

2. POPAD 명령어 찾기

- PUSHAD 명령어에서 좀 내려가면 POPAD 명령어를 확인할 수 있다.

- POPAD로 스택에 저장한 레지스터값에 접근한다. 

 

3. RET C 명령어 찾기

- POPAD 이후 ret c 명령어를 확인할 수 있다.

- 메모리 및 레지스터 복구 후 OEP로 분기하기 위해 ret c 명령어를 수행한다.

- ret c 이후 push 0ret 명령어를 확인할 수 있다.

- 두 opcode에 BreakPoint를 걸고 프로그램을 실행한다.

- x32dbg에서 F7로 실행을 하면서 BP 이전까지 Ctrl + F9로 나가는 과정을 반복하면 BP로 이동하는데, push 0이 push 10.445834로 변경된 것을 확인할 수 있다.

이는 이동하기 위한 주소, 즉 OEP인 445834를 push하고, ret에서 해당 445834 주소로 이동한다.

 - ret 이후 00445834 주소로 이동한 것을 확인할 수 있다.

- 이 00445834가 패킹 전 OEP 주소이다.

 

2) '등록성공' 으로 가는 분기점의 OPCODE 찾기

00445834 주소에서 우클릭 후 다음을 찾기 -> 현재 모듈 -> 문자열 참조를 가면, 문자열들을 확인할 수 있다.

"Registered ... well done!" 이 등록 성공에 대한 문자열이다.

문자열에서 우클릭 후 "디스어셈블리에서 따라가기"를 눌러 해당 주소로 이동해보자.

해당 주소에서 위쪽으로 가면, jen 10.44552B가 있고, 다를 경우 분기하는 곳으로 같으면 다음 명령어로 이동하여 Registerd ... well done! 을 출력한다.

따라서 등록 성공을 출력하는 분기 opcode는 75 55에 해당한다.

 

정답은 OEP(445834) + opcode(7555) = 4458347555

728x90
반응형

관련글 더보기