Fascination
article thumbnail

Reversing Engineering - 1. 리버싱 엔지니어링이란


1. Reversing Engineering

# Reversing Engineering

- 리버싱 엔지니어링은 이미 만들어진 시스템이나 장치에 대한 해체나 분석을 거쳐 그 대상 물체의 구조와 기능, 디자인 등을 알아내는 일련의 과정
- 소프트웨어 뿐만 아니라 기계공학, 전자공학은 물론 생물학 등에서도 폭넓게 쓰임
- '완성품의 설계도 없이 구조와 동작 과정을 알아내는' 모든 단계
- 자료나 책에 따라 '역공학'이라고 지칭하기도 함
- 줄여서 '리버싱'이라고도 함

# 'Software' Reversing Engineering

- 리버싱이 산업의 전 분야에 걸쳐 적용될 수 있지만, 여기서는 소프트웨어를 대상으로 할 것
- 즉, 소스 코드가 없는 상태에서 컴파일된 대상 소프트웨어의 구조를 여러가지 방법으로 분석하고, 메모리 덤프를 비롯한 바이너리 분석 결과를 토대로 동작 원리와 내부 구조를 파악한 다음, 이를 바탕으로 원래의 소스가 어떻게 작성된 것인지 알아내는 과정을 공부

reversing engineering


# 리버싱이 필요할 때

- 분석하고자 하는 대상에 대해 알지 못하는 상태에서도 대상의 동작 원리와 구조에 대해 알 수 있다는 점에서 매우 효과적인 기술
- 리버싱은 매우 다양한 분야에서 널리 쓰임
Good Cases vs Bad Cases
> 판매된 지 너무 오래되어 제작사가 이미 개발을 중단한 프로그램에 대한 지원이 필요할 때 리버싱은 효과적임
> 위와 같은 경우 소스 코드를 더 이상 보관하지 않거나 유실된 경우가 많기 때문에, 포팅 등의 지원을 통해서
리버싱이 쓰일 수 있음
> 오래전에 발매된 게임을 다시 하고 싶어하는 프로그래머들에게도 리버싱은 아주 유용함
ex) 1996년에 발매된 디아블로가 리버싱을 거쳐 모딩된 버진이 공개된 바 있음
> 각종 프로그램의 보안성을 평가하거나 악성코드를 분석하는 경우에서도 리버싱이 널리 쓰임
> 이 경우 모두 소스 코드가 없는 상태에서 진행되므로 분석가가 실행 흐름을 리버싱을 통해 대상 프로그램이
얼마나 안전하게 설계되었는지, 혹은 분석 대상 악성 코드가 어떤 방식으로 동작하고 피해를 입히는지 알아내게 됨
> 다른 한 편으로는 리버싱이 악용되는 경우도 있음
> 상용 프로그램을 구입하지 않고 공짜로 이용하기 위해 쓰는 키젠 프로그램이나 시리얼 넘버 생성기,
정품 크랙 등의 불법 프로그램도 리버싱을 통해 만들어짐
> 유로로 판매되는 프로그램들이 어떤 방식으로 정품 인증을 하는지 리버싱을 통해 알아낼 수 있기 때문
> 각종 프로그램을 분석해서 게임핵을 만드는 경우에도 리버싱이 사용됨

2. Disclaimer

# Disclaimer

- 리버싱: 학습 및 연구용으로도 많이 이용되는 기술 뿐만 아니라 각종 악성코드나 불법 프로그램의 분석 및 대응 수단으로도 효과적인 기술
- 그러나 소스 코드를 비롯한 전체적인 작동 원리를 알아낼 수 있다는 점에서, 각종 상용 프로그램의 지적 재산권을 침해할 수도 있는 양날의 검이기도 함
- 테스팅이나 연구, 학습 등을 목적으로 한 리버싱의 경우 저작권을 침해하지 않는 범위 내에서 제한적으로는 위법하지 않음
- 그러나 재배포, 무단 이용 등 저작권을 침해하려는 리버싱은 법적인 문제로 이어질 수 있음

더보기

저작권법 제35조의3 (저작물의 공정한 이용) 제1항제23조부터 제35조의2까지, 제101조의3부터 제101조의5까지의 경우 외에 저작물의 통상적인 이용 방법과 충돌하지 아니하고 저작자의 정당한 이익을 부당하게 해치지 아니하는 경우에는 보도ㆍ비평ㆍ교육ㆍ연구 등을 위하여 저작물을 이용할 수 있다.저작권법 제101조의3 (프로그램의 저작재산권의 제한) 제1항 제6호 프로그램의 기초를 이루는 아이디어 및 원리를 확인하기 위하여 프로그램의 기능을 조사ㆍ연구ㆍ시험할 목적으로 복제하는 경우(정당한 권한에 의하여 프로그램을 이용하는 자가 해당 프로그램을 이용 중인 때에 한한다)


3. Static Analysis vs Dynamic Analysis

# Static Analysis vs Dynamic Analysis

- 리버싱을 통해 대상 소프트웨어의 동작 원리를 알아내기 위해서는 크게 두 가지의 방법이 쓰임
> 정적 분석 방법(Static Analysis): 프로그램을 실행시키지 않고 분석
> 동적 분석 방법(Dynamic Analysis): 프로그램을 실행시켜서 입출력과 내부 동작 단계를 살피며 분석
- 정적 분석을 위해서는 실행 파일을 구성하는 모든 요소, 대상 실행 파일이 실제로 동작할 CPU 아키텍처에 해당하는 어셈블리 코드를 이해하는 것이 필요
- 동적 분석을 하기 위해서는 실행 단계별로 자세한 동작 과정을 살펴봐야 하므로, 환경에 맞는 디버거를 이용해 단계별로 분석하는 기술을 익혀야 함

4. 코드가 컴파일되는 과정

# Source Code → Binary Code

- 사람이 이해할 수 있는 소스 코드를 컴퓨터가 이해할 수 있는 형태인 프로그램(이하 바이너리)로 바꾸려면 컴파일을 거쳐야 함
- 이러한 과정에 사용되는 프로그램을 '컴파일러'라고 부름
- 모든 프로그래밍 언어가 컴파일러를 통해서 실행 가능한 바이너리가 되는 것은 아니지만, 대개는 단독적으로 실행 가능한 바이너리가 되기 위해서 컴파일 과정을 거침
- 컴파일러가 소스 코드를 바이너리로 변환하기 위해서는 몇 가지 단계를 거침


# Source Code → ??? → Binary Code

- 원본 소스 코드는 사람이 알아보기 쉽도록 각종 주석이나 매크로 등을 포함하거나 참조할 헤더 파일을 포함하고 있음
- 이와 같은 정보는 실제로는 코드가 아니라 참조를 위해 붙여둔 정보이므로, 컴파일러는 이를 모두 미리 처리해서 다음 단계에서 변환할 준비를 마침
- 이렇게 준비된 '중간 언어'를 컴파일러가 분석하고 최적화하여 어셈블리 코드로 만들어 줌
- 어셈블리 코드는 컴퓨터가 이해할 수 있는 기계 코드를 사람이 알아보기 쉽게 명령어(Instruction) 단위로 표현한 것
- 즉, 어셈블리 코드와 기계 코드는 1:1 대응이 가능하므로, 최종적으로 어셈블리 코드가 기계 코드로 번역되는 과정(어셈블, Assemble)을 거쳐 실행 가능한 바이너리가 완성됨


# Source Code ← ??? ← Binary Code

- 바이너리를 분석해서 어떤 방식으로 동작하는지, 나아가 어떤 소스 코드를 바탕으로 만들어졌는지를 알아내려면 분석가는 컴파일러가 수행하는 과정을 역으로 진행해야 함
- 따라서 주어진 바이너리를 어셈블리 코드로 변환하고, 변환된 어셈블리 코드를 분석하면 대상 바이너리가 어떤 식으로 동작하는지 알 수 있게 됨
- 이렇게 바이너리 코드를 어셈블리 코드로 변환하는 과정을 Disassemble(디스어셈블)이라고 함
- '리버싱'으로 통용되는 소프트웨어 리버스 엔지니어링, 특히 정적 분석 방법에 해당되는 방법은 디스어셈블을 거쳐 나온 어셈블리 코드를 분석하여 소프트웨어의 동작 구조를 알아내는 과정을 가리킴

profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!