본문 바로가기

2. Reversing (리버싱)/2) 개념 정리

[26.05.22] 개구리버싱 8주차 활동

25강~29강 요약

 

25강. ASPack 분석

ASPack 특징 

    1) 실행 파일 압축/패킹 프로그램

    2) UPX 구조와 유사

    3) OEP(Original Entry Point) 찾는 방식도 UPX와 유사

    4) UPX처럼 섹션을 하나로 무리하게 합치지 않음

 

OEP(Original Entry Point)

- 패킹이 풀린 뒤 원본 프로그램이 시작되는 주소- 리버싱의 최종 목적지- OEP를 찾으면 사실상 분석의 대부분이 끝난 경우가 많음

 

[분석 흐름]

1. ESP 기준 브레이크 포인트(BP)   

    1) 패커 시작 시 ⁠PUSHAD⁠ 명령으로 레지스터 전체를 스택에 백업함

    2) 이때 변경된 ⁠ESP⁠(스택 최상단 주소)에 하드웨어 브레이크포인트를 설정함

    3) 압축이 풀린 후 레지스터를 원상 복구하는 ⁠POPAD⁠ 시점에 정확히 실행이 멈춤

2. 점프 흐름 관찰   

- CALL   

- JMP   

- RET 명령 등을 추적

3. Zero Flag 기반 분기   

- JNZ 사용   

- Zero Flag = 0 → 점프(루프로 돌아감)    

- Zero Flag = 1 → 점프 안함(다음 코드 진행하므로 루프 탈출)

4. RET 명령 핵심

RET는 스택에서 주소를 꺼내(⁠POP⁠) 그 주소로 점프(⁠JMP⁠)하는 명령임

POP : 스택에서 주소값을 꺼냄

JMP : 그 주소로 점프

 

RET을 이용한 OEP 탐지 원리

구조   

1) PUSH로 특정 주소 저장   

2) RET 실행    3) RET가 스택에서 주소를 POP   

4) 해당 주소로 JMP(PUSH 된 값이 실제 점프 대상, 그 주소가 OEP일 가능성 매우 높음)

 

OEP 진입 방법

방법 1. RET 이전 PUSH 값 확인, 주소 직접 이동

방법 2. PUSH 이후 RET 더블 클릭, 자동으로 OEP 이동

(*주의. PUSH 이전에는 스택에 주소가 없어 잘못된 곳으로 이동 가능하다는걸 인지하고 있어야함.)

 

OEP 이후 분석

정상 코드가 복원되면 문자열 검색, 주요 API 호출 흐름을 파악하여 본래 로직을 분석함

 

UPACK 특징 

- 파일 크기 최소화와 분석 방해를 목적으로 하는 노후된 패커임

- PE헤더를 매우 복잡하게 꼬아놓음 ( DOS Stub 영역을 없애거나 섹션 테이블을 겹치게 만들어 분석 도구의 파싱과 메모리 덤프를 마비시킴)

 

27강. 인라인 패치(Inline Code Patch)

인라인 패치 정의 : 실행 파일의 기존 실행 흐름 중간에 원하는 코드를 삽입하여 동작을 변조하는 기법

목적 

- 압축/암호화된 실행 파일 수정

- 실행 흐름 조작

- 원하는 코드 삽입

 

Code Cave 개념

정의 : 프로그램 내부 빈 공간(Null), 여기에 원하는 코드 삽입

흐름 : 기본) 디코딩 > OEP

인라인 패치) 디코딩 > Code Cave > OEP(원본 코드 영역의 훼손을 줄이기 위함)

특징 : 스크립트 처럼 동작, 중간에 원하는 로직 삽입 가능, 원래 코드 수정 최소화

 

28강. Windows 메세지 훅 이론

Hooking 정의 

OS와 프로그램 사이를 오가는 정보를 가로채고 조작하고 감시하는 기술

구조 User <-> OS <-> Application

(중간 정보 흐름을 후킹)

 

Windows Message Hooking (GUI 기반 이벤트 시스템)

이벤트 처리 흐름

[1단계] 사용자 입력 발생

[2단계] OS가 메시지 생성

[3단계] 해당 프로그램으로 메시지 전달

[4단계] 프로그램이 메시지 처리

위 과정 중간에서 메시지를 가로채고 내용을 확인하여 수정 가능한 기술이 Hooking!!

 

Hook Chain 정의

동일 메시지에 여러 Hook 존재할 수 있음으로 이들을 체인 형태로 연결시켜서 

Hook1 > Hook2 > Hook3을 순차적으로 호출

 

Queue(큐) 개념

OS 와 프로그램을 메시지 큐 이벤트 저장, 순차적으로 처리

 

Windows API Hook 함수

핵심 함수 : SetWindowsHookEx

역할 : 메시지 후킹 등록 (특정 메시지를 가로챌 콜백 함수를 시스템에 등록하는 핵심 API임)

특징 : 시스템 이벤트 감시, 키보드 후킹 가능, 마우스 후킹 가능

 

Callback Function

정의 : 특정 이벤트 발생 시 운영 체제에 의해 자동 호출되는 함수

역할 : 메시지 발생 시 자동 실행, Hook 처리 담당

 

Global Hook

dwThreadId = 0 의미 : 모든 프로세스 대상, 시스템 전체 후킹동작 방식 : DLL을 여러 프로세스에 강제 주입, 모든 프로그램 이벤트 감시 가능

 

DLL Injection

목적 : 실행 중인 타깃 프로세스 메모리에 외부 DLL파일을 강제로 로드시키는 기법활용 : 기능 추가, 메시지 후킹, 입력 차단, 동작 변경

 

주요 Windows API

- LoadLibraryA

역할 : 특정 DLL 파일을 프로세스 메모리에 로드하고 고유 식별자인 핸들(Handle)을 반환함

반환값 : DLL Handle- Handle

의미 : 리소스 접근용 값, 운영체제가 관리하는 객체 접근자 (OS가 관리하는 커널 객체나 모듈에 간접적으로 접근할 수 있게 해주는 고유 주소 식별자임)

ex) 파일, 프로세스, DLL, 메모리

- GetProcAddress

역할 : DLL 내부에 존재하는 특정 함수의 실제 가상 메모리 주소 획득

 

 

29강. Windows 메세지 훅 실습

목표 : 키보드 입력 후킹

흐름

1) 후킹 콜백이 담긴 DLL 제작

2) DLL 로드 : LoadLibraryA 사용

3) DLL 내부에서 SetWindowsHookEx 호출

4) 메시지 처리 : 키보드 입력 감시