ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 19 UPack 디버깅 - OEP 찾기
    리버싱 엔지니어링/리버싱 핵심 원리 2022. 3. 30. 01:41

    notepad_upack.exe 파일 디버깅을 통한 OEP(Original Entry Point) 찾기

     

     OllyDbg 살행 에러 

    • NumberOfRvaAndSizes 값을 A로 변경하여 초기 검증 과정에서 에러 메시지가 출력됨
    • 크리티컬한 에러가 아니므로 [확인] 버튼을 눌러 넘어감
    • 위 에러로 인해 EP로 가지 목하고, ntdll 영역에서 멈춤

    • OllyDbg의 버그(혹은 엄격한 PE 체크) 때문에 이런 현상이 발생한 것이므로 강제로 EP를 설정

    EP 위치 확인(Stud_PE 사용)

    • ImageBase : 01000000, EP의 RVA 값 : 1018
    • EP의 VA 값 : 01001018
    • OllyDbg에서 01001018로 이동 후 'New origin here' 명령을 통해 강제로 EIP 변경
      • EIP(Extended Instruction Pointer) : 다음 실행해야 할 명령어가 존재하는 메모리 주소를 저장하는 명령 포인터 레지스터

    • 정상적인 디버깅 가능

     

     디코딩 루프(Decoding Loop) 

    • 모든 패커에는 디코딩 루프가 존재
    • 디코딩 루프를 디버깅할 때에는 조건 분기를 적절하게 건너뛰어 루프를 탈출해야함 
    • UPack은 두번째 섹션에 압축된 원본 데이터가 존재, 이 데이터를 디코딩 루프를 돌며 첫번째 섹션에 압축해제 해야함

    EP 코드부터 디버깅

    • 처음 두 명령은 10011B0 주소에서 4바이트를 읽어 EAX에 저장하는 명령어
    • 계속 진행하다보면, 함수 호출 코드 발견

    • ESI 값은 0101FCCB이고, 이게 decode() 함수의 주소 (앞으로 반복 호출될 것임)
    • StepInto[F7] 명령을 통해 트레이싱 위와 같은 코드 발견

    • 0101FE57과 0101FE5D 주소에 EDI 값이 가리키는 곳에 뭔가를 쓰는 명령어 : MOVS, STOS
    • CMP/JB 명령어를 통해 EDI 값이 01014B5A 주소가 될 때까지 계속 루프를 돌게 됨
      • 실제로 루프를 반복하면 EDI가 가리키는 주소에 어떤 값들이 쓰여지는 것을 확인할 수 있음

     

     IAT 세팅 

    • 디코딩 루프가 끝나면 IAT를 새롭게 구성함
      • BP 걸고[F2] 실행[F9]하여 루프 탈출

    • LoadLibrarydhk GerProcAddress를 이용해 루프를 돌며 원본 notepad의 IAT를 구성
    • 이 과정이 종료되면, RETN 명령어에 의해 OEP로 이동

    UPack의 OEP

     

    댓글

Designed by Tistory.