리버싱 엔지니어링/리버싱 핵심 원리
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로 이동