Top

실전 바이너리 분석 [자동화 취약점 탐지를 위한]

  • 원서명Practical Binary Analysis: Build Your Own Linux Tools for Binary Instrumentation, Analysis, and Disassembly (ISBN 9781593279127)
  • 지은이데니스 앤드리스(Dennis Andriesse)
  • 옮긴이박재유
  • ISBN : 9791161755069
  • 43,000원
  • 2021년 03월 30일 펴냄
  • 페이퍼백 | 608쪽 | 188*235mm
  • 시리즈 : 해킹과 보안

책 소개

소스 파일은 아래 깃허브 페이지에서 내려 받으실 수 있습니다.
(https://github.com/AcornPublishing/binary-analysis)

요약

현대 사회에서 컴퓨터는 필수적이다. 특히 최근 인공지능 기술의 발전으로 컴퓨터는 상당한 수준의 고급 기능을 제공하며 인간의 생활을 윤택하게 했다. 그렇지만 그 이면을 보면, 컴퓨터가 과연 똑똑한 것인지 의문을 품게 된다. 사람은 자신의 복잡한 생각을 다양한 방식으로 처리할 수 있지만, 컴퓨터는 0과 1의 조합으로만 대상을 이해할 수 있다. 이 때문에 컴퓨터 관점의 언어를 저수준(low-level)이라고 부르고, 인간의 시각을 고수준(high-level)이라고 지칭한다. 서로 다른 국가의 사람들이 통용하는 언어가 다르듯이, 컴퓨터 역시 아키텍처나 운영체제에 따라 상이한 바이너리(이진 파일) 결과물을 사용한다. 그 때문에 사람이 다양한 종류의 컴퓨터 언어를 습득해 이해하는 것은 결코 쉽지 않다. 바이너리 분석이란 결국 이 둘 사이의 간극을 해결하는 일종의 '번역' 또는 '통역' 작업이라고 볼 수 있다. 이 책이 설명하는 여러 가지 기술을 통해, 컴퓨터와 심층적으로 소통할 수 있게 될 것이다.

추천의 글

데니스 앤드리스는 바이너리 분석 분야의 전문가다. 그는 굉장히 복잡한 개념을 아주 단순하게 설명하면서도, 지나치게 내용을 축소해 핵심을 놓치는 일이 없다.

허버트 보스(Herbert Bos) 교수
/암스테르담 자유대학교, 시스템 및 네트워크 보안,

이 책에서 다루는 내용

■ 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) 논문의 경우에는 바이너리 분석에 대해 방대한 양의 배경 지식을 이미 모두가 알고 있는 것처럼 가정하고 더욱 어려운 내용을 전개하려 한다. 그래서 논문을 먼저 읽으며 거꾸로 바이너리 분석의 기초를 습득하려 하면, 마치 닭이 먼저인지 달걀이 먼저인지 모를 모순에 빠지고 만다. 설상가상으로 바이너리 분석 기법을 구현한 라이브러리나 도구는 상세한 문서를 제공하지 않는다. 있다 하더라도 설명이 불완전해 이를 통한 학습도 어렵다.
이 책을 통해 바이너리 분석 분야에서 필요한 모든 중요한 주제가 일목요연하고 손쉽게 전달되어 높았던 진입 장벽이 허물어지기를 고대한다. 이 책을 읽은 후에는 바이너리 분석 분야의 급변하는 현 상황에 대한 통찰을 얻고, 직접 현장에 과감히 뛰어들 수 있을 것이다.

지은이 소개

데니스 앤드리스(Dennis Andriesse)

시스템 및 네트워크 보안 분야에서 박사학위를 취득했으며, 현재 바이너리 분석 관련 연구를 수행하고 있다. ROP 등의 제어 흐름 탈취 공격으로부터 방어하기 위한 제어 흐름 무결성 보호 체계인 PathArmor의 핵심 개발자다. 또한 GameOver Zeus P2P botnet에 대한 진압 작전에 투입된 개발 요원이기도 했다.

옮긴이의 말

기존의 바이너리 분석은 소위 '리버스 엔지니어링(역공학)'이라는 이름으로, 숙련된 전문가들이 직접 소프트웨어의 취약점을 찾거나, 악성코드의 침해행위에 대응하기 위한 수작업이었다. 하지만 현대의 소프트웨어가 복잡해지고 난독화 등의 방법까지 등장하게 되면서, 소수의 손에만 의존하기에는 자원적 측면에서 한계에 다다랐다. 이제는 이 모든 작업을 '자동화'할 수 있는 방법이 필요하다. 제목을 단순히 기존에 출시된 여러 서적처럼 '역공학’이란 표현을 사용하지 않고, '바이너리 분석’으로 명명한 것은 바로 자동화 가능한 기술을 가미한 데에 큰 의의가 있기 때문이다. 이 책의 전반부에서 기초적인 기계어 코드 해석 방법과 역공학 지식을 터득한 뒤에, 후반부에서 본격적으로 '바이너리 계측(instrumentation)', '오염 분석(taint anlaysis)', '퍼징(fuzzing)', '기호 실행(symbolic execution)' 등의 고급 기법을 배우게 될 것이다.

대학원 재학 시절, 앞서 언급한 어려운 개념들을 공부하기 위해 영어 논문을 찾아 겨우겨우 해석해가며 읽어왔던 나날이 있었다. 처음엔 배경지식이 전무하고 어디서부터 무엇을 학습해야 할지 순서조차 파악하지 못한 상태라 길잡이가 돼 줄 교과서 같은 책이 절실했다. 석사 학위를 마치고 회사에 입사하고 나서야 이 책을 만나게 돼 정말 아쉬웠다. 이 책이 조금만 더 빨리 세상에 나왔더라면, 학습 속도가 달랐지 않았을까 하는 생각이었다. 그렇지만 그 후회에서 그치지 않고, 오히려 이 책을 더 많이 알리고 싶다는 생각에 번역을 자원하게 됐다. 한국어로 번역된 이 책을 통해 한국의 학생들이나 직무를 위한 수련자들이 역량을 강화할 수 있게 된다면 나에게도 큰 기쁨이 될 것이라는 기대 때문이었다.

옮긴이 소개

박재유

한국항공대학교에서 컴퓨터 정보공학을 전공하고, 공군 정보통신 장교로 복무하며 정보 보안에 입문했다. 전역 후 KITRI의 Best of the Best 4기 디지털 포렌식 과정을 수료하고 한국과학기술원(KAIST) 대학원에 입학해 소프트웨어 보안을 연구했다. 석사 졸업 후 현재는 LG전자 소프트웨어 공학연구소에서 보안 기술(퍼즈 테스팅과 바이너리 분석)을 연구하고 있다.
정보처리기사, 전자계산기조직응용기사, 정보보안기사, 디지털 포렌식 전문가 2급 등을 보유하고 있다. 또한 2016년 한국정보기술연구원(KITRI) 주관의 정보 보안 스타트업 프로젝트 그랑프리 우승, 2018년 한국 디지털 포렌식 학회 주관의 챌린지에서 장려상을 수상했다.
2017년 대덕 소프트웨어 마이스터 고등학교의 멘토로 위촉돼 강의 및 디지털 포렌식 동아리 활동을 지도했고, 2019년부터 서울 지방 경찰청 사이버 명예 경찰 누리캅스로 활동하고 있다. 2020년 Digital Forensics Challenge 문제 출제 및 심사위원으로 활동했다.
저서로는 『APT 악성 코드와 메모리 분석 첼린지 풀이 사례』(비팬북스, 2016), 『VolUtility 리뷰와 첼린지 문제 풀이 사례』(비팬북스, 2016), 『리눅스 시스템의 메모리 포렌식』(브이메이커스, 2018) 등 메모리 포렌식 관련 전자책이 있으며, 2020년 세종도서 학술부문에 선정된 『모의 침투 입문자를 위한 파이썬 3 활용(에이콘, 2020)을 공저로 집필했다.

목차

목차
  • 1부. BINARY FORMATS
  • 1장. 바이너리란 무엇인가
  • 1.1 C언어로 작성된 프로그램의 컴파일 과정
  • 1.1.1 전처리 단계
  • 1.1.2 컴파일 단계
  • 1.1.3 어셈블 단계
  • 1.1.4 링킹 단계
  • 1.2 심벌과 스트립 바이너리
  • 1.2.1 심벌 정보 확인하기
  • 1.2.2 바이너리 스트립: 관련 정보 은닉하기
  • 1.3 바이너리 디스어셈블
  • 1.3.1 목적 파일
  • 1.3.2 단독으로 실행가능한 바이너리 파일 분석하기
  • 1.4 바이너리 로딩과 실행
  • 1.5 이 장의 요약
  • 연습 문제

  • 2장. ELF 바이너리 포맷
  • 2.1 ELF 파일 헤더
  • 2.1.1 e_ident 배열
  • 2.1.2 etype, emachine, e_version 필드
  • 2.1.3 e_entry 필드
  • 2.1.4 ephoff와 eshoff 필드들
  • 2.1.5 e_flags 필드
  • 2.1.6 e_ehsize 필드
  • 2.1.7 e*entsize 와 e*num 필드
  • 2.1.8 e_shstrndx 필드
  • 2.2 섹션 헤더
  • 2.2.1 sh_name 필드
  • 2.2.2 sh_type 필드
  • 2.2.3 sh_flags 필드
  • 2.2.4 shaddr, shoffset, sh_size 필드
  • 2.2.5 sh_link 필드
  • 2.2.6 sh_info 필드
  • 2.2.7 sh_addralign 필드
  • 2.2.8 sh_entsize 필드
  • 2.3 섹션
  • 2.3.1 .init 과 .fini 섹션
  • 2.3.2 .text 섹션
  • 2.3.3 .bss, .data, .rodata 섹션들
  • 2.3.4 지연 바인딩과 .plt, .got, .got.plt 섹션
  • 2.3.5 .rel.* 과 .rela.* 섹션
  • 2.3.6 .dynamic 섹션
  • 2.3.7 .initarray와 .finiarray 섹션
  • 2.3.8 .shstrtab, .symtab, .strtab, .dynsym, .dynstr 섹션
  • 2.4 프로그램 헤더
  • 2.4.1 p_type 필드
  • 2.4.2 p_flags 필드
  • 2.4.3 poffset, pvaddr, ppaddr, pfilesz, p_memsz 필드
  • 2.4.4 p_align 필드
  • 2.5 요약
  • 연습 문제

  • 3장. PE 바이너리 포맷요약 정리
  • 3.1 MS-DOS 헤더와 MS-DOS 스텁
  • 3.2 PE 시그니처, 파일 헤더, 옵션 헤더
  • 3.2.1 PE 시그니처
  • 3.2.2 PE 파일 헤더
  • 3.2.3 PE 옵션 헤더
  • 3.3 섹션 헤더 테이블
  • 3.4 섹션
  • 3.4.1 .edata와 .idata 섹션
  • 3.4.2 PE코드 섹션의 패딩
  • 3.5 요약
  • 연습문제

  • 4장. LIBBFD를 이용한 바이너리 로더 제작
  • 4.1 libbfd란 무엇인가?
  • 4.2 바이너리 로더의 기본 인터페이스
  • 4.2.1 바이너리 클래스
  • 4.2.2 섹션 클래스
  • 4.2.3 심벌 클래스
  • 4.3 바이너리 로더 구현하기
  • 4.3.1 libbfd 초기화하고 바이너리 열기
  • 4.3.2 바이너리 기본 정보 분석하기
  • 4.3.3 심벌 정보 불러오기
  • 4.3.4 섹션 정보 불러오기
  • 4.4 바이너리 로더 테스트하기
  • 4.5 요약
  • 연습문제

  • 2부. BINARY ANALYSIS FUNDAMENTALS
  • 5장 리눅스 바이너리 분석 기초
  • 5.1 file 명령어를 사용해 식별하기
  • 5.2 ldd 명령어를 사용해 의존성 점검하기
  • ASCII 코드 신속하게 찾기
  • 5.3 xxd 명령어를 사용해 파일 내부 내용 확인하기
  • 5.4 readelf 명령어를 사용해 ELF 파일 형식 추출하기
  • 5.5 nm 명령어를 사용해 심벌 정보 분석하기
  • 5.6 strings 명령어를 사용해 단서 찾기
  • 5.7 strace와 ltrace 명령어를 사용해 시스템콜 및 라이브러리 호출 추적하기
  • 5.8 ojdump 명령어를 사용해 기계어 수준 동작 확인하기
  • 5.9 gdb 명령어를 사용해 동적으로 문자열 버퍼 덤프하기
  • 5.10 요약
  • 연습문제

  • 6장. 디스어셈블과 바이너리 분석 방법론
  • 6.1 정적 디스어셈블
  • 6.1.1 선형 디스어셈블
  • 6.1.2 재귀적 디스어셈블
  • 6.2 동적 디스어셈블
  • 6.2.1 예제: gdb로 바이너리 실행 추적하기
  • 6.2.2 코드 커버리지 전략
  • 6.3 디스어셈블된 코드와 데이터를 구조화하기
  • 6.3.1 코드 구조화
  • .eh_frame 섹션을 이용한 함수 탐지
  • 6.3.2 데이터 구조화
  • 6.3.3 디컴파일
  • 6.3.4 중간 언어 표현식
  • 6.4 주요 분석 방법론
  • 6.4.1 바이너리 분석 요소
  • 6.4.2 제어 흐름 분석
  • 6.4.3 데이터 흐름 분석
  • 6.5 디스어셈블시 컴파일러 설정 효과
  • 6.6 요약
  • 연습문제

  • 7장. ELF 바이너리 코드 인젝션 기법
  • 7.1 헥스 에디터를 이용한 원초적 수정 방법
  • 정확한 opcode 찾기
  • 7.1.1 한 바이트 버그 탐구하기
  • 7.1.2 한 바이트 버그 수정하기
  • 7.2 LD_PRELOAD를 사용해 공유 라이브러리 동작 변경하기
  • 7.2.1 힙 오버플로 취약점
  • 7.2.2 힙 오버플로 탐지하기
  • 7.3 코드 섹션 끼워넣기
  • 7.3.1 ELF 섹션 끼워넣기: 전체적 맥락
  • 7.3.2 elfinject 를 사용해 ELF 섹션 삽입하기
  • 7.4 삽입된 코드 호출하기
  • 7.4.1 엔트리 포인트 개조
  • 7.4.2 생성자와 소멸자 탈취하기
  • 7.4.3 GOT 엔트리 탈취하기
  • 7.4.4 PLT 엔트리 탈취하기
  • 7.4.5 직접 및 간접 호출 조작하기
  • 7.5 요약
  • 연습문제

  • 3부. ADVANCED BINARY ANALYSIS
  • 8장. 자체 제작 디스어셈블 도구 구현
  • 8.1 굳이 디스어셈블 과정을 자체 제작할 필요성은?
  • 8.1.1 자체 제작 디스어셈블 도구 사례: 난독화된 코드
  • 난독화되지 않은 바이너리에서도 코드 겹침 기법이 적용될 수 있다
  • 8.1.2 자체 제작 디스어셈블 도구를 개발할 또 다른 필요성
  • 8.2 캡스톤 살펴보기
  • 8.2.1 캡스톤 설치하기
  • 8.2.2 캡스톤으로 선형 디스어셈블 도구 제작하기
  • 8.2.3 캡스톤 C API 살펴보기
  • 8.2.4 캡스톤으로 재귀적 디스어셈블 도구 제작하기
  • 8.3 ROP 가젯 스캐너 구현
  • 8.3.1 ROP 개요
  • 8.3.2 ROP 가젯 탐색하기
  • 8.4 요약
  • 연습문제

  • 9장. 바이너리 계측
  • 9.1 바이너리 계측이란 무엇인가?
  • 9.1.1 바이너리 계측 API
  • 9.1.2 정적 및 동적 바이너리 계측 비교
  • 9.2 정적 바이너리 계측
  • 9.2.1 int 3 방법
  • 9.2.2 트램펄린 방법
  • 위치 독립 코드에 대한 트램펄린 적용
  • 9.3 동적 바이너리 계측
  • 9.3.1 DBI 시스템 구조
  • 9.3.2 Pin 개요
  • 9.4 Pin을 사용한 프로파일링
  • 9.4.1 프로파일링 도구의 자료구조 및 초기 설정을 위한 코드
  • 9.4.2 함수 심벌 분석하기
  • 9.4.3 기본 블록 계측하기
  • 9.4.4 제어 흐름 명령어 계측하기
  • 9.4.5 명령어 개수, 제어 흐름 변경 및 시스템 콜 횟수 측정하기
  • 9.4.6 프로파일링 프로그램 테스트하기
  • 9.5 Pin을 사용한 자동화 바이너리 패킹 해제
  • 9.5.1 바이너리 패킹 개요
  • 9.5.2 언패킹 도구의 자료구조 및 설정 코드
  • 9.5.3 메모리 사용 기록 계측하기
  • 9.5.4 제어 흐름 명령어 계측하기
  • 9.5.5 메모리 사용 기록 추적하기
  • 9.5.6 OEP 탐지 및 언패킹된 바이너리 덤프하기
  • 9.5.7 언패킹 프로그램 테스트하기
  • 9.6 요약
  • 연습문제

  • 10장. 동적 오염 분석 원리
  • 10.1 DTA란 무엇인가?
  • 10.2 DTA의 세가지 단계: DTA의 세 가지 요소: 오염원, 오염 지역, 오염 전파
  • 10.2.1 오염원 정의하기
  • 10.2.2 오염 지역 설정하기
  • 10.2.3 오염 전파 추적하기
  • 10.3 DTA를 사용해 Heartbleed 버그 탐지하기
  • 10.3.1 Heartbleed 취약점에 대한 간략한 요약
  • 10.3.2 오염 분석 방법을 통해 Heartbleed 탐지하기
  • 10.4 DTA 설계 요소: 오염 단위, 오염 색깔, 오염 정책
  • 10.4.1 오염 단위
  • 10.4.2 오염 색깔
  • 10.4.3 오염 전파 정책
  • 10.4.4 과잉 오염 및 과소 오염
  • 10.4.5 제어 의존성
  • 10.4.6 섀도 메모리
  • 10.5 요약
  • 연습문제

  • 11장. LIBDFT를 이용한 동적 오염 분석 도구 개발
  • 11.1 libdft 소개
  • 11.1.1 libdft 내부 구조
  • 11.1.2 오염 정책
  • 11.2 DTA를 사용해 원격 제어 탈취 탐지하기
  • 11.2.1 오염 정보 확인하기
  • 11.2.2 오염원: 수신된 바이트의 오염
  • 11.2.3 오염 지역: execve 함수의 매개 변수 점검하기
  • 11.2.4 제어권 탈취 시도 탐지하기
  • 11.3 암시적 제어 흐름을 통해 DTA 우회하기
  • 11.4 DTA를 사용해 데이터 유출 탐지하기
  • 11.4.1 오염원: 파일 열기 작업에 대한 오염 추적
  • 11.4.2 오염 지역: 데이터 유출을 시도하는 네트워크 송신 감시
  • 11.4.3 데이터 유출 시도 탐지하기
  • 11.5 요약
  • 연습문제

  • 12장. 기호 실행 원리
  • 12.1 기호 실행 개요
  • 12.1.1 기호적 vs 구체적 실행
  • 12.1.2 기호 실행의 다양한 방법론 분류 및 각 한계점
  • 12.1.3 기호 실행의 확장 용이성 향상하기
  • 12.2 Z3을 이용한 제약조건 풀이
  • 12.2.1 명령어의 도달 가능성 증명
  • 12.2.2 명령어의 도달 불가능성 증명
  • 12.2.3 수식의 유효성 증명
  • 12.2.4 표현식 간소화
  • 12.2.5 비트 벡터를 사용해 기계어 코드의 제약 조건 모델링하기
  • 12.2.6 비트 벡터로 표현된 모호한 표현식 풀이하기
  • 12.3 요약
  • 연습문제

  • 13장. Triton을 이용한 기호 실행 실습
  • 13.1 Triton 개요
  • 13.2 추상 구문 트리를 이용해 상태 정보 관리하기
  • 13.3 Triton을 이용한 백워드 슬라이싱
  • 13.3.1 Triton 헤더 파일 및 Triton 환경 설정
  • 13.3.2 심벌 환경 설정 파일
  • 13.3.3 명령어 에뮬레이팅
  • 13.3.4 Triton의 아키텍처 설정
  • 13.3.5 백워드 슬라이스 계산
  • 13.4 Triton을 이용한 코드 충족도 확대
  • 13.4.1 기호 변수 생성
  • 13.4.2 새로운 경로를 위한 모델 찾기
  • 13.4.3 코드 충족도 도구 실행
  • 13.5 자동으로 취약점 익스플로잇하기
  • 13.5.1 취약한 프로그램
  • 13.5.2 취약한 호출 지점의 주소 찾기
  • 13.5.3 익스플로잇 생성 도구 구현
  • 13.5.4 루트 셸 획득
  • 13.6 요약
  • 연습문제

  • 4부. 부록
  • 부록 A. 인텔 64비트 어셈블리 요점 정리
  • 부록 B. LIBELF를 이용한 PT_NOTE 덮어쓰기 구현
  • 부록 C. 바이너리 분석 도구 추천
  • 부록 D. 참고 문헌

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안