ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Reverse Lab 스터디] UPX PE 분석
    HACK!!/Reversing 2016.07.21 19:19

    위에 사진은 책에서 캡처한 부분입니다.


    ※출처-허빈

    ReverseLab UPX PE.zip

    1.exe UPX로 패킹한 것

    2.exe 패킹안한 것



    우선 왼쪽은 일반적인 PE 구조 오른쪽은 UPX로 패킹된 PE 구조입니다.


    바뀐 부분은 섹션명이 UPX로 변경되었습니다.

    .text -->UPX0

    .data --> UPX1

    또한 UPX0의 RawDataSize(파일에서 섹션이 차지하는 크기)가 0이라는 것입니다.

    이예 대한 실마리는 VirtualSize(메모리에서 섹션 크기)값에서 찾을 수 있습니다.

    UPX0의 VirtualSize는 0x1D000으로 설정되어있습니다.

    즉 UPX로 패킹되면 실행 순간에 압축된 코드를 첫 번째 섹션에 풀어버립니다.

    압축해제 코드와 압축된 원본 코드는 두 번째 섹션에 존재합니다.




    그럼 본격적으로 분석해봅시다 :)



    우선 PUSHAL로 시작을합니다. (왜 pushad로 수정해도 위처럼 나오는걸로 봐서 같은걸로 보임....아시는분 댓글로좀 알려주세요!)

    PUSHAD란? 레지스터 값을 스택에 저장하는 명령입니다.


    ESI에 두 번째 섹션 시작주소를 넣고

    EDI에 첫 번째 섹션의 시작주소를 넣습니다.


    921000에 압축해제된 원본 코드가 저장될 장소입니다.


    EBX에 ESI(UPX1)의 값을 저장합니다. (여기서 FFFFFFFC는 -4입니다!)



    AL에 ESI(0x00)을 넣고

    EDI에 AL을 넣고

    EBX+EBX를 하고 분기를합니다..........


    그냥 쭉쭉넘기고


    이부분에서 edx에 첫 번째 섹션(UPX0)영역에 압축해제된 코드들이 쓰여집니다.


    EDX 덤프


    .text 복원된 값이 EDX에 쓰여진걸 볼 수 있습니다.


    다음으로 IAT를 세팅합니다.


    과정을 설명하자면 GetProcAddress()를 호출해 API시작 주소를 얻은 후 

    EBX 레지스터가 가리키는 원본 파일의 IAT영역에 API주소를 입력합니다. 

    이과정이 API 문자열이 끝날 때 까지 반복하면 IAT가 세팅됩니다.


    일반적인 실행 압축은 원본파일 코드, 데이터, 리소스의 압축해제 과정이 끝나면 IAT를 세팅하고 OEP로 넘어갑니다.

    IAT가 세팅되면 덤프에 이렇게보입니다.


    원본파일과 비교해보면 같다는것을 알 수 있습니다.


    POPAD를 통해 레지스터를 원래대로 복원하고

    JMP 명령을 통해 OEP로 점프하면 끝입니다.









    'HACK!! > Reversing' 카테고리의 다른 글

    upx unpacker  (6) 2017.03.20
    DLL 인젝션  (1) 2016.08.07
    [Reverse Lab 스터디] UPX PE 분석  (0) 2016.07.21
    MSDN ANNOTATIONS  (5) 2016.01.11

    댓글 0

Designed by Tistory.