모두를 위한 리버싱 지침서 (리버싱을 통한 어셈블리 언어의 이해 | 2 판)

모두를 위한 리버싱 지침서 (리버싱을 통한 어셈블리 언어의 이해 | 2 판)

$76.95
Description
개발자가 작성한 소스코드가 어떻게 컴파일되는지 이해하려면 컴파일러가 만들어낸 어셈블리 코드를 분석하는 방법과 컴파일 과정에서 최적화 옵션이 어떤 영향을 주는지, 소스코드상의 프로그래밍 요소(배열, 구조체, 포인터 등)와 다양한 프로그래밍 로직에 대한 어셈블리 코드를 설명한다. 또한 동일 소스코드에 대해서 x86 계열의 CPU뿐만 아니라 ARM, MIPS에서 만들어지는 어셈블리 코드를 비교 분석해 다양한 어셈블리 코드를 이해할 수 있는 능력을 기를 수 있다. 이 책은 진정한 리버스 엔지니어라면 반드시 읽어야할 지침서다.
저자

데니스유리체프

데니스유리체프(DennisYurichev)
우크라이나출신의숙련된리버스엔지니어이자프로그래머로,오라클RDBMS보안연구가로알려져있다.VMware에일부가된벤처기업블루레인(Bluelane)에서보안연구가로일한바있다.

목차

1장.코드패턴
1.1방법론
1.2몇가지기본사항
1.2.1CPU에대한간단한소개
1.2.2수체계
1.2.3다른기수로의변환
1.3빈함수
1.3.1x86
1.3.2ARM
1.3.3MIPS
1.3.4실제로사용되는빈함수
1.4리턴값
1.4.1x86
1.4.2ARM
1.4.3MIPS
1.5Hello,world!
1.5.1x86
1.5.2x86-64
1.5.3GCC:한가지더
1.5.4ARM
1.5.5MIPS
1.5.6결론
1.5.7연습문제
1.6함수프롤로그와에필로그
1.6.1재귀
1.7스택
1.7.1스택이거꾸로자라는이유
1.7.2스택의용도
1.7.3전형적인스택레이아웃
1.7.4스택노이즈
1.7.5연습문제
1.8여러개의인자를취하는printf()
1.8.1x86
1.8.2ARM
1.8.3MIPS
1.8.4결론
1.8.5부연설명
1.9scanf()
1.9.1간단한예
1.9.2흔히하는실수
1.9.3전역변수
1.9.4scanf()
1.9.5연습문제
1.10전달된인자에접근
1.10.1x86
1.10.2x64
1.10.3ARM
1.10.4MIPS
1.11리턴결과더알아보기
1.11.1void를리턴하는함수의결과사용
1.11.2함수의결과를사용하지않는경우
1.11.3구조체리턴
1.12포인터
1.12.1리턴값
1.12.2입력값교환
1.13GOTO연산
1.13.1데드코드
1.13.2연습
1.14조건부점프
1.14.1간단한예
1.14.2절댓값계산
1.14.33항연산자
1.14.4최댓값,최솟값구하기
1.14.5결론
1.14.6연습
1.15switch()/case/default
1.15.1경우의수가적은switch()문
1.15.2경우의수가많은switch()문
1.15.3한블록에여러경우가존재할때
1.15.4폴쓰루
1.15.5연습
1.16루프
1.16.1간단한예
1.16.2메모리블록복사루틴
1.16.3조건검사
1.16.4결론
1.16.5연습
1.17간단한C문자열처리
1.17.1strlen()
1.17.2문자열의경계
1.18산술연산명령치환
1.18.1곱셈
1.18.2나눗셈
1.18.3연습
1.19부동소수점장치
1.19.1IEEE754
1.19.2x86
1.19.3ARM,MIPS,x86/x64SIMD
1.19.4C/C++
1.19.5간단한예제
1.19.6부동소수점수를인자로전달
1.19.7비교연산예제
1.19.8어떤상수값
1.19.9복사
1.19.10스택과계산기,역폴란드표기법
1.19.11왜80비트인가?
1.19.12x64
1.19.13연습
1.20배열
1.20.1간단한예
1.20.2버퍼오버플로
1.20.3버퍼오버플로에서보호하는방법
1.20.4배열관련내용하나더
1.20.5문자열에대한포인터배열
1.20.6다차원배열
1.20.7문자열집합을2차원배열로처리
1.20.8결론
1.20.9연습
1.21예:Angband게임의버그
1.22특정비트처리
1.22.1특정비트검사
1.22.2특정비트의설정과해제
1.22.3시프트
1.22.4특정비트의설정과해제:FPU예
1.22.51로설정된비트수세기
1.22.6결론
1.22.7연습
1.23의사난수생성기로서의선형합동생성기
1.23.1x86
1.23.2x64
1.23.332비트ARM
1.23.4MIPS
1.23.5예제의스레드안전버전
1.24구조체
1.24.1MSVC:SYSTEMTIME예제
1.24.2malloc()을이용한구조체할당
1.24.3유닉스:structtm
1.24.4구조체에서필드패킹
1.24.5중첩된구조체
1.24.6구조체에서의비트필드
1.24.7연습
1.25공용체
1.25.1의사난수생성기예제
1.25.2머신엡실론계산
1.25.3FSCALE명령어교체
1.25.4빠른제곱근계산
1.26함수포인터
1.26.1MSVC
1.26.2GCC
1.26.3함수포인터의위험성
1.2732비트환경에서의64비트값
1.27.164비트값리턴
1.27.2인자전달,덧셈,뺄셈
1.27.3곱셈,나눗셈
1.27.4우측시프트
1.27.532비트값을64비트로변환
1.28SIMD
1.28.1벡터화
1.28.2SIMDstrlen()구현
1.2964비트
1.29.1x86-64
1.29.2ARM
1.29.3부동소수점수
1.29.464비트아키텍처에대한비판
1.30SIMD를이용한부동소수점수처리
1.30.1간단한예제
1.30.2부동소수점수를인자로전달
1.30.3비교예제
1.30.4머신엡실론계산:x64과SIMD
1.30.5의사난수생성기예제다시보기
1.30.6정리
1.31ARM관련세부사항
1.31.1숫자앞의#표시
1.31.2주소지정모드
1.31.3레지스터에상수로드
1.31.4ARM64에서의재배치
1.32MIPS관련세부사항
1.32.132비트상수를레지스터에로드
1.32.2MIPS에대한추가자료


2장.중요한기초내용
2.1정수형데이터타입
2.1.1비트
2.1.2니블
2.1.3바이트
2.1.4와이드문자
2.1.5부호있는정수와부호없는정수
2.1.6워드
2.1.7주소레지스터
2.1.8숫자
2.2부호있는수의표현
2.2.1IMUL과MUL명령어
2.2.22의보수에대한추가적인내용
2.3정수오버플로
2.4AND
2.4.1값이2n경계에있는지확인
2.4.2KOI-8R키릴문자인코딩
2.5빼기와더하기를위한AND와OR
2.5.1ZXSpectrumROM문자열
2.6XOR(exclusiveOR)
2.6.1일상에서의XOR연산
2.6.2암호화
2.6.3RAID4
2.6.4XOR스왑알고리즘
2.6.5XOR링크드리스트
2.6.6조브리스트해싱/타뷸레이션해싱
2.6.7부연설명
2.6.8MOV를위한AND/OR/XOR
2.7POPCNT
2.8엔디안
2.8.1빅엔디안
2.8.2리틀엔디안
2.8.3예제
2.8.4바이엔디안
2.8.5데이터변환
2.9메모리
2.10CPU
2.10.1분기예측기
2.10.2데이터의존성
2.11해시함수
2.11.1단방향함수의동작방식


3장.좀더진보된예제
3.1이중부정
3.2strstr()예제
3.3온도변환
3.3.1정수값
3.3.2부동소수점수
3.4피보나치수
3.4.1예제#1
3.4.2예제#2
3.4.3정리
3.5CRC32계산예제
3.6네트워크주소계산예제
3.6.1calc_network_address()
3.6.2form_IP()
3.6.3print_as_IP()
3.6.4form_netmask(),set_bit()
3.6.5정리
3.7루프:몇가지반복지시자
3.7.1세개의반복지시자
3.7.2두개의반복지시자
3.7.3인텔C++2011의경우
3.8더프의디바이스
3.8.1펼쳐진루프를사용해야할까?
3.9곱하기를이용한나누기
3.9.1x86
3.9.2동작방식
3.9.3ARM
3.9.4MIPS
3.9.5연습
3.10문자열을숫자로변환(atoi())
3.10.1간단한예제
3.10.2좀더복잡한예제
3.10.3연습
3.11인라인함수
3.11.1문자열과메모리함수
3.12C99restrict
3.13브랜치없는abs()함수
3.13.1최적화를수행한GCC4.9.1x64
3.13.2최적화를수행한GCC4.9ARM64
3.14가변함수
3.14.1산술평균계산
3.14.2vprintf()함수
3.14.3Pin의경우
3.14.4형식문자열공격
3.15문자열트리밍
3.15.1x64:최적화를수행한MSVC2013
3.15.2x64:최적화를수행하지않은GCC4.9.1
3.15.3x64:최적화를수행한GCC4.9.1
3.15.4ARM64:최적화를수행하지않은GCC(Linaro)4.9
3.15.5ARM64:최적화를수행한GCC(Linaro)4.9
3.15.6ARM:최적화를수행한Keil6/2013(ARM모드)
3.15.7ARM:최적화를수행한Keil6/2013(Thumb모드)
3.15.8MIPS
3.16toupper()함수
3.16.1x64
3.16.2ARM
3.16.3비트연산이용
3.16.4정리
3.17난독화
3.17.1텍스트문자열
3.17.2실행코드
3.17.3가상머신/의사코드
3.17.4추가내용
3.17.5연습
3.18C++
3.18.1클래스
3.18.2ostream
3.18.3참조
3.18.4STL
3.18.5메모리
3.19음수의배열인덱스
3.19.1끝에서부터문자열주소지정
3.19.2끝에서부터메모리블록의주소지정
3.19.3인덱스가1부터시작하는배열
3.20비트연산을이용해12비트를배열에패킹(x64,ARM/ARM64,MIPS)
3.20.1소개
3.20.2데이터구조체
3.20.3알고리즘
3.20.4C/C++코드
3.20.5동작방식
3.20.6x86-64에서최적화를수행한GCC4.8.2
3.20.7최적화를수행한Keil5.05(Thumb모드)
3.20.8최적화를수행한Keil5.05(ARM모드)
3.20.9(32비트ARM)Thumb과ARM모드의코드밀도비교
3.

출판사 서평

★이책에서다루는내용★

OS개발자가아니라면어셈블리로코드를작성할필요는없을것이다.또한최신컴파일러(2010)는사람보다최적화수행능력이더좋다.또한최신의CPU는매우복잡해서어셈블리에대한지식이CPU의세부내용을이해하는데그렇게도움이되지는않는다.하지만최소한두가지영역에서는어셈블리에대한이해가도움이된다.무엇보다도보안/악성프로그램연구에도움이된다.그리고디버깅하는동안컴파일된코드를이해한다면많은도움이된다.따라서이책은어셈블리코드를작성하기보다는어셈블리어를이해하고자하는사람들을위한것이다.그래서컴파일된많은예제를책에담고있다


★이책의대상독자★

리버스엔지니어와C/C++에대한기본적인이해가있는사람이볼수있는책이다.

역자의말
리버스엔지니어링은다양한분야에서사용될수있는용어다.이책은그중에서소프트웨어리버스엔지니어링을다룬다.소프트웨어개발을위해개발자가프로그래밍언어로작성한소스코드는컴파일러에의해CPU가실행할수있는바이너리코드형태로변환된다.그렇게만들어진바이너리코드를디스어셈블러를이용해우리가이해할수있는어셈블리코드로변환할수있다.소프트웨어리버스엔지니어링은디스어셈블리과정으로만들어진어셈블리코드를해석해해당소프트웨어의동작방식을이해하고분석하는과정이라고할수있다.따라서리버스엔지니어링에있어어셈블리코드의이해는필수라고할수있다.어셈블리코드는그것이동작하는CPU의종류에따라각기다른스펙으로정의된다.독자는이책을통해어셈블리코드를분석하는방법을알수있을것이다.그리고일반적인x86계열의CPU뿐만아니라ARM,MIPS에대한어셈블리코드도매번비교설명하기때문에PC용바이너리뿐만아니라IoT기기와같은다양한플랫폼에서동작하는바이너리를리버스엔지니어링할수있는기반기술을배울수있을것이다.