-
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 '리버싱 엔지니어링 > 리버싱 핵심 원리' 카테고리의 다른 글
21 Windows 메시지 후킹 (0) 2022.04.01 20 인라인 패치 실습 (0) 2022.03.30 18. UPack PE 헤더 상세 분석 (0) 2022.03.30 17 실행 파일에서 .reloc 섹션 제거하기 (0) 2022.03.27 16 Base Relocation Table (0) 2022.03.27