2021. 11. 21. 22:00ㆍdreamhack[드림핵]/Reverse Engineering
Reverse Engineering
리버스 엔지니어링(Reverse Engineering)은 이미 만들어진 시스템이나 장치를 해체나 분석을 거쳐 다양한 정보를 알아내는 과정(완성품 없이 구조와 동작 과정을 알아내는 과정)
[리버스 엔지니어링 = 역공학 = 리버싱]같은 뜻
리버싱은 위와 같은 일을 하기 때문에 산업의 전 분야에 걸쳐 적용될 수 있다. 허나 dreamhack에서는 소프트웨어를
대상으로만 이루어진다.
공부 갈래
소스 코드가 없는 상태에서 컴파일된 대상 소프트웨어의 구조를 여러가지 방법으로 분석,
메모리 덤프를 비롯한 바이너리 분석 결과를 토대로 동작 원리와 내부 구조 파악,
이를 바탕으로 원래의 소스가 어떻게 작성된 것인지에 대해 공부
리버싱이 필요할 때 : 대상의 동작원리와 구조를 알고싶을 때
Disclaimer
리버싱은 학습 및 연구용으로 이용되기도 하면서 악성코드나 불법 프로그램의 분석 및 대응 수단으로도 쓰이는 기술
허나 소스코드를 비롯한 전체적인 동작 원리를 알아낼 수 있다는 점에서 각종 상용 프로그램의 지적 재산권을 침해할 수도 있다. 그래서 테스팅이나 연구, 학습 등을 목적으로 한 리버싱은 법을 어기지않는 선에서 사용해야 함
Static Analysis vs Dynamic Analysis
리버싱은 프로그램을 실행시키지 않고 분석하는 정적 분석 방법(Dynamic Analysis), 프로그램을 실행시켜서 입출력과 내부 동작 단계를 살피며 분석하는 동적 분석 방법(Static Analysis)으로 나뉜다.
정적 분석을 위해서는 실행파일을 구성하는 모든 요소, 대상 실행 파일이 실제로 동작할 CPU 아키텍처에 해당하는 어셈블리 코드를 이해하는 것이 필요
동적 분석을 위해서는 실행 단계별 자세한 동작 과정을 살펴야하기에 환경에 맞는 디버거를 이용해 단계별로 분석하는 기술을 익히는 것이 필요하다.
코드가 컴파일되는 과정
Source Code -> Binary Code
컴파일이란 사람이 이해하기 쉬운 소스 코드를 컴파일러를 통해 컴퓨터가 이해할 수 있는 형태인 프로그램(이하 바이너리)으로 바꾸는 과정(모든 프로그래밍 언어가 컴파일러를 통해 실행가능한 바이너리가 되는 것은 아니다.)
컴파일러가 소스코드를 바이너리로 변환하는 과정
Source Code -> ??? -> Binary Code
소스코드에는 사람이 알아보기 쉽도록 주석이나 매크로 등을 포함하고 있다 허나 이는 코드가 아닌 참조를 위해 붙여둔 정보이므로, 컴파일러는 이를 미리 처리해 변환할 준비를 마친다.
이렇게 준비된 '중간 언어'를 컴파일러가 분석 후 최적화하여 어셈블리 코드로 만들어 준다.
어셈블리 코드는 컴퓨터가 이해할 수 있는 기계코드를 사람이 알아보기 쉽게 명령어(Instruction)단위로 표현한것이다.
이는 즉 어셈블리 코드와 기계 코드는 1:1 대응이 가능하므로, 최종적으로 어셈블리 코드가 기계코드로 번역되는 과정을 (어셈블, Assemble) 거쳐 실행 가능한 바이너리가 완성된다.
Source Code <- ??? <- Binary Code
바이너리를 분석해서 어떤 방식으로 동작하는지, 나아가 어떤 소스코드를 바탕으로 만들어졌는지 알아내려면 분석가는 컴파일러가 수행하는 과정을 역으로 진행해야한다 이 과정을 디스어셈블(Disassemble)이라고 한다.
리버싱으로 통용되는 소프트웨어 리버스 엔지니어링, 특히 정적 분석 방법에 해당되는 방법에 해당되는 방법은 디스어셈블을 거쳐 나온 어셈블리 코드를 분석하여 소프트웨어의 동작 구조를 알아내는 과정
'dreamhack[드림핵] > Reverse Engineering' 카테고리의 다른 글
6일차 (x64dbg 사용법) (0) | 2021.11.26 |
---|---|
5일차 (Hello World 어셈블리 분석) (0) | 2021.11.25 |
4일차 (0) | 2021.11.24 |
3일차 (0) | 2021.11.23 |
2일차 (0) | 2021.11.22 |