ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Lenas Reversing for Newbies] 23
    Wargame/dreamhack.io 2021. 4. 17. 16:38

    이번 실습에서는 Stolen Bytes라는 것에 대해 배워본다. Stolen Bytes란 .exe 파일의 코드의 일부(주로 entry point의 일부분)가 packer에 의해 할당된 메모리 영역으로 옮겨져 실행되게 하는 기법으로, dump를 했을 때 Stolen 된 부분이 없어져 문제가 생기게 된다.

     

    1. PEiD

    PEiD로 첨부파일을 열어보자.

     

    PEiD

    db에 패커에 대한 정보가 없어서 "Nothing found *"라는 문구가 나타난다. OllyDbg로 파일을 열어보자.

     

    2. debugging(with OllyDbg)

     

    EP

    PUSHFD, PUSHAD 명령어가 나타나는 점을 이용해 OEP를 찾는 일반적인 방법(ESP에 하드웨어 BP 설정)을 이용하면 다음과 같이 손쉽게 OEP로 추정되는 영역에 도달할 수 있다.

     

    조금 이상한 OEP

    그런데 여지껏 봐온 OEP와는 뭔가 다른듯하다. 명령어 사이사이에 NOP 명령어가 보이며, 간단한 명령어들을 수행한 후, 특정 영역으로 점프한다. 점프하는 영역의 코드를 살펴보기 위해 점프하는 명령어에서 enter키를 눌러보자.

     

    점프 영역

    점프 영역 위의 PUSH 0 명령어 위로 8 byte 만큼 비어 있는 것을 확인할 수 있다. 이 8 byte는 처음에 OEP로 추정되었던 부분의 앞의 8byte 명령어인 PUSH EBP / MOV EBP, ESP / MOV ECX, 7이 stolen 된 부분이라고 생각해볼 수 있다. 48E9C8 주소에 위 세 명령어들을 입력해보자.

     

    stolen된 부분 복구

    이제 0048E9C8 주소를 OEP로 설정하기 위해 New Origin here를 통해 EIP 레지스터가 0048E9C8 주소를 가리키도록 설정해주고 PE Tools 도구를 이용해 Full dump를 떠준다. (왜인지 모르겠으나, OllyDbg의 dump 플러그인 기능을 이용하면 정상적으로 파일이 실행이 안 되는 문제가 발생한다.) 이후에 IAT 보정을 위해 ImpRec를 실행한다.

     

    ImpRec

    OEP를 설정해주고 IAT AutoSearch를 이용하자 IAT Size가 4라는 결과가 나타난다. 뭔가 잘못된 듯 하다. OllyDbg에서 RVA 92018 주소에 해당되는 영역을 덤프 창에서 확인해보자.

     

    empty

    위와 같이 아무런 값도 입력되어 있지 않다. 패커가 IAT 수정을 방해하기 위해 뭔가 작업을 해놓은 듯 하다. IAT를 찾기 위한 또 다른 방법으로 명령어를 탐색하는 방법이 있다. IAT를 이용하기 위해 항상 JUMP DWORD PTR DS:[xxxx] 형태의 명령어가 실행되는데 명령어의 상위 2byte는 FF25로 시작한다는 점에 착안해 FF25에 대해 binary string search를 해보자.

     

    FF25 검색

     

    IAT

    위와 같이 IAT에 대한 정보를 찾을 수 있다. 이제 OllyDbg의 덤프 창에서 IAT의 시작 부분과 끝 부분을 확인하여 ImpRec에 RVA와 Size를 입력할 수 있도록 해보자.

     

    IAT 시작 : 00493168

     

    IAT 끝 : 00493854

    시작 부분을 RVA로 변환하면 ImageBase 값을 뺀 93168이 되고, IAT 크기는 00493854 - 00493168 = 

    6EC가 된다.

     

    IAT 정보 수정 후

    IAT 정보를 수정한 후 Get Imports 버튼을 눌렀을 때 정상적으로 함수들이 import 된 것을 확인할 수 있다. 마지막으로 Fix Dump를 통해 이전에 dump를 한 파일을 수정해주면 파일이 정상적으로 언패킹 된다.

     

    언패킹 성공

     

    3. Comment

    사실 이번 Stolen bytes는 개념은 이해했지만 실제 코드를 보고 어떤 부분이 Stolen된 부분인지 한 번에 파악하기는 어렵다는 생각이 들었다. 아무래도 다양한 패커의 Stolen bytes 예시를 살펴보고 경험치를 쌓아야 하는 기법인 것 같다. 대표적으로 Asprotector에서 Stolen bytes 기법이 적용된다고 한다.

    반응형

    댓글

Designed by Tistory.