카테고리 보관물: 잡기

[책] Binary Hacks

서점에서 백수짓 하다가 낚아온 책인데 며칠 읽어보니 좀 어렵지만 좋은 내용이 많아요. 오라일리 책은 보통 한빛 미디어에서 번역 하던데 이 책의 출판사 이름은 좀 생소 합니다.
‘Hack’에서 연상되는 어두운 이미지에다 ‘cracking’을 연상 시키는 우함마 그림에 ‘해커가 전수 하는’이라는 부제 덕인지 이 책은 보안 section에 진열되어 있었습니다. (일본어 판은 바둑판 그림이 있더군요)
하지만 실제 내용은 저수준에서 시스템 동작을 설명해 주는 비중이 더 많습니다.
표지에는 ‘중급자용’ 이라고 씌여 있는데… 저는 뻥이라고 봅니다. 유용하지만 난이도가 꽤 있어요.
관심 있으시면 아래 링크에서 차례를 읽어 보세요. 🙂

http://www.itcpub.co.kr/book/book_view1.html?h_code=h_2&book_num=996#

1장 소개 1
1. Binary Hack 입문 1
2. Binary Hack 용어 정리 4
3. file - 파일 종류 확인 12
4. od - 바이너리 파일 덤프 15

2장 오브젝트 파일 Hack 21
5. ELF 입문 21
6. 정적 라이브러리와 공유 라이브러리 34
7. ldd - 공유 라이브러리 의존관계 확인 37
8. readelf - ELF 파일 정보 보기 42
9. objdump - (1) 오브젝트 파일 덤프 45
10. objdump - (2) 오브젝트 파일 역어셈블 50
11. objcopy - 실행 파일에 데이터 삽입하기 55
12. nm - 오브젝트 파일에 포함된 심볼 확인 56
13. strings - 바이너리 파일에서 문자열 추출 63
14. c++filt - C++ 심볼 demangle 65
15. addr2line - 주소에서 파일명과 행 번호 얻기 66
16. strip - 오브젝트 파일에서 심볼 삭제 68
17. ar - 정적 라이브러리 다루기 70
18. C와 C++ 프로그램 링크 방법 71
19. 링크할 때 심볼 충돌 방지하기 78
20. GNU/리눅스 시스템에서 공유 라이브러리에 PIC를 사용하는 이유 85
21. statifier - 동적 실행 파일에서 의사 정적 실행 파일 생성 89

3장 GNU 프로그래밍 Hack 93
22. GCC 확장기능 입문 94
23. GCC로 인라인 어셈블러 사용 100
24. GCC 빌트인 함수를 이용한 최적화 105
25. glibc를 이용하지 않은 “Hello World” 109
26. TLS(Thread Local Storage) 114
27. glibc로 시스템 환경에 따라 라이브러리 전환하기 116
28. 링크된 라이브러리에 따라 프로그램 동작 바꾸기 120
29. 라이브러리 외부에 공개할 심볼 제한 122
30. 호환성 관리를 위해 버전별 심볼 사용 126
31. main( ) 함수 이전에 함수호출하기 134
32. 실행 중에 GCC가 트램펄린 코드를 생성하는 방법 138
33. 스택에 있는 코드의 실행 허용/금지 140
34. 힙에 있는 코드 실행 142
35. PIE(Position Independant Executable, 위치독립실행형식) 생성 144
36. C++로 synchronized method 작성 147
37. C++로 싱글톤 생성 152
38. g++ 예외 처리 이해(throw) 158
39. g++ 예외 처리 이해(SjLj) 160
40. g++ 예외 처리 이해(DWARF2) 168
41. g++ 예외 처리의 실행 시간 비용 172

4장 보안 프로그래밍 Hack 177
42. GCC 보안 프로그래밍 입문 177
43. -ftrapv로 정수 연산 오버플로 검출 182
44. Mudflap - 버퍼 오버플로 검출 186
45. -D_FORTIFY_SOURCE로 버퍼 오버플로 검출 190
46. -fstack-protector로 스택 보호 194
47. bitmask 사용 시 unsigned를 사용하는 이유 198
48. big shift 작업이 위험한 이유 200
49. 64비트 환경에서 0과 NULL의 차이점 202
50. POSIX 스레드 안전한 함수 205
51. 시그널 핸들러 안전하게 작성하기 209
52. sigwait - 비동기 시그널을 동기적으로 처리하기 215
53. sigsafe - 안전하게 시그널 처리하기 220
54. Valgrind - (1) 메모리 누수 검출하기 230
55. Valgrind - (2) 비정상적인 메모리 접근 검출하기 233
56. Helgrind - 멀티스레드 프로그램 디버그하기 237
57. fakeroot - 거짓 root 권한으로 프로세스 실행하기 241

5장 런타임 Hack 245
58. 프로그램이 main( )에 도달하기까지의 과정 245
59. 시스템콜을 호출하는 방법 255
60. LD_PRELOAD로 공유 라이브러리 교체하기 259
61. LD_PRELOAD로 기존 함수 래핑하기 262
62. dlopen - 실행 중에 동적 링크하기 265
63. C로 백트레이스 표시 270
64. 실행 중인 프로세스의 절대경로 확인 276
65. 실행 중인 프로세스에서 로드하고 있는 공유 라이브러리 확인 280
66. 실행 중인 프로세스의 메모리 맵 확인 286
67. libbfd - 심볼 열거하기 292
68. 실행 중에 C++ 심볼 demangle하기 297
69. ffcall - 동적 시그니처로 함수호출 300
70. libdwarf - 디버그 정보 얻기 305
71. dumper - 구조체 데이터를 보기 쉽게 덤프하기 310
72. 오브젝트 파일을 직접 로드하기 314
73. libunwind - 콜 체인 제어하기 322
74. GNU lightning - 실행 중에 이식 가능한 코드 생성하기 326
75. 스택 영역의 주소 얻기 329
76. sigaltstack - 스택 오버플로에 대처하기 335
77. 함수 진입(enter)/종료(exit) 후킹하기 347
78. 시그널 핸들러로 프로그램 컨텍스트 변경하기 350
79. 프로그램 카운터 값 얻기 352
80. 자기수정코드로 프로그램 동작 변경 353
81. SIGSEGV로 주소 접근 유효성 확인 357
82. strace - 시스템콜 추적하기 360
83. ltrace - 공유 라이브러리의 함수호출 추적하기 362
84. Jockey로 리눅스 프로그램의 실행을 기록, 재생하기 364
85. prelink - 프로그램 기동 향상시키기 366
86. livepatch - 실행 중인 프로세스 패치하기 370

6장 프로파일러-디버거 Hack 379
87. gprof - 프로파일 조사하기 379
88. sysprof - 시스템 프로파일 조사하기 383
89. oprofile - 상세한 시스템 프로파일 얻기 385
90. GDB - 실행 중인 프로세스 제어하기 390
91. 하드웨어 디버그 기능 사용하기 393
92. C 프로그램에서 중단점 설정하기 397
7장 그 밖의 Hack 399
93. Boehm GC의 구조 399
94. 프로세서의 메모리 정렬 406
95. PCL을 이용한 경량 병행처리 411
95. CPU 클록 수 세기 414
97. 부동소수점 수의 비트 표현 419
98. x86 부동소수점 연산자의 특성 421
99. 결과가 무한대 또는 NaN인 연산에서 시그널 발생하기 426