Did you know that you can navigate the posts by swiping left and right?
본 글은 이승원이 집필한 「리버싱 핵심원리」 를 읽고 공부(정리)한 내용을 바탕으로 쓰여졌습니다.
리버스 엔지니어링이란 물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업을 의미한다.
흔히, 역공학이라고 불리는 이 단어는 필자는 처음에 영화에서 보았다. 아주 오래된 영화인 <인디펜던스 데이 (1996)>에서 51구역 안에서 UFO를 역공학하여 기술을 배우고 신기술은 접목한다는 식의 대사가 있었다. 또한, 최근에 보고있는 미드인 <에이전트 오브 쉴드(Agent of Shield)>에서도 피츠 박사가 외계 물건들을 역공학하여 원리와 기능을 파악하는 장면들과 대사들이 많이 나온다. 이게 실제로도 많이 사용하는 단어인지는 모르겠지만.. 영화에서는 생각보다 자주 나오는 단어이다. 필자 생각에는 “그렇다면 역공학이라는 것은 현재 자신이 보유한 기술보다 더 뛰어난 기술(물건)을 상대로 펼쳐지는 것”이라고 생각되는데, 현실적으로 다른 공학적인 부분에서 많이 사용될 가능성이 존재한지(?)는 잘 모르겠다.1
리버스 코드 엔지니어링은 소프트웨어 분야의 리버스 엔지니어링이다.
아직 용어의 통일이 이루어지지 않은 분야이기 때문에 수많은 단어들이 혼재되어 있지만.. 그 정도로 최신기술인지는 모르겠지만.. 많은 사람들이 RCE, RE, 특히나 리버싱이라는 단어를 사용한다.
파일의 겉모습을 관찰하여 분석하는 방법
파일을 실행하지 않으며, 확장자(파일의 종류), 크기, 헤더(PE)정보, Import/Export 된 API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용을 확인하는 것. 디스어셈블러(Disassembler)를 이용해서 내부 코드와 구조를 확인하는 것도 포함한다.
파일을 직접 실행시켜서 행위를 분석하고, 디버깅을 통하여 코드 흐름과 메모리 상태 등을 살펴보는 방법
파일, 레지스트리(Registry), 네트워크 등을 관찰하고 프로그램의 행위를 분석. 디버거를 이용하여 내부구조와 동작원리를 분석하기도 한다. 해야만 한다.
정적분석을 통하여 정보를 수집하고 프로그램의 동작 원리에 대한 예측을 해야한다. 그렇게 하면, 리버싱할 때의 시간도 단축할 수 있고 효과적인 분석도 가능해진다.
개발자가 소스코드를 작성해서 컴파일하면 어떤 프로그램이 나온다. 그 프로그램은 컴파일 될 때에 목표에 따른 CPU에 따라서 Binary Code(이진법 기계어)로 변환된다.
리버싱을 공부하러 온 사람이라면 당연히 소스코드가 무슨 의미인지는 알겠지. 그거는 그냥 넘어가도록 하자.
아무리 전문가라도 0과 1만으로 된 기계어를 보고 이해할 수는 없을 것이다.2 그래서 그나마 좀 알아보기 쉬우라고(?) 2진수를 16진수로 변환하여 보는데, 자릿수가 줄어들기 때문에 한눈에 파악하기 쉽다. 쉽다고 하는데 난 잘 모르겠다. Hex Dump는 여전히 어렵다. 자릿수가 줄어들어서 쉽다는 소리가 숫자를 보고(?) 코드가 보이는 수준이라는게 아니라 아무래도 이게 몇바이트를 차지하는지를 쉽게 알 수 있으니 쉽다는 의미인거같다.
Hex Code도 어렵기 때문에 사람이 이해하기 쉬운 어셈블리 코드로 리버싱을 대부분 한다. 유명 디버깅 프로그램인 OllyDbg의 경우에는 어셈블리 코드와 Hex Code를 같이 보여준다.
프로그램의 파일 혹은 실행 중인 프로세스 메모리의 내용을 변경하는 작업을 패치(Patch)라고 한다. 크랙(Crack)은 패치와 같은 의미이나 그 의도가 비합법적이고 비도덕적인 경우를 의미한다. 리버싱은 마치 칼을 공부하는 것과 같다. 칼을 잘 다루면 암살자가 되기도 하지만, 누군가의 호위무사가 될 수 있듯이 리버싱을 공부할 때는 바른 마음가짐으로 공부하여야 한다.
뭐, 소프트웨어 분야에서는 소스코드를 공개하지 않으니깐 더 뛰어난 기술이 흔하게 존재하지만.. 다른 공학분야에서는 자주 쓰이려나… 뭐 기계공학 같은건.. 다 나사도 보이고 전류가 어떻게 흐르는지도 보일테고, 분해해보면 관련 이론은 이미 다 존재하는 이론일테고.. 다른 분야에는 문외한이라 그런 생각이 드는 걸지도 모르겠다. ↩
세기의 천재인 폰 노이만은 순수 0과 1만으로 코딩을 했다. 폰 노이만의 제자들이 어셈블리 코드를 발명하려고 노력했는데 폰 노이만이 기계어 코딩이 얼마나 쉬운 일이냐며 타박하고, 그 프로젝트를 와해시켰다는 썰(?)이 돌고 있다. ↩