최근들어 보안을 공부하면서 계속해서 드는 생각이 있다. 특히 침해사고 대응이나 악성코드 분석을 하려면 궁극적으로 그 원인이 된 바이너리 파일의 행위를 규명해야 한다. 그리고 그것은 리버스 엔지니어링의 영역이다. 바이너리 코드는 컴퓨터가 이해하는 2진수 형식으로 표기되어 있고, 이 기계어를 사람이 직접 이해하기는 무리가 있으므로 그 중간단계인 어셈블리 언어 수준에서 어느정도 해석이 가능해진다.
사실 대부분의 프로그래머들은 어셈블리언어도 잘 모르고, 그저 C언어 또는 Java 수준의 High-Level 언어로만 프로그램을 작성한다. 그러면 컴파일러에 의해 자동으로 어셈블->기계언어로 처리되어 바이너리(실행파일)이 생성된다. 이 실행파일을 거꾸도 되돌릴 수만 있다면, 소스코드가 주어지지 않은 상황에서도 남의 프로그램의 작동원리를 간파할 수 있게 된다. 그래서 "어셈블리 언어를 읽을 수 있다면, 모든 프로그램이 오픈소스처럼 보인다." 라는 명언이 있다. 이러한 분야를 통칭 '리버싱', '리버스 엔지니어링', '역공학' 등의 용어로 표현한다.
시중에 리버싱 관련 서적은 내가 아는 것만 10종 가까이 된다. 하지만 안타깝게도 대부분은 너무 어렵거나 지나치게 자세하여 독자의 전의를 상실하게 만든다. 그리고 어떤 것은 국제적인 역작임에도 불구하고 난해한 번역으로 인해 내용파악이 쉽지 않은 현실이다. 이에 최근 한빛미디어에서 출간된 '윈도우 실행파일 구조와 원리로 배우는 - 리버스 엔지니어링'이라는 도서가 굉장히 좋은 것 같아서 읽어보게 되었다.
이 책은 원래 2005년 출간되었던 'Windows 시스템 실행파일의 구조와 원리'가(현재는 절판상태) 확대개정되어 2016년 출간된 것으로, 1권과 2권을 합치면 2000 페이지가 넘는 어마어마한 책이다.
1권은 '파일구조'편이고, 2권은 '디버거'편이다. 책의 두께를 다른 책과 비교해보자면 아래와 같이 상당함을 알 수 있다. 그리하여 1권은 알라딘에서 E-Book 형태로 구매하였고 추가적으로 카이스트 도서관에 신간서적 구매신청을 통해 하드카피 본으로도 읽을 수 있었다. 2권은 한빛출판의 리뷰어로 선정되어 감사하게도 증정받을 수 있었다.
이 책을 펼쳤을 때 그간 읽었던 다른 바이블과 같은 리버싱 서적들과 비교되는 가장 큰 장점은, 현시점 최신 운영체제인 Windows 10을 기준으로 작성되었다는 점이다. 다른 서적들은 보통 편의를 위해 Windows XP 환경에서 32bit 바이너리를 분석하는 것에만 그치고 있다. 그러나 요즘은 64bit를 거의 기본으로 채택하고 있음에도 64bit 구조에 맞추어 설명하는 내용이 거의없어서 오히려 독자들이 32bit환경을 구축해서 실험해야 한다는 어려움이 있었다. 그러나 이 책은 Windows 10에서 Visual Studio 2015 와 Win SDK를 사용해서 실습을 진행하므로 굳이 예전의 환경으로 역주행하는 불편은 없을 것이다.
1편은 파일구조를 다루는데, 이 책이 Windows 환경을 기반으로 하고 있으므로 PE, PE+ 을 중점적으로 설명한다. (참고로 리눅스 바이너리는 ELF, macOS 바이너리는 Mach-O라고 부른다.) 대부분의 윈도우 악성코드들을 정적분석할 때에는 먼저 PE헤더에 포함되어 있을지도 모르는 다양한 정보들을 검사하는 것부터 시작한다. 1편의 대부분의 장에서는 DLL과 PE 내부적 구조를 이해하는 것으로 지면을 할애한다. 사람의 머리로는 언뜻 그려내기 어려운 구조들은 그림으로 시각화하여 아래와 같이 이해를 쉽게 돕는다.
2편인 디버거 편에서는 SEH, DEP, ASLR 등의 메모리 보호기법을 설명하고, 직접 디버거를 구현해보는 단계까지 진행한다.
알다시피 2편은 1300page가 넘는 분량이므로 책 전체를 읽고 리뷰하는 것이 상당히 힘들었다. 아직은 본인의 내공이 딸려서 내용을 모두 이해한 것은 아닌 듯 싶다. 내용 자체가 깊고 어렵기에 C, C++에 익숙하고 윈도우 시스템에 대해 어느정도 배경지식을 충분히 갖춘 독자가 읽는 것이 좋을 것 같다. 나도 나머지 부분까지 열심을 내어 꼭 정독할 것이다.