리버싱 엔지니어링/리버싱 핵심 원리

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