리버스 엔지니어링이란?
완성품과 이를 구성하는 부품들의 기능과 설계를 고안하고 제작하는 엔지니어링 행위를 거꾸로 하는 것을 합니다.
리버싱은 학습 및 연구용으로 많이 이용되는 기술, 각종 악성코드나 불법 프로그램의 분석 및 대응을 위해서도 사용되는 효과적인 기술입니다.
그러나 프로그램의 전체적인 작동 원리를 알아낼 수 있어 상용 프로그램의 지적 재산권을 침해할 수 있다는 위험성도 존재합니다. 테스팅이나 연구, 학습 등을 목적으로 한 리버싱은 저작권을 침해하지 않는 한에서 제한적으로 허용되지만 저작권을 침해하는 행위는 법적인 문제로 이어질 수 있으니 주의가 필요하겠습니다.
바이너리(Binary)에 대하여
프로그램 : 연산장치가 수행해야하는 동작을 정의한 일종의 문서
많은 정보분야의 엔지니어들은 프로그램을 바이너리라 부르고 있는데요, 왜냐하면 프로그램이 이진형태로 저장되기
때문입니다.
컴파일러와 인터프리터
기계어 : 컴퓨터에게 명령을 내리기 위해 정의한 0과 1로 이루어져 있는 컴퓨터 언어입니다.
기계어는 0과 1로 이루어져 있어 사람이 이해하기 어렵다는 치명적인 단점을 가지고 있습니다.
이를 해결하기 위해 기계어를 사람이 이해하기 쉬운 언어로 고안한 것이 바로 어셈블리어입니다. 이를 기계어로 번역해주는 것 어셈블러라고 합니다.
어셈블리어가 등장한 후, 어셈블리어보다 더욱 사람이 이해하기 쉬운 언어들이 등장하기 시작합니다.(C, C++, Go, Rust...)
이렇게 C, C++등과 같이 사람이 이해하기 쉬운 언어를 고급언어, 기계어, 어셈블리어와 같이 사람이 이해하기
어려운 언어를 저급언어라 부르게 되었습니다.
고급언어와 저급언어 사이에서 필요해진 것이 바로 컴파일입니다.
컴파일 : 프로그래밍 언어(고급언어)를 컴퓨터가 이해할 수 있는 기계어(저급언어)의 형식으로 번역하는 것
하지만 이러한 컴파일이 필요하지 않은 언어들도 존재합니다.
컴파일을 필요로하지 않고 사용자의 입력, 사용자가 작성한 스크립트를 그때 그때 번역하여 CPU에 전달하는 동작을
인터프리팅이라 하고, 이를 처리해주는 프로그램을 인터프리터라고 합니다.
고급 프로그래밍 언어 중 대부분이 인터프리터 언어로, 인터넷 웹브라우저에서 동작하는 JavaScript,
데이터베이스 언어인 SQL 그리고 Python, Ruby, 스크래치 등 다양한 종류가 있습니다.
컴파일 과정
큰 의미에서의 컴파일은 어떤 언어로 작성된 소스코드를 다른 언어의 목적코드로 번역하는 것을 뜻합니다.
전처리
컴파일러가 소스코드를 어셈블리어로 컴파일하기 전에, 필요한 형식으로 가공하는 과정
전처리 과정 1.주석제거 2.매크로 치환 3.파일병합
컴파일
C로 작성된 소스코드를 어셈블리어로 번역하는 것. 컴파일러는 코드를 번역하는 과정에서 소스코드의 문법을 검사하고, 몇몇 조건을 만족하면 최적화 기술을 적용하여 효율적인 어셈블리코드를 생성해줌.
어셈블
컴파일로 생성된 어셈블리어 코드를 ELF형식의 목적파일로 변환하는 과정. 여기서 ELF는 리눅스의 실행파일 형식
링크
여러 목적 파일들을 연결하여 실행 가능한 바이너리로 만드는 과정
전처리->컴파일->어셈블->링크
의 과정을 거쳐 우리가 작성한 소스코드가 기계어로 번역 되어 CPU에 전달되는 것입니다.
디스어셈블과 디컴파일
프로그래밍언어를 기계어로 바꾸는 과정이 있다면, 그 반대도 존재합니다
디스어셈블
바이너리를 어셈블리어로 번역하는 것. 어셈블의 역과정
디컴파일
바이너리를 고급언어로 번역하는 것
정적분석과 동적분석
소프트웨어를 분석하기 위한 분석 방법들은 크게 정적 분석과 동적 분석으로 구분되는데,
정적인 방법과 동적인 방법을 적절히 혼용하여야 대상을 효과적으로 분석할 수 있습니다.
정적 분석(Static Analysis)
프로그램을 실행시키지 않고 분석하는 방법
주로 개발 초기에 오류를 찾아 소프트웨어 제품의 품질을 향상시키는 것이 목표이므로 테스트 초기 단계에서 수행됨
| 장점👍🏻 | 단점👎🏻 |
| ●프로그램의 전체구조를 파악하기 쉬움 ● 분석 환경의 제약에서 비교적 자유로움 ● 바이러스와 같은 악성 프로그램의 위협으로부터 안전함 |
● 프로그램에 난독화가 적용되며 분석이 매우 어려워짐 ● 다양한 동적 요소를 고려하기 어려움 |
정적 분석의 주요 기법으로는 비공식 검토, 기술적 검토 등이 있습니다.
동적분석( Dynamic Analysis)
프로그램을 실행시키면서 분석하는 방법
결함을 찾기 및 수정이 목적이므로 개발단계 이후에 수행됨
| 장점👍🏻 | 단점👎🏻 |
| ● 코드를 자세히 분석해보지 않고도 프로그램의 개략적인 동작 파악가능 |
● 분석 환경을 구축하기 어려울 수 있음 ● 안티디버깅으로 인해 동적분석이 어려울 수 있음 |
동적 분석의 주요 기법으로는 단위 테스트, 통합 테스트, 시스템 테스트 등이 있습니다.
'리버싱' 카테고리의 다른 글
| [리버싱] Exercise: rev-basic-0 (0) | 2024.02.29 |
|---|---|
| [리버싱] IDA 사용해보기 (1) | 2024.02.21 |
| [리버싱] PEViewer로 메모장 분석하기 (1) | 2024.02.18 |
| [리버싱]X86 Assembly (1) | 2024.02.17 |
| [리버싱]스택(Stack), 레지스터(Register), 스택 프레임(Stack Frame) (0) | 2024.02.03 |