<리버싱 핵심 원리>로 공부하였다.
1부 기초 리버싱
01 리버싱 스토리
1.1.리버스 엔지니어링(역공학) : 물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업.
1.2. 리버스 코드 엔지니어링 : 소프트웨어 분야의 리버스 엔지니어링
1.2.1. 리버싱 방법 : 정적 분석, 동적 분석
1) 정적 분석 : 파일의 겉모습을 관찰하여 분석하는 방법(파일 실행X)
파일의 종류, 크기, 헤더 정보, API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등
+ 디스어셈블러를 이용해서 내부 코드와 그 구조를 확인하는 것 => 동적 분석의 참고 자료로 활용
2) 동적 분석 : 파일을 직접 실행해 행위를 분석하고, 디버깅을 통해 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법
파일, 레지스트리, 네트워크 등 관찰, 디버거 이용
정적분석으로 정보 수집 => 프로그램 구조, 동작 원리 예측 (=> 동적 분석)
※ 리버싱 = 디버깅 (X), 리버싱 > 디버깅(O)
1.2.2. Source Code, Hex Code, Assembly Code
흔히 알고 있는 프로그래밍 언어(C언어, C++, Python 등)를 써서 입력한 코드를 소스 코드라고 한다.
위의 사진은 Visual Studio 2019에서 소스코드를 입력한 화면이다.
소스코드를 빌드하면 exe 실행 파일이 생성되는데 그건 컴퓨터가 이해할 수 있도록 2진수 형식으로 되어있다.
이 2진수로 되어있는 실행파일을 사람이 보기 수월하도록 16진수로 변환한 코드가 Hex Code 이다.
위 사진은 Hex Code를 HxD 툴을 이용해 본 것이다.
Hex Code 역시 사람에게는 불편한 코드이다. 그래서 더 이해하기 쉬운 어셈블리 코드를 사용한다. 이건 디버거를 이용해 실행파일을 열면 확인할 수 있다. 위 사진은 Immunity Debugger을 사용해 어셈블리 코드를 확인해본 것이다.
1.2.3. 패치와 크랙
패치 : 프로그램의 파일 혹은 실행 중인 프로세스 메모리의 내용을 변경하는 작업(취약점 수정, 기능 개선 등)
크랙 : 패치와 같은 개념이나 그 의도가 비합법적, 비도덕적인 경우일 때를 의미함(불법 복제 등)