기초 리버싱
리버스 엔지니어링
- Reverse Engineering(RE, 역공학)
- 시스템의 구조, 기능, 동작 분석하여 원리 이해하며 단점 보완하고 새로운 아이디어를 추가하는 작업
리버스 코드 엔지니어링
- Reverse Code Engineering(RCE)
- 소프트웨어 분야의 리버스 엔지니어링
- 분석
- 상세분석
- 소프트웨어를 리버싱 관점에서 상세하게 분석
리버싱(분석) 방법
- 실행 파일의 분석 방법
- 정적 분석
- 파일 실행 없이 파일 겉모습 관찰하여 분석
- 정보 수집해 해당 프로그램 구조와 동작 원리에 대해 예측 가능
- 이후 수행될 동적 분석 방법에 대한 아이디어 제공
- 파일 종류(exe, dll, doc, zip 등), 크기, 헤더(PE) 정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등 다양한 내용 확인
- 디스어셈블러(Disassembler) 이용해 내부코드와 구조 확인
- 디스어셈블러
- 기계어(컴퓨터 언어)를 어셈블리어(인간 언어)로 변환하는 컴퓨터 프로그램
- 기계어
- 컴퓨터가 읽을 수 있는 2진 숫자로 이루어진 언어 (0과 1)
- 어셈블리어
- 기계어를 사람이 보기 쉽게 문자를 기호화해서 나타낸 것
- 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급언어
- 컴퓨터와 가까운 언어이기 때문에 컴파일 시 실행 속도가 빠름
- 디스어셈블러
- 파일 실행 없이 파일 겉모습 관찰하여 분석
- 동적 분석
- 파일을 직접 실행시켜 행위 분석, 디버깅 통해 코드 흐름과 메모리 상태 등을 자세하게 살펴보는 방법
- 파일, 레지스트리(Registry), 네트워크 등 관찰하며 프로그램 행위 분석
- 디버거(Debugger) 이용해 프로그램 내부 구조와 동작 원리 분석 가능
- 디버깅은 리버싱의 하위 개념
- 정적 분석
Source Code, Hex Code, Assembly Code
- 리버싱에서 취급하는 대상 → 보통 실행 파일
- 소스 코드 없이 실행 파일의 바이너리 자체를 분석 ⇒ 소스 코드와 바이너리 코드 사이 관계 살펴보기 중요
Source Code
1 2 3 4 5 6 7 8 9
#include "windows.h" #include "tchar.h" int _tmain(int argc, TCHAR* argv[]) { MessageBox(NULL, L"Hello World!", L"www.reversecore.com", MB_OK); return 0; }
- 개발도구로 소스 코드 빌드 시 실행 파일 생성
- 개발도구로 소스 코드 빌드 시 실행 파일 생성
- Hex Code
- 생성된 실행 파일 ⇒ 컴퓨터가 이해할 수 있는 2진수(Binary) 형식
- 해석하기 위해 2진수 → 16진수 형식 변환 필요
- Hex Editor
- binary 형식 파일을 hex 형식으로 보여주는 유틸리티
_tmain()
소스코드 =빌드과정⇒ Hex Code 변환1 2 3 4 5 6
int _tmain(int argc, TCHAR* argv[]) { MessageBox(NULL, L"Hello World!", L"www.reversecore.com", MB_OK); return 0; }
- 생성된 실행 파일 ⇒ 컴퓨터가 이해할 수 있는 2진수(Binary) 형식
- Assembly Code
- Hex Code도 사람에게 직관적인 형태가 아니기 때문에 사람이 이해하기 쉬운 어셈블리(Assembly) 코드 형태로 변환 필요
- 디버거를 이용해 helloworld.exe 실행 파일 open
- OllyDbg
- 디스어셈블리와 디버그 두가지 모두 가능한 툴
- Hex Code를 디스어셈블 과정을 거쳐 어셈블리 코드로 변환
- 동적 분석 툴
- 실행 코드 분석
패치와 크랙
- 패치(patch)
- 프로그램 파일 혹은 실행 중인 프로세스 메모리 내용을 변경하는 작업
- 프로그램의 취약점 수정과 기능 개선이 목적
ex) MS의 windows 업데이트
- 크랙(crack)
- 패치와 같은 개념이지만 의도가 비합법적이고 비도덕적인 경우
- 저작권을 침해하는 행위(불법 복제/사용)에 사용