상세 컨텐츠

본문 제목

[ reversing ] - 1. 리버싱 기초

Reversing/study

by bing_su 2021. 1. 19. 16:25

본문

반응형
SMALL

reversing 공부한 내용을 정리해 보려고 한다. 참고한 도서는

www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966260522&orderClick=LEa&Kc=

 

리버싱 핵심 원리 - 교보문고

악성 코드 분석가의 리버싱 이야기『리버싱 핵심 원리』. 프로그램의 내부를 깊이 들여다보고 조작할 수 있는 기법인 ‘리버싱’에 필요한 핵심 원리를 50여개 장을 통해 꼼꼼하게 설명한 책이

www.kyobobook.co.kr

솔직히 엄청 두껍고 방대하지만, 읽어보면 확실히 리버싱에 대한 이해도가 높아진다.

 

먼저 리버싱이 무엇인지, 또한 기초적인 분석 방법 등 리버싱에 대한 간단한 기초부터 살펴보려고 한다.

 

[ 리버스 엔지니어링(Reverse Engineering) ]

: 이미 만들어진 시스템이나 장치에 대한 해체나 분석 등을 통해 그 대상 물체의 구조, 기능, 디자인 등을 알아내는 과정을 말한다. 쉽게 말하면 "완성품의 설계도 없이 구조와 동작 과정을 알아내는 모든 단계"라고 할 수 있다. 역공학이라고 지칭하기도 한다. 소프트웨어 뿐만 아니라 기계공학, 전자공학, 생물학 등에서도 폭넓게 쓰인다.

[ 리버스 코드 엔지니어링(Reverse Code Engineering) ]

: 소프트웨어 분야의 리버스 엔지니어링이다. 정확한 용어가 통일되어 쓰이는 개념은 아니고, RCE, RE, 역공학, 리버싱 등의 용어가 혼용된다. 필자 역시 리버싱이라는 용어를 주로 쓴다.

 

리버싱에서는 소스 코드가 없는 상태에서 컴파일된 소프트웨어의 구조를 여러가지 방법으로 분석하고, 메모리 덤프와 같은 바이너리 분석 결과를 토대로 동작 원리와 내부구조를 파악한 후, 이를 바탕으로 원래 소스가 어떻게 작성된 것인지 알아내는 과정에 대해 공부한다.

[ 분석 방법 ]

: 리버싱을 통해 동작 원리를 알아내는 방법은 크게 두 가지의 방법이 있다.

 

간단히 설명하자면, 프로그램을 실행시키지 않고 분석하는 정적 분석 방법(Static Analysis), 프로그램을 실행시켜서 입출력이나 내부 동작 단계를 살피며 분석하는 동적 분석 방법(Dynamic Analysis)이 있다.

< 정적 분석(Static Analysis) >

: 파일의 겉모습을 분석하는 방법이다. 이 분석 방법은 파일을 실행하지 않는다. 파일의 종류(EXE, DLL, DOC, ZIP 등), 크기, 헤더(PE) 정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용을 확인한다. 디스어셈블러(Disassembler)를 이용해 내부 코드와 그 구조를 확인하는 것도 정적 분석의 범주에 들어갈 수 있다.

 

즉, 정적분석을 하기 위해서는 실행 파일을 구성하는 요소, 대상 실행 파일이 실제로 동작할 CPU 아키텍처에 해당하는 어셈블리 코드를 이해하는 것이 중요하다.

 

이러한 정적 분석 방법으로 알아낸 정보들은 동적 분석 방법에 좋은 참고 자료로 활용될 수 있다.

< 동적 분석(Dynamic Analysis) >

: 파일을 직접 실행해 보면서 동작하는 것을 분석하고, 디버깅을 통해 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법이다. 파일, 레지스트리(Registry), 네트워크 등을 관찰하며 프로그램의 행위를 분석한다. 디버거(Debugger)를 통해서는 프로그램 내부 구조와 동작 원리를 분석할 수 있다.

 

동적 분석을 하기 위해서는 실행 단계별로 동작 과정을 살펴봐야 하기 때문에, 환경에 맞는 디버거를 사용해 단계별로 분석하는 기술을 익히는 것이 중요하다.

 

주로 필자가 쓰는 방법은 정적 분석을 통해 프로그램의 구조와 동작 원리에 대해 틀을 잡은 후 동적 분석을 통해 확인하는 것이다. 두 분석 방법을 잘 활용하면 조금 더 효과적으로 분석할 수 있다.

[ Source Code, Hex Code, Assembly Code ]

: 리버싱에서 취급하는 대상은 보통 실행 파일인 경우가 많다. 사람이 이해할 수 있는 소스 코드를 컴퓨터가 이해할 수 있는 형태인 바이너리로 바꾸려면 컴파일을 거쳐야 한다. 이러한 소스코드와 바이너리 코드 사이의 관계를 살펴 보는 것이 리버싱을 이해하는 데 도움이 된다. c++ 소스코드가 빌드 과정을 거치면서 어떤 방식으로 변경되는지 살펴보자.

< Source Code >

: 개발 도구(Ex: Visual C++)에서 소스 코드를 빌드(build)하면 실행 파일(.exe)이 생성된다. 소스 코드는 프로그래밍 언어로 작성된 코드로 소프트웨어 등을 설계할 때 사용되는 코드이다. 즉, 소스 파일에 적힌 코드라고 할 수 있다.

< Hex Code >

: 실행 파일의 경우, 컴퓨터가 이해할 수 있는 2진수(Binary) 형식으로 되어 있다. 그러나 0과 1로만 구성된 binary 파일을 직접 보고 의미를 해석하는 것은 매우 힘들다. 따라서 2진수를 16진수(Hex) 형식으로 변환시키면 자릿수가 줄어듦과 동시에 보기 수월해진다. Hex Editor(Ex: HxD)를 통해 binary 형식의 파일을 hex 형식으로 볼 수 있다.

< Assembly Code >

: Hex Code는 직관적으로 알기 쉬운 형태는 아니다. 사람이 조금 더 이해하기 쉬운 어셈블리(Assembly) 코드 형태는 기계 코드에서 디스어셈블(Disassemble) 과정을 거쳐 어셈블리 코드로 변환된다. 어셈블리 언어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍 저급 언어라고 할 수 있다. 따라서 사람이 분석하기는 쉽다.

[ 코드가 컴파일되는 과정 ]

< Source Code → Binary Code >

: 사람이 이해할 수 있는 소스 코드를 컴퓨터가 이해할 수 있는 바이너리로 바꾸려면 컴파일을 거쳐야 한다. 이 과정에 사용되는 프로그램을 '컴파일러'라고 한다. 모든 프로그래밍 언어가 컴파일러를 통해 실행 가능한 바이너리가 되는 것은 아니지만, 대부분 단독적으로 실행 가능한 바이너리가 되기 위해 컴파일 과정을 거친다.

 

이러한 컴파일러가 소스 코드를 바이너리로 변환하기 위해서는 몇 가지 단계를 거친다.

< Source Code → 중간 언어 → Binary Code >

: 소스 코드 원본은 사람이 알아보기 쉽게 하는 각종 주석이나 매크로, 참조할 헤더 파일 등을 포함하고 있다. 이 정보들은 실제 코드가 아닌 참조를 위해 작성한 정보이므로, 컴파일러는 이를 미리 모두 처리해서 다음 단계에서 변환할 준비를 마친다. 이렇게 준비된 '중간 언어'컴파일러가 분석하고 최적화해 어셈블리 코드로 만들어 준다.

 

어셈블리 코드는 기계 코드를 사람이 알아보기 쉽게 명령어(Instruction) 단위로 표현한 것이다. 어셈블리 코드와 기계 코드는 1:1 대응이 가능해 어셈블리 코드가 기계 코드로 번역되는 과정인 어셈블(Assemble)을 거쳐 실행 가능한 바이너리가 완성된다.

< Source Code ← 중간 언어 ← Binary Code >

: 바이너리를 분석해 어떤 방식으로 동작하는지, 어떤 소스 코드를 바탕으로 만들어졌는지를 알아내기 위해 분석가는 컴파일러가 수행하는 과정을 역으로 진행해야 한다. 따라서 바이너리 코드를 어셈블리 코드로 변환하는 디스어셈블(Disassemble) 과정을 통해 변환된 어셈블리 코드를 분석하면 대상 바이너리가 어떤 식으로 동작하는지 알 수 있다.

 

소프트웨어 리버스 엔지니어링(리버싱) 중 특히 정적 분석 방법에 해당되는 방법은 디스어셈블을 거쳐 나온 어셈블리 코드를 분석해 소프트웨어의 동작 구조를 알아내는 과정을 가리킨다.

[ 패치와 크랙 ]

  패치 크랙
정의 프로그램 파일 혹은 실행 중인 프로세스 메모리의 내용을 변경하는 작업을 말한다. 패치와 동일한 개념이나 특별히 그 의도가 비합법적이고 비도덕적인 경우를 따로 구분해 말한다.
주 목적 프로그램의 취약점 수정과 기능 개선 저작권을 침해하는 행위(불법 복제/사용 등)에 주로 사용.

소프트웨어 리버싱을 공부하면서 배우는 기술은 양날의 검이 될 수 있다. 리버싱 기술도 악용되면 다른 사람들에게 피해를 입힐 수 있어 리버서에게는 높은 수준의 윤리 의식이 필요하다.

반응형
LIST

댓글 영역