이 책에서 다루는 내용
- ELF 및 PE 바이너리 분석, libbfd를 이용한 바이너리 로더 구현
- 헥스 값 수정 및 바이러스 코드 삽입을 통한 ELF 바이너리 개조 기법
- Capstone을 사용한 자체 개발 디스어셈블 도구 구현
- 안티 분석 기법을 우회하기 위한 바이너리 계측 방법론
- 제어 흐름 탈취 및 데이터 유출 공격을 막기 위한 오염 분석 적용
- 기호 실행을 통한 자동화 취약점 악용 도구 개발
이 책의 대상 독자
산업계의 보안 전문가, 학계의 연구자, 모의침투 및 해킹 기술자, 리버스 엔지니어, 악성 코드 분석가 및 바이너리 분석에 관심이 있는 컴퓨터 공학 전공 학생들을 대상으로 한다. 뿐만 아니라 더 많은 사람이 바이너리 분석에 관심을 갖고 누구나 접할 수 있도록 저술했다. 다만 심화 주제들을 포괄하기 때문에 컴퓨터 시스템과 프로그래밍 전반에 대한 배경 지식이 필요하다. 이 책의 내용을 이해하려면 아래와 같은 지식이 필요하다.
- C/C++ 프로그래밍 언어에 대해 합리적인 수준의 이해
- 운영체제의 내부 구조(프로세스는 무엇인지, 가상 메모리란 무엇인지 등)와 작동 원리에 대한 기본 지식
- 리눅스 셸(Linux shell) 사용법에 대한 이해(특히 bash 셸 기준)
- x86/x86-64 어셈블리 언어에 대한 숙련도
만약 프로그래밍 경험이 전무하거나 컴퓨터의 기반 시스템에 대한 탐구를 그다지 선호하지 않는다면 이 책이 적합하지 않을 수 있다.
이 책의 구성
1부에서는 바이너리의 형식을 다룬다. 이 내용은 앞으로 이 책의 전개를 이해하는 데 있어 굉장히 중요하다. 만약 ELF 및 PE 바이너리 포맷에 익숙하며 libbfd 사용 경험이 있는 독자라면 1부의 몇몇 장을 건너뛰어도 좋다. 1장, ‘바이너리란 무엇인가’에서는 바이너리 형태의 프로그램을 철저히 해부하기 위한 기본 지식을 소개한다. 2장, ‘ELF 바이너리 포맷’에서는 리눅스 시스템의 바이너리 형식인 ELF를 살펴본다. 3장, ‘PE 바이너리 포맷 요약’에서는 윈도우 시스템에서 사용되는 PE 바이너리 형식을 간략히 다룬다. 4장, ‘libbfd를 이용한 바이너리 로더 제작’에서는 libbfd를 사용해 바이너리의 구조를 분석하는 방법과 이를 통해 직접 바이너리 로더를 제작하는 과정을 보여 준다. 이렇게 직접 제작한 도구는 향후 책의 진행에서도 계속 사용할 것이다.
2부에서는 바이너리 분석 기초를 설명하고 그와 관련된 기술을 다룬다. 5장, ‘리눅스 바이너리 분석 기초’에서는 리눅스 환경에서 제공되는 도구를 활용해 기본적인 바이너리 분석을 수행하는 과정을 배운다. 6장, ‘디스어셈블과 바이너리 분석 기초’에서는 디스어셈블 기법과 기초 분석 전략을 전개할 것이다. 7장, ‘ELF 파일에 대한 간단한 코드 삽입 기법’에서는 여러분이 직접 ELF 바이너리 파일을 개조해 볼 수 있는 첫 번째 경험을 할 수 있다. 악성 코드를 삽입하거나 헥스(hex) 값을 편집하는 등의 기술을 선보일 것이다.
3부에서는 바이너리 분석 심화를 설명하고 대부분의 최신 동향을 다룬다. 8장, ‘디스어셈블 도구 자체 개발’에서는 Capstone을 사용해 여러분이 직접 여러분만의 디스어셈블 도구를 만들 수 있도록 안내한다. 9장, ‘바이너리 계측’에서는 Pin이라는 바이너리 계측(binary instrumentation)을 위한 최적의 도구를 통해 바이너리를 개조하는 방법을 소개한다. 10장, ‘동적 오염 분석 원리’에서는 바이너리 분석 시에 프로그램 내부의 데이터 흐름을 추적하는 동적 오염 분석(dynamic taint analysis) 방법론을 소개하고 그와 관련된 최신 기술 동향을 다룬다. 11장, ‘libdft를 이용한 동적 오염 분석 실전’에서는 직접 동적 오염 분석을 수행하는 도구를 만들고자 libdft를 이용하는 방법을 배운다. 12장, ‘기호 실행 원리’에서는 복잡한 프로그램의 내부를 자동으로 구석구석 탐색하는 고급 기법인 기호 실행(symbolic execution)의 기본 원리를 설명한다. 13장, ‘Triton을 이용한 기호 실행 실전’에서는 기호 실행을 확인할 수 있는 도구를 만들고자 Triton을 활용할 것이다.
4부에서는 이 책을 읽을 때 유용하게 활용할 수 있는 부록을 준비했다. 부록 A, ‘x86 어셈블리 요약본’에서는 x86 어셈블리 언어에 아직 익숙하지 않은 독자들을 배려해 관련 내용을 간략히 요약했다. 부록 B, ‘lebelf를 사용해 PT_NOTE 덮어쓰기 실습’에서는 7장에서 다룬 elfinject 도구의 구체적인 구현 내용을 담았다. 또한 이를 위해 사용된 libelf를 자세히 설명했다. 부록 C, ‘바이너리 분석 도구 목록’에서는 여러분이 사용하면 좋을 바이너리 분석 도구들의 목록을 기재했다. 부록 D, ‘더 읽어보기’에서는 이 책에서 다루고 있는 내용에 참고가 될 만한 관련 서적과 논문 목록의 출처를 명시했다.
지은이의 말
바이너리 분석은 컴퓨터 공학과 해킹 분야에서 가장 매혹적이면서도 한편으로는 가장 난제가 많은 과목이다. 관련 정보가 턱없이 부족해서 학습 난이도가 높은 편이다. 역공학(reverse engineering)과 악성 코드 분석(malware analysis) 관련 책은 차고 넘치는 데 반해, 바이너리 계측(binary instrumentation), 동적 오염 분석(dynamic taint analysis), 기호 실행(symbolic execution)과 같은 최신 바이너리 분석 기술의 연구 동향을 알려 주는 책은 없다.
그래서 바이너리 분석 분야에 입문하려는 사람들은 인터넷 골목을 구석구석 돌아다니며 정보를 찾아야 한다. 그마저도 상당수는 구식 방법이거나 부정확한 뉴스 기사, 애매한 토막글에 불과하다. 한편 연구자들이 작성하는 일명 학구적인(academic) 논문의 경우에는 바이너리 분석에 대해 방대한 양의 배경 지식을 이미 모두가 알고 있는 것처럼 가정하고 더욱 어려운 내용을 전개하려 한다. 그래서 논문을 먼저 읽으며 거꾸로 바이너리 분석의 기초를 습득하려 하면, 마치 닭이 먼저인지 달걀이 먼저인지 모를 모순에 빠지고 만다. 설상가상으로 바이너리 분석 기법을 구현한 라이브러리나 도구는 상세한 문서를 제공하지 않는다. 있다 하더라도 설명이 불완전해 이를 통한 학습도 어렵다.
이 책을 통해 바이너리 분석 분야에서 필요한 모든 중요한 주제가 일목요연하고 손쉽게 전달되어 높았던 진입 장벽이 허물어지기를 고대한다. 이 책을 읽은 후에는 바이너리 분석 분야의 급변하는 현 상황에 대한 통찰을 얻고, 직접 현장에 과감히 뛰어들 수 있을 것이다.
옮긴이의 말
기존의 바이너리 분석은 소위 '리버스 엔지니어링(역공학)'이라는 이름으로, 숙련된 전문가들이 직접 소프트웨어의 취약점을 찾거나, 악성코드의 침해행위에 대응하기 위한 수작업이었다. 하지만 현대의 소프트웨어가 복잡해지고 난독화 등의 방법까지 등장하게 되면서, 소수의 손에만 의존하기에는 자원적 측면에서 한계에 다다랐다. 이제는 이 모든 작업을 '자동화'할 수 있는 방법이 필요하다. 제목을 단순히 기존에 출시된 여러 서적처럼 '역공학’이란 표현을 사용하지 않고, '바이너리 분석’으로 명명한 것은 바로 자동화 가능한 기술을 가미한 데에 큰 의의가 있기 때문이다. 이 책의 전반부에서 기초적인 기계어 코드 해석 방법과 역공학 지식을 터득한 뒤에, 후반부에서 본격적으로 '바이너리 계측(instrumentation)', '오염 분석(taint anlaysis)', '퍼징(fuzzing)', '기호 실행(symbolic execution)' 등의 고급 기법을 배우게 될 것이다.
대학원 재학 시절, 앞서 언급한 어려운 개념들을 공부하기 위해 영어 논문을 찾아 겨우겨우 해석해가며 읽어왔던 나날이 있었다. 처음엔 배경지식이 전무하고 어디서부터 무엇을 학습해야 할지 순서조차 파악하지 못한 상태라 길잡이가 돼 줄 교과서 같은 책이 절실했다. 석사 학위를 마치고 회사에 입사하고 나서야 이 책을 만나게 돼 정말 아쉬웠다. 이 책이 조금만 더 빨리 세상에 나왔더라면, 학습 속도가 달랐지 않았을까 하는 생각이었다. 그렇지만 그 후회에서 그치지 않고, 오히려 이 책을 더 많이 알리고 싶다는 생각에 번역을 자원하게 됐다. 한국어로 번역된 이 책을 통해 한국의 학생들이나 직무를 위한 수련자들이 역량을 강화할 수 있게 된다면 나에게도 큰 기쁨이 될 것이라는 기대 때문이었다.