메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기
정가 36,000원
판매가
36,000원
총 결제 금액 36,000원
dropdown arrow
  • 소장/대여 옵션 선택
  • 소장
  • 365일
    30% 할인
  • 180일
    40% 할인
  • 90일
    50% 할인
  • 30일
    60% 할인

마이한빛 > MY 콘텐츠에서 웹뷰어로 바로 이용가능한 상품이며 배송되지 않습니다.

대여 가능

전자책

종이책

0과 1 사이

고수준 코드 아래 숨은 실행, 구조, 보안, 메모리의 비밀

  • 저자가와타 아키라 , 고이케 유키 , 와타나베 게이치 , 사에키 다카야 , 아라타 미즈키
  • 번역진명조
  • 출간2025-10-20
  • 페이지712 쪽
  • eISBN9791169216487
  • 물류코드11648
  • 난이도
    초급 초중급 중급 중고급 고급
4.8점 (12명)

임베디드 시스템, 디버깅, 시스템 보안, 최적화 등
각종 기술과 89가지 노하우를 한 권에!

 

현대의 컴퓨터 시스템은 다층 구조로 이루어집니다. 추상화 레이어를 중첩하면서 발전해 왔으며, 무수한 기능이 실제로 구현되었습니다. 이러한 레이어는 매우 정교하게 설계된 만큼, 단순히 기능만 사용하려 한다면 각 레이어의 동작을 자세히 이해할 필요는 없습니다.

 

하지만 때로는 추상화 레이어를 벗겨내고 시스템 내부를 자세히 들여다봐야 할 때가 있습니다. 기존 도구만으로는 불가능한 무언가를 구현하려 할 때, 고성능 소프트웨어를 만들려 할 때, 보안 관련 프로그래밍을 할 때 등이 대표적인 예입니다. 추상화 메커니즘 그 자체 또는 추상화에 의해 은폐된 기능을 활용해야 하는 경우가 있기 때문입니다.

 

무엇보다도, 추상화 레이어와 그 하부 구조를 엿보는 과정은 매우 흥미롭습니다. 지금까지 개발자들이 쌓아온 하나하나의 구성 요소와 그 구조를 탐색해나가다 보면 우리가 몰랐던 무언가를 새롭게 발견할 수 있습니다. 게다가 현재는 많은 소프트웨어의 소스 코드가 대중에 공개되어 있는 만큼, 원한다면 언제든 구성 요소를 교체하거나 수정할 수 있습니다. 이 책은 그러한 저수준 프로그래밍의 세계를 탐색하고 이해하는 데 필요한 다양한 기법, 즉 핵(Hack)을 89가지 엄선해 제공합니다.
 

주요 내용

  • 1장(인트로덕션): 이 책의 도입부로 ‘Binary Hacks’에 대해 설명하고 기본적인 Hack들을 소개합니다.
  • 2장(ELF Hack): 리눅스에서 널리 쓰이는 Executable and Linkable Format(ELF)의 구조와 이를 Hack하는 방법을 소개합니다.
  • 3장(OS Hack): OS, 특히 리눅스의 기능을 고도로 활용하는 Hack을 소개합니다. 평소 사용하던 OS의 이면을 탐험해봅시다.
  • 4장(컨테이너 Hack): 컨테이너 기술에 대한 Hack을 소개합니다. 이제는 당연하게 활용되는 컨테이너 기술이지만 사실 많은 Binary Hacks의 조합으로 실현되고 있습니다.
  • 5장(디버거, 트레이서 Hack): 디버거와 트레이서의 사용법과 그 구현에 대해 소개합니다. 
  • 6장(보안 Hack): 컴퓨터 보안과 관련된 기술을 다룹니다. 이 분야에서는 날마다 공격자와 방어자가 치열하게 맞서고 있는데 그 일면을 소개합니다.
  • 7장(수치 표현과 데이터 처리 Hack): 수치 표현과 데이터 처리에 관한 Hack을 소개합니다. 두 분야 모두 컴퓨터 자체를 직접 다루는 재미가 있습니다.
  • 8장(언어 처리계 Hack): 일반적인 컴파일러 교과서에서 보기 어려운 컴파일러 및 인터프리터 주변의 주제를 다룹니다.
  • 9장(그 밖의 Hack): 이 책에서 사용하는 용어나 도구, 참고 문헌을 해설합니다. 이 책을 읽을 때는 물론이고 다양한 Binary Hack에 도전할 때 이정표가 될 것입니다.
가와타 아키라 저자

가와타 아키라

특정 용도의 칩을 위한 컴파일러와 런타임 개발에 종사하는 소프트웨어 엔지니어. 때때로 핵(Hack)이 가미된 소프트웨어 유지보수를 진행합니다. 교토대학교 정보학 석사로 대학원에서는 형식 이론을 연구했습니다. 일본 정보처리추진기구(IPA)의 2018년도 인재발굴 육성 사업 프로젝트에서 검색엔진을 개발한 경험이 있습니다.

고이케 유키 저자

고이케 유키

일본 컴퓨터 보안 서비스 제공업체 ㈜ GMO Cybersecurity by Ierae의 집행 임원. 청춘을 바쳐 CTF(Capture The Flag)에 몰입했으며 권위 있는 해킹 대회인 DEFCON CTF 결승에 최연소로 참가한 기록 등을 보유하고 있습니다. 그 시절 취미는 glibc의 소스 코드를 읽는 것이었으며 좋아하는 함수는 strfry였습니다. 쓰쿠바대학교 정보학군 정보과학류를 조기 졸업했습니다. 대학 시절에는 경쟁 프로그래밍(Competitive programming)을 했으며 ICPC 국제 대학 대항 프로그래밍 콘테스트 세계 대회에 두 차례 출전했습니다.

와타나베 게이치 저자

와타나베 게이치

외국계 IT 기업에서 OS 개발에 참여 중인 소프트웨어 엔지니어. 가상화 기술 관련 팀에서 테크 리드를 맡고 있습니다. 도쿄대학교 정보이공학 석사로 대학원에서는 함수형 프로그램 검증을 연구했고 한때는 OCaml로 C 컴파일러를 만들거나 C++의 constexpr로 컴파일 시점 C 컴파일러를 만들기도 했습니다. 프로그램의 정당성 증명 기술이나 프로그램을 격리하는 기술 등 ‘안전한 계산’을 실현하는 방법에 관심이 있습니다.

사에키 다카야 저자

사에키 다카야

OS와 VM 개발에 종사하는 소프트웨어 엔지니어. 도쿄대학 정보이공학 석사이며 가상화를 응용한 OS 변환 계층 개발 프로젝트를 통해 2016년도 미탐 슈퍼 크리에이터로 인정받았습니다. RPG 만들기 툴로 RPG를 개발하는 것부터 시작했지만 RPG는 완성되지 않았고 어느새 프로그래밍을 시작하기에 이르렀습니다. ~/dev에 축적된 미완성 프로그램 수에 자신 있습니다.

아라타 미즈키 저자

아라타 미즈키

수학과 출신의 소프트웨어 엔지니어. 회사에서는 파이썬 코드를 관리하지만 취미로 하스켈(Haskell) 컴파일러를 만지거나 Standard ML 컴파일러를 작성하고 있습니다. 수학과 프로그래밍이 교차하는 지점을 좋아합니다. 수치 계산에도 손을 대보려다 길을 잘못 들어 부동소수점의 늪에 빠지고 말았습니다.

진명조 역자

진명조

NHN Cloud 시스템 엔지니어. 번역한 책으로는 『대규모 서비스를 지탱하는 기술』, 『서버/인프라를 지탱하는 기술』, 『클라우드의 충격』, 『서버/인프라 엔지니어를 위한 DevOps』, 『프로세서를 지탱하는 기술』, 『파이썬 쉽게, 더 쉽게』(이상 제이펍), 『인프라 엔지니어의 교과서: 시스템 구축과 관리편』, 『텐서플로로 시작하는 딥러닝』, 『와이어샤크를 이용한 패킷 캡처 철저 입문』(이상 길벗),  『DEBUG HACKS』, 『리눅스 커널 HACKS』(이상 와우북스), 『Binary Hacks: 해커가 전수하는 테크닉 100선』, 『입문자를 위한 루비』(이상 ITC), 『데이터가 보인다』(비제이퍼블릭), 『C언어로 배우는 알고리즘 입문』(한빛미디어) 등이 있습니다.

01장 인트로덕션
_#01 미지의 바이너리 읽기
_#02 어셈블리 입문
_#03 다시 Hello, World!

 

02장 ELF Hack
_#04 ELF 파일의 세그먼트
_#05 ld-linux.so의 환경 변수 이용하기
_#06 공유 라이브러리를 검색할 디렉터리
_#07 dlopen에 의한 라이브러리 실행 시 로드와 응용 테크닉
_#08 IFUNC를 사용하여 실행 시 구현 전환하기
_#09 ELF의 해시 테이블 구조
_#10 TLS의 구조 이해하기
_#11 코어 파일 읽기
_#12 보조 벡터를 사용하여 프로세스에 정보 넘기기
_#13 정적 링크와 ASLR의 관계
_#14 sold를 사용하여 의존하는 공유 라이브러리 나중에 링크하기
_#15 glibc를 Hack하기
_#16 patchelf로 ELF 바이너리의 필드 수정하기
_#17 LIEF를 사용하여 ELF 바이너리 수정하기
_#18 PT_NOTE를 이용한 바이너리 패치
_#19 DWARF Expression 실행하기: DWARF I
_#20 DWARF로 수식 평가하기: DWARF II
_#21 DWARF에서 표준 출력으로 출력하기: DWARF III

 

03장 OS Hack
_#22 실행 가능 파일과 그 실행 방법
_#23 리눅스에서 Huge Page 사용하기
_#24 CRIU를 사용하여 프로세스 저장 및 재개하기
_#25 procfs/sysfs의 기본 파악하기
_#26 용도에 맞는 파일 시스템 선택하기
_#27 특정 프로세스에서 보이는 파일 교체하기
_#28 FUSE를 사용하여 파일 시스템 직접 만들기
_#29 특수한 메모리 영역 vsyscall과 vDSO
_#30 KVM을 사용하여 하이퍼바이저 생성하기
_#31 리눅스 커널 Hack 입문
_#32 UniKernel: 애플리케이션을 OS로 구동하기
_#33 UEFI와 Secure Boot
_#34 GNU 툴체인으로 기계어 파일 출력하기
_#35 _#30 QEMU에서 동작하는 펌웨어 만들기
_#36 크롬북에서 직접 만든 펌웨어 실행하기

 

04장 컨테이너 Hack
_#37 리눅스 네임스페이스로 프로세스 분리하기
_#38 cgroup으로 프로세스의 리소스 관리하기
_#39 chroot/pivot_root로 루트 디렉터리 전환하기
_#40 일반 유저가 root처럼 행동하는 방법 3가지
_#41 rootless 컨테이너 사용법과 구조
_#42 유저 네임스페이스 내에서 각종 네임스페이스 생성하기
_#43 /proc/PID/root에서 컨테이너 내의 파일에 직접 접근하기

 

05장 디버거, 트레이서 Hack
_#44 gdb Tips
_#45 rr을 사용하여 Record and Replay 디버깅하기
_#46 새니타이저로 저수준 버그 발견하기: 새니타이저 I
_#47 Address Sanitizer의 구조: 새니타이저 II
_#48 리눅스 퍼포먼스 분석 입문
_#49 ftrace를 사용하여 커널 내에서 발생하는 일 트레이스하기
_#50 eBPF를 사용한 트레이싱 입문
_#51 DBI로 실행 명령을 트레이스 및 변경하기
_#52 Intel PT를 사용하여 고속으로 트레이스 얻기

 

06장 보안 Hack
_#53 seccomp로 프로세스에서 사용할 수 있는 시스템 콜 제한하기
_#54 Landlock으로 비특권 프로세스 샌드박스 만들기
_#55 ASLR: 잘못된 메모리 접근에 대한 보안 메커니즘
_#56 ROP: 메모리 손상을 악용하는 표준적인 공격 기법
_#57 Intel CET: ROP에 대한 보안 메커니즘
_#58 Clang CFI를 이용하여 잘못된 제어 흐름 감지하기
_#59 스택 프레임의 변화 관찰하기
_#60 퍼징의 개요와 분류
_#61 그레이박스 퍼징으로 버그 및 취약성 찾기
_#62 LibAFL로 퍼저 구현하기
_#63 LibAFL로 구현한 퍼저 개선하기
_#64 angr로 심벌릭 실행하기
_#65 BadUSB: 사용자를 속이는 USB 디바이스
_#66 Row Hammer: DRAM의 취약성에 대한 공격 기법
_#67 Meltdown과 Spectre: CPU의 취약성에 대한 공격 기법

 

07장 수치 표현과 데이터 처리 Hack
_#68 정수 표현의 기초 지식
_#69 다양한 정수 표현
_#70 부동소수점 수의 비트열 표현 이해하기
_#71 부동소수점 예외
_#72 부동소수점 수의 반올림 방식 변경하기
_#73 부동소수점 환경을 다루는 코드에 대한 컴파일러 최적화와의 싸움
_#74 NaN 깊이 파헤치기
_#75 부동소수점 수의 아키텍처별 차이 다루기
_#76 SIMD 명령 세트의 기초 지식
_#77 SIMD 병렬화 코드 작성하기
_#78 SIMD 명령을 사용한 여러 가지 테크닉

 

08장 언어 처리계 Hack
_#79 NaN을 활용하여 64비트 값에 태그 붙인 값 저장하기
_#80 ucontext.h로 코루틴 구현하기
_#81 Profile Guided Optimization
_#82 LD_PRELOAD를 사용하여 메모리 할당자 교체하기
_#83 ABI와 호출 규약 이해하기
_#84 libffi로 실행 시까지 시그니처를 알 수 없는 함수 호출하기
_#85 실행 시 기계어 생성하기
_#86 GCC/Clang의 내장 함수 이용하기

 

09장 그 밖의 Hack
_#87 용어집
_#88 Binary Hacks에 필요한 도구
_#89 문헌 안내

어느 시대이든 바이너리안의 정신은 불멸하리라!
새롭게 펼쳐지는 Binary Hacks의 세계로 여러분을 초대합니다

 

AI, 클라우드, 보안, 로보틱스 등 다양한 영역의 기술이 융합하며 그 어느 때보다 복잡한 시스템을 이루어내는 시대입니다. 생성형 AI가 프로그래밍과 디버깅 방식을 크게 바꾸고 자동화를 이끌고 있지만, 하드웨어와 소프트웨어의 근본 원리를 이해하려는 노력은 여전히, 그리고 오히려 더욱 중요해지고 있습니다. AI가 제공하는 결과를 올바르게 해석하고 예기치 못한 상황에 대응하기 위해서는 저수준 기술에 대한 탄탄한 기반이 반드시 필요하기 때문입니다. 따라서 컴퓨터 시스템의 뿌리라 할 수 있는 2진수와 저수준 프로그래밍의 세계는 오늘날에도 변함없는 가치를 지니고 있습니다.

 

지난 2007년 출간된 『Binary Hacks: 해커가 전수하는 테크닉 100선』은 저수준 프로그래밍과 바이너리 해킹 분야에서 반향을 일으켰으며, 이 분야를 배우고자 하는 많은 분에게 귀중한 안내서로 자리잡았던 바 있습니다. 리버스 엔지니어링, ELF 바이너리 분석, 링커와 로더의 동작 원리, 메모리 관리, 디버깅 전략, 보안 취약점 분석 등 다양한 주제를 다루며 입문서로서도 손색이 없는 책이었습니다. 다만 현재는 절판되어 구하기 어려운 상황이기에, 그동안 직접 접할 기회가 없었던 분들에게는 아쉬움이 남을 수 있는 책이기도 합니다.

 

이번에 새롭게 선보이는 『0과 1 사이(원제: Binary Hacks Rebooted)』는 그러한 공백을 메움과 동시에, 변화된 시대와 환경에 걸맞은 지식과 기술을 담아 저수준 프로그래밍의 지평을 한층 더 넓혀주는 책입니다. 기존 도서와의 내용 중복을 최소화하면서도 가상화와 컨테이너의 저수준 메커니즘 분석, ASLR·PIE·Stack Canary 등 강화된 보안 기법과 더불어 취약점 분석, 디버깅 및 트레이싱 기법, 멀티 아키텍처와 다양한 운영체제 환경을 아우르는 실전적인 내용을 다루고 있습니다.

 

이 책 한 권만으로도 저수준 프로그래밍과 바이너리 세계를 깊이 있게 탐구하기에는 충분합니다. 나아가 저수준 기술의 근본을 이해하고 오늘날의 복잡한 시스템을 더욱 선명하게 들여다보고자 하는 시스템·소프트웨어·보안 엔지니어 및 연구자 여러분께 든든한 길잡이가 되어 드릴 것입니다. 끊임없이 변화하는 기술 환경 속에서도 흔들리지 않는 지식의 토대로서 여러분 곁에서 오랫동안 함께할 수 있는 한 권이라 생각합니다. 다시 한 번 새롭게 펼쳐지는 Binary Hacks의 세계로 여러분을 정중히 초대합니다.

-    ‘옮긴이의 글’ 중에서
 

"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬받아 작성된 서평입니다."

코딩도 AI로 하는 세상에서 (솔직히 이렇게 정말 빠르게 코딩 문화가 빠르게 바뀔 것 이라고는 예상 못했다. 대략 1년 정도 걸릴 줄 알았는데 대략 1개월 만에 바뀐 기분?) 컴퓨터의 깊숙한, 알고 싶지 않은 바이너리 코드들을 공부한다는 것이 무슨 의미가 있을지 언뜻 이해가 안될 수 있지만, 이 책은 "진짜" 들을 위한 책이라고 할 수 있다. 
시스템 엔지니어에게 있어서, 책이나 메뉴얼에서 잠시 스쳐지나갔을 단편적인 지식들이 실제 어떻게 동작하는지 상세히 알려주는 책이다. 또한  리눅스 바이너리, ELF 구조, 운영체제 내부 동작, 컨테이너, 디버깅, 보안, 퍼징, SIMD, 언어 처리계 등 저수준 시스템 전반을 폭넓게 다루는 실전 해킹·리버싱·시스템 프로그래밍 입문/심화서에 가깝다. 단순한 해킹 기법이나 리버스 엔지니어링 교재와 달리, 소프트웨어가 실행되는 환경 전체를 해부한다는 점이 특징적이다.
딱 한가지 아쉬운 점은 어렵다는 점이다. C, 어셈블리, 컴파일러 동작, 운영체제 구조 이해가 없는 초보자에게는 상당히 어렵다. 시스템 프로그래밍 경험이 어느 정도 필요한 책이다. 그래서 '진짜' 들을 위한 책이다.
언젠가 한번 각 잡고(?) 찬찬히 들춰보고 싶은 책이기도 하고, 이 책을 끝까지 공부하면 그에 대한 성취감도 뿌듯하리라 생각 한다. 

 

진정한 개발자로 거듭나기 위해서는 바이너리 단위의 코드가 CPU에 의해 어떻게 해석되고 어떻게 동작되는지 반드시 알아야 한다.

 

필자가 프로그래머로 막 입문했을 당시 읽었던 책의 첫 번째 구절의 내용이다. (당시 아마도어셈 코드 관련 책이었던 것으로 기억한다.)

 

20~25 년 전에 필자가 읽었던 내용이니 지금 개발에 입문하시는 분들에게는 사뭇 낯선 글일 수 있다또한 저 정도 수준까지 알지 못하더라도 수많은 고도화된 IDE가 웬만한디버깅을 편하게 할 도구들을 지원하기 때문에 구태여 배울 필요가 없다고 생각하는 사람도 있을 것이다무엇보다 대 AI 시대에 LLM이 알아서 이러한 에러들을 잡아주니 바이너리 단위의 해석은 더 이상 프로그래머의 역할이 아니다!라고 생각하는 분들도 계실 수 있다.

 

하지만 필자가 생각하기로 서론에서 밝힌 저 멘트는 지금도 지극히 유효하다고 생각한다.

 

많은 것들이 편해지고 많은 것들이 자동화되는 세상이라 할지라도 그 원리와 원칙은 알아야 한다.

 

우리가 법을 배우는 이유도 어찌 보면 법을 몰라서 손해 보는 것을 사전에 방지하기 위함도 있지만법을 알게 되면 훨씬 더 넓은 범위에 걸쳐 내가 하는 행동언행 하나가 사회적으로 어떤 영향을 갖게 되는지이로 인해 민/형사상 어떠한 책임이 따르는지를 알게 되므로 처신에 있어 좀 더 현명해질 수 있기 때문에 배우는 부분도 있기 때문이다.

 

코드의 바이너리와 그 원리를 자세히 아는 것도 어찌 보면 단순히 디버깅을 떠나 (손해 보는 것), 자신이 작성하는 코드의 정확한 현실을 이해하고 이를 고도화하여 양질의 아름다운 코드를 만들기 위함에 있다고 볼 수 있다. (스스로 현명해지는 것

 

【책 내용 요약】

이 책은 앞서 설명한 바이너리 관점에서 프로그램을 어떻게 해석하고 어떻게 수정하거나 작성하면 좋을지에 대한 다양한 팁과 방법론을 정리하고 있다.

 

대표적으로 ELF 파일의 세그먼트, ELF 해시 테이블 구조 등 이론적 구조뿐만 아니라 본인이 작성한 프로그램에 맞는 파일 시스템을 선택하는 방법커널 내에 task log를 어떻게 trace 하는지나아가 리눅스 시스템 내에서 컨테이너를 사용하는 방법과 같이기존의 단순한 개발론 책들에서 다루지 않은 내용들을 심도 있게 다루고 있다.

 

따라서 이 책을 심도 있게 학습하는 것만으로도 바이너리 코드의 동작 방식과 코드가 어떻게 해석되고 어떻게 동작되는지그리고 리눅스 커널에 관한 정보를 해석하고 트레이스 하는 방법 등의 알찬 내용들을 체득할 수 있을 것이다.

 

Binary Hacks Rebooted를 읽고 나서 】

시대가 변했다는 것은 문화언어, 기술가치 기준 자체가 변화했음을 의미한다. 100년 전 엽전이 현생에서는 가치가 거의 없듯이 (골동품으로는 가치가 있을 수도?) 20년 전에 우리가 배우고 익혔던 기술들도 지금에는 거의 가치가 없거나 아니면 당연히 알아야 하는 일부의 지식으로 편입되었을지 모른다.

 

하지만 시대가 변하였음에도 반드시 알아야 하는 영역이 있다그것은 바로 원리가 되는 기술에 대한 기반 지식헌법 등이 그렇다.

 

필자가 생각하는 바이너리의 해석은 바로 이런 기반 지식에 해당하는 영역이다그렇기에 앞으로 전산학이 존재하는 이상 이 분야는 절대로 사라지지도 변하지도 않을 것이라 생각한다.

 

그렇기에 지금 시대가 모든 것이 자동화되어가고 LLM에 의존하여 일과 학습을 병행하는 시대라 할지라도순수 자신의 노력으로 이러한 기반 지식을 익히는 데에 노력한다면 산업 전반에 걸쳐 반드시 필요한 인재로 거듭나는 데에 큰 어려움이 없을 것이라 생각된다.


#본 도서는 "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다."

 

 


0과 1 사이에는 무한이 숨어 있습니다. 현대의 모든 컴퓨터는 이 0과 1의 집합으로 세상을 다룹니다. 컴퓨터가 이해하는 데이터는 바이트열, 즉 ‘바이너리’ 형태로 표현됩니다. 

만약 사람이 이 바이너리를 직접 읽고 의미를 파악할 수 있다면, 자신이 만든 소프트웨어 속 난해한 버그를 해결하는 데 큰 도움이 될 것입니다. 

이런 능력을 키워주는 책이 나왔습니다. 바로 ‘0과 1 사이’입니다. 

이 책은 2007년에 출간된 Binary Hack 해커가 전수하는 테크닉 100선의 후속작으로, 바이너리 세계를 깊이 있게 탐구하고자 하는 이들을 위한 안내서이기도 합니다. 이 책에 대해서 자세히 알아보도록 하겠습니다.



1) OS Hack
하드웨어를 추상화해 안정적인 인터페이스를 제공하는 운영체제(OS) 덕분에 개발자는 하드웨어 세부 사항을 신경 쓰지 않고 응용 프로그램 개발에 집중할 수 있습니다.  하지만 제한된 환경에서 성능 최적화를 추구할 때는 OS가 제공하는 다양한 기능과 내부 동작을 폭넓게 이해하는 것이 필수적입니다. OS 해킹과 커널 탐구를 통해 블랙박스처럼 느껴지던 OS 원리가 친숙하게 다가옵니다. 

 0과 1 사이 책은 리눅스를 주요 대상으로 OS Hack을 실습 중심으로 소개합니다. 이 책을 통해 리눅스 커널의 동작과 시스템 콜, 프로세스 관리 등을 직접 실험하며 깊이 파악할 수 있습니다.  특히 초보자도 따라 할 수 있도록 단계별 예제가 풍부해, OS 이론을 실전으로 연결짓는 데 적합합니다.
 


2) 컨테이너 Hack
현대 소프트웨어 개발에서 빠질 수 없는 기술은 바로 컨테이너입니다. 컨테이너는 서버상의 애플리케이션 실행 환경을 관리하거나 개발 환경을 공유할 때 주로 사용되며, Docker나 Kubernetes 같은 도구로 구현됩니다. 바다의 선착장에서 물건을 싣는 표준화된 컨테이너처럼, 애플리케이션을 일관되게 포장·배포·실행할 수 있습니다.  

이는 리눅스 커널의 네임스페이스(Namespaces)와 컨트롤 그룹(cgroups) 조합으로 프로세스를 격리하고 자원을 제한하는 환경입니다. 

네임스페이스는 PID, 네트워크, 마운트 등을 분리해 각 컨테이너가 독립적인 시스템처럼 동작합니다. cgroups는 CPU·메모리·I/O를 그룹 단위로 제어합니다.  리눅스 환경에서 chroot(루트 변경), Capabilities(권한 세분화), 유니온 파일 시스템(이미지 레이어 공유) 등이 추가로 결합되어 가벼운 OS 수준 가상화를 실현합니다. 이로 인해 VM보다 효율적이고 빠른 배포가 가능해집니다.
 

“한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.”

 

 

 

Binary Hacks Rebooted

 

 

 

 

간략 소개

 

- 책 제목: 0과 1 사이
- 분야: 리눅스, 저수준, 보안
- 난이도: 上
- 분량: 712p (총 9챕터)
- 참고사항: "BINARY HACKS: 해커가 전수하는 테크닉 100선" 개정판

 

 

 

처음에 Hacks를 보고 "오호, 해킹을 위한 책이군.. 나도 보안 동아리 출신인데 엣헴"하면서 골랐는데,

 

Hacks가 해커의 hack은 아니고, 그냥 Life Hack(생활의 꿀팁) 같은 의미로 쓰였다.

 

물론 해킹/보안 영역에 적합한 것도 맞는데, 저수준에서의 프로그래밍 노하우라 보면 된다.

 

 

 

 

 

내가 본 책 중에 가장 저수준이었고, 가장 어려웠다 (다 읽어보지도 못 함)

 

일단 리눅스를 사용하지 않거나 모른다면 이해하기 쉽지 않을 것이다.

 

애초에 제목부터 Binary인 만큼 매우 저수준이고, 모든 코드도 C언어 기반인 점 참고하자.

 

 

 

한 마디로 요약하면, 옛날 스타일의 진짜 개발자(혹은 해커)를 위한 책이다.

 

 

 

 

뭘 알아야 이해가 가능한 책

 

 

 

 

 

 

 

 

상세 소개

 

 

대부분 리눅스 관련이다

 

 

 

 

앞서 말했듯 리눅스에 대해 잘 모르면 읽기 어려울 정도로 진득한 리눅스 내용이다.

 

그래도 리눅스를 잘 모른다고 모든 내용을 이해할 수 없는 정도까지는 아니다.

 

 

 

 

 

 

찍먹도 가능

 

 

 

 

그리고 재미있어 보이는 파트나 이해 가능한 부분만 찍어 먹어도 된다고 한다.

 

나도 이 방식으로 흥미있는 부분만 발췌독한 상태다.

 

 

 

 

 

아무래도 바이너리하면 많은 사람들이 거부감을 가지기 쉽기 때문에,

 

앞 부분엔 매직넘버로 파일 확장자 맞히기라든가 Hello World! 어셈블리어 분석으로 가볍게 시작한다.

 

 

 

#1: 매직 넘버 이야기로 산뜻하게 시작 ???

 

 

 

 파일 업로드 공격 예방에도 중요한 내용

 

 

 

 

한번쯤 들어봤을 파일 매직 넘버 관련 내용으로 시작하는데,

 

HEX로 파일을 살펴보면 시작이나 끝 부분에 파일 형식을 나타내는 매직 넘버나 시그니처가 있다.

 

이걸로 파일 형식을 식별해서 복구 작업이나 악성 파일 업로드 방지에 활용할 수 있다.

 

 

 

바이너리의 세계로 입장하기 전에 가볍게 몸을 풀어주는 느낌이다.

 

 

 

 

 

#70-75: 부동소수점만 집중적으로 패기

 

 

 

 약 50p에 걸쳐 부동소수점을 파헤친다

 

 

 

 

7챕터는 수치표현과 데이터 처리를 다루는데, 부동소수점을 집중적으로 파헤치는 게 인상적이었다.

 

그도 그럴게 부동소수점 처리에서 실수하기도 쉽고, 계산에서 많은 예외가 발생할 수 있기 때문일 것이다.

 

 

 

수학과 출신의 저자인 아라타 미즈키 (荒田實樹) 상이 이 파트를 맡은 듯 하다.

 

저자 소개 中
... 수치 계산에도 손을 대보려다 길을 잘못 들어 부동소수점의 늪에 빠지고 말았습니다.  

 

 

 

 

 

IEEE 754 부동소수점 수 기본 개념부터 시작해서 예외 처리, 반올림 방식 변경까지 살펴보다가

 

지금까지의 부동소수점 환경 조작이 최종적으로 컴파일러 최적화때문에 무시되지 않게 하는 법까지 알려준다.

 

 

 

 

 

#55: ASLR 동작/구현?️ 근데 이제 이걸 회피해서 공격하는.. ⚔️

 

 

 

 #56에서는 메모리 취약점 활용 공격 기법을 다룬다

 

 

 

 

배열과 인덱스를 다루면서, 오버 플로나 언더 플로같은 메모리 취약점에 대해 들어봤을 것이다.

 

UAF든 더블 free든 의도된 메모리 영역이 아니라 다른 메모리 영역에 접근하게 되는 취약점이 되는데,

 

이게 전통적인 프로세스 제어권 탈취의 시작점이 되겠다.

 

 

 

 

 

버퍼 오버플로 계열 공격을 막으려고 스택 카나리NX같은 방어 기법들이 도입됐는데,

 

이런 방어를 우회해 코드 주입 없이도 공격하는 ROP가 등장했고,

 

그런 ROP 조차 어렵게 만들기 위해 정확한 메모리 주소 자체를 흐트러뜨리는 ASLR이 나오게 된 것이다.

 

 

 

 

 

뭐, 그렇다고 ASLR이 무적인 건 아니다.

 

#55에서는 이 ASLR의 동작과 구현을 설명하면서도 ASLR을 회피해 공격하는 방법도 알려준다.

 

아마 밥먹듯이 CTF를 풀고, DEFCON 결승에 최연소로 참가했다는 고이케 유키 (小池悠生) 상이 맡은 듯하다.

 

 

 

아무튼 ASLR과 ROP에 관심있다면 이 책의 #55와 #56를 참고하자.

 

 

 

 

 

#48: 리눅스 퍼포먼스 분석 ?

 

 

 

 

 

 

 

 

리눅스 성능 분석의 모든 걸 알려주마!!! ← 이런 느낌은 아니고, 이런 게 있습니다~ 정도다.

 

제목 그대로 리눅스 퍼포먼스 분석 '입문'이다.

 

 

 

그래서 간략한 개념과 핵심만 있어서 분량도 적어 가볍게 읽을 수 있어서 좋다.

 

이벤트 카운트, 프로파일링, 트레이싱의 차이를 알 수 있고, perf로 직접 실습해볼 수도 있다.

 

 

 

 

 

 

https://github.com/brendangregg/FlameGraph

 

 

 

 

perf record로 샘플링하고 이걸 플레임 그래프로 프로파일링하는 방법도 마지막에 간략히 알려준다.

 

이 그래프로 호출한 함수와 스택 트레이스의 깊이, 샘플 수, 소요 시간 등을 시각화해서 볼 수 있다.

 

 

 

 

 

#40: user 권한으로 root처럼 행동하기 ?

 

 

아주 자극적인 제목으로 이목을 끄는 걸 볼 수 있다

 

 

 

 

사실 목차를 살펴보다가 제일 먼저 눈에 들어온 제목이었는데..

 

권한에 제한을 둬서 취약점이 발견되더라도 피해를 줄이는 방법에 대해 설명한다.

 

 

 

 

 

더 자세한 이야기가 궁금하다면, 교보문고에 가서 읽어보거나 구매해서 읽어보자.

 

그 밖에도 총 89가지 이야기들로 구성되어 있으니, 이런 저수준 주제들에 대해 관심있다면 추천한다.

 

 

 

 

 

 

 

한 줄 평 ✏️

 

진짜 개발자라면 이 책을 이해할 수 있어야 하겠지..

출처: https://zzaekkii.tistory.com/48 [int main(){:티스토리]

1. 저수준 프로그래밍단순히 기능만 구현하는 개발자가 아니라,
'왜 그렇게 작동하는지' 아는 개발자가 되고 싶다면 저수준 프로그래밍 지식이 진짜 필수템이거든요!

'진짜 실력'으로 인정받는 방법?

특히 요즘 면접에서 OS 동작 원리, 메모리 관리 같은 질문 쏟아지는 거 아시죠?

이 책은 그런 질문에 막힘없이 대답할 수 있는 탄탄한 기반을 만들어 줘요.

짧고 간결한 문단으로 설명해 줘서 모바일로 읽기도 좋고, 중요한 내용은 리스트로 깔끔하게 정리되어 있어서 정보 습득 속도가 LTE급이랍니다!

2. 시스템 보안 Hack
저수준 프로그래밍의 꽃은 역시 보안 아니겠어요?
?
『0과 1 사이』의 6장 '보안 Hack' 파트는 정말 꿀잼이었어요!

ASLR, PIE, Stack Canary 같은 요즘 보안 기술들! 이름만 들어봤지, 이 기술들이 바이너리 레벨에서 어떻게 작동하고,

또 어떻게 공격자와 방어자가 치열하게 맞서는지! 헐, 읽으면서 진짜 몰입했어요.

본문에 '시스템 보안 Hack' 관련 내용이 정말 알차게 담겨 있어서,
?
마치 친구에게 "야, 너 이거 알아야 돼!" 하고 조언해 주는 것처럼 친근하게 설명하고 있어요.

이 섹션 내에서 시스템 보안 Hack을 이해하고 나면, AI가 프로그래밍을 해주는 시대에도 예기치 못한 상황에 대응할 수 있는

흔들리지 않는 지식의 토대를 갖게 된답니다!

3. 왜 '0과 1 사이'를 파고들어야 하는지
그래서 저수준 프로그래밍이 대체 왜 중요하냐고요?

이 책의 원제처럼 Binary Hacks의 세계를 탐험하는 건 개발자에게 필수 코스예요.

단순히 문법을 아는 걸 넘어서, 코드가 0과 1 사이에서 어떤 마법을 부리는지 아는 건 개발자의 품격을 결정하죠.

문제 해결력 극대화: 추상화가 은폐한 버그를 직접 찾아 해결!

1️⃣ 최신 기술 이해: 컨테이너, 가상화 등 복잡한 기술의 근본 원리 파악!
2️⃣ 커리어 확장: 임베디드, 시스템, 보안 등 전문 분야로의 진출 가능성 UP!

『0과 1 사이』는 리눅스의 ELF Hack, 컨테이너의 저수준 메커니즘, 심지어 디버거와 트레이서의 구현까지 다뤄요.

이렇게 폭넓은 Binary Hacks 지식은 여러분이 마주하는 복잡한 시스템 문제를 근본적으로 해결할 수 있는 힘을 줘요. 저도 이 책을 읽으면서 Binary Hacks 관련하여 난이도 높은 문제에 도전할 용기를 얻었답니다!

?
 

『0과 1 사이』는 절판되었던 명저 『Binary Hacks』의 리부트 버전이라니 놓치면 진짜 후회할 거예요.
지금 바로 서점에서 이 짜릿한 Binary Hacks의 세계로 다이빙하세요! ?

끝.

출판사를 통해 도서를 제공받아 직접 읽고 작성한 후기입니다.

이번 책 리뷰는 #한빛미디어 서평단 <나는리뷰어다활동을 위해서 책을 협찬 받아 작성된 서평입니다.

 

이번 책, <0과 사이>의 부제는 '고수준 코드 아래 숨은 실행구조보안메모리의 비밀'로 일본인 저자께서 지은 신 책으로 원제는 Binary Hacks Rebooted 였다.

 

 

위 사진이 그 책으로, IT 전문 출판사 '한빛미디어'를 통해 지난 달인 10월에 출시된 최신 책이다.

 

원제와 함께 좌상단에 O'Reilly 로고가 보인다이것은 컴퓨터 프로그래밍 관련 전문 출판 브랜드다.

 

약 보름간 이 책을 읽은 소감을 이 책의 저자님 들을 소개하면서 시작하겠습니다.

 

1. 저자 님들 옮긴이

 

 

'가와타 아키라부터 '아라타 미즈키'까지 총 다섯 분의 일본인 저자님들로 구성되어 있었고 모두 일본 내 에서 대단한 지식과 기술을 가진 분들로 보인다.

 

옮긴이 '진명조선생님은 NHN 클라우드 시스템 엔지니어셨고 <대규모 서비스를 지탱하는 기술>을 비롯하여 여러 IT 책들을 번역해 오신 분이었다.

 

2. 시작하며 옮긴이의 글

 

이어서 여러 분의 베타 리더님들의 글이 이어졌고아래 사진과 같이 '시작하며'가 나왔다.

 

 

"이 책은 저수준 프로그래밍에 관한 핵(hack) 모음집입니다. '저수준'이란 추상화 정도가 낮은 계산기와 가까운 레이어를 가리키며 ''이란 교묘한 방법으로 문제를 해결하는 수법을 말합니다 ... (중략) ..."

 

이렇게 시작하는 머리말의 첫 문장이 강한 느낌을 나에게 주었다.

 

여기서 '저수준'이란 질적으로 낮다는 뜻이 아님을 이웃님들도 아시리라쉽게 말해서 여러 기능을 하는 한 덩어리의 부품이 아닌작은 나사부터 그 부품을 구성하는 여러 파트를 낱낱이 분해해서 보는 것과 비슷하다 할 것이다.

 

"무엇보다도 추상화 레이어 그 자체나 하부를 엿보는 것은 매우 재밌는 작업입니다 ... (중략) ..."

 

어떤 느낌인지 아시겠쥬?

 

이어서 '추천의 글'과 아래 사진처럼 '옮긴이의 글'이 나왔다.

 

 

"생성형 AI가 프로그래밍과 디버깅 방식을 크게 바꾸고 자동화를 이끌고 있지만하드웨어와 소프트웨어의 근본 원리를 이해하려는 노력은 여전히그리고 오히려 더욱 중요해지고 있습니다 ... (중략) ..."

 

옮긴이의 글에 있었던 위 글에서 이웃님들도 무엇을 말하려 하시는지 감이 오셨으리라.

 

적절한 비유일지는 자신이 부족하지만애플 펜슬로 아름다운 그림을 그리려면 회화에 대한 기본 지식과 기술이 어느 정도 뒷 받침 되어야 하지 않겠는가?

 

역자께서는 이 책 한권 만으로도 저수준 프로그래밍이나 바이너리의 세계를 깊이 있게 탐구하기에 충분하다고 하셨다.

 

3. 목차

 

위 사진은 '목차중 일부의 모습으로 chapter 1 '인트로덕션'으로 시작하여, chapter 09 '그 밖의 Hack'까지 총 9장으로 이루어져 있었고핵 단위로 보면 89개였다.

 

이제 드디어 본문을 보겠습니다!

 

4. 본문 중에서

 

총 710쪽이 넘는 이 책을 다 보여드릴 수는 없지만최대한 많이 보여드리겠습니다.

 

이하 본문의 리뷰 글은 양이 많아서제 블로그에 써 놓은 곳으로 링크해 드리겠습니다아래 링크를 눌러서 읽어주십시오.

 

https://blog.naver.com/zapaks/224092089084

 

위 링크를 눌러서 읽으셨으리라 감안하고일독을 마친 소감을 간단히 쓰고 마치겠습니다.

 

5. 일독을 마치며

 

약 20여일에 걸쳐 이 책의 일독을 '일단마쳤습니다총 710여쪽에 이르는 바이너리의 대하소설이었다고나 할까요?

 

제가 '일단'이라고 말한 것은 아직 이 책의 깊은 데까지는 도달하지 못했다는 것입니다좀 쉬었다가 한번 더 꼼꼼히 읽으면 그 '깊은 곳'에 좀 더 다가갈 것입니다.

 

저는 직업적인 프로그래머는 아니지만이런 류의 책을 굉장히 좋아합니다저의 하드 SF소설을 위해서도 필요한 작업이죠.

 

컴퓨터의 작동 원리의 출발점을 들여다보는 여정은 의외로 아주 재밌습니다이웃님들도 이 여정에 한 발 담궈보시는 것은 어떠실까요? <>

"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다."

Binary Hacks Rebooted 0과 1사이

 

"고수준 코드 아래 숨은 실행, 구조, 보안, 메모리의 비밀" 이런 문구를 보면 두근댄다.

거기다 저자가 일본인이다.

이런 조합의 책은 거의 실패한 적이 없다.

또한 Reboot 라는 단어가 적혀있는 것은 이전 판의 인기가 많았다는 뜻이니 읽어보기로 했다.

 

먼저 읽은 사람으로써 정말 쉽지 않다.

중급이상의 개발자 정도는 되야 읽을 수 있을 것 같다. 

write 시스템콜

  • RAX (Accumulator Register, 누산기)
    • 함수의 반환 값을 저장하거나, 산술 연산의 결과를 저장하는 데 사용됩니다.
  • RCX (Counter Register, 카운터)
    • 반복문에서 반복 횟수(루프 카운터)를 세거나 연산 횟수를 저장합니다.
  • RDX (Data Register, 데이터)
    • RAX와 함께 큰 수의 연산에 사용되며, 함수 호출 시 세 번째 인자로 사용됩니다 (Linux 기준).
  • RBX (Base Register, 베이스)
    • 특정한 메모리 주소나 오프셋을 저장합니다 (과거에는 메모리 주소 지정의 기본 베이스로 주로 사용됨).
  • RSI (Source Index, 소스 인덱스)
    • 메모리 연산 시 데이터의 원본(출발지) 주소를 저장하며, 함수 호출 시 두 번째 인자로 사용됩니다 (Linux 기준).
  • RDI (Destination Index, 목적지 인덱스)
    • 메모리 연산 시 데이터의 목적지 주소를 저장하며, 함수 호출 시 첫 번째 인자로 사용됩니다 (Linux 기준).
  • R8 ~ R15 (추가 범용 레지스터)
    • 함수의 추가적인 인자를 전달하거나 데이터를 임시 저장하는 등 다양한 용도로 사용됩니다.

 

나는 사실 이 책이 ELF 에 대해서 적여있어서 골랐다.

ELF 라는 확장자를 회사에서 본적은 있는데, 어떤 건지는 정확히 몰랐기 때문이다.

ELF(Executable and Linkable Format)는 리눅스 실행파일의 확장자이다.

아마, 라이브러리인 so 확장 이외에는 많이 듣기 힘들었을 것이다.

 

ELF 에는 ELF 헤더, 프로그램 헤더, 세그먼트 로 나눌 수 있다.

- ELF 헤더: 파일이 64비트용이고, 리눅스용이고, 실행파일이다. 같은 정보를 담고 있다.

- 프로그램 헤더: 운영체제에게 메모리의 어디에 로딩해야하는지 알려준다.

- 세그먼트: 실제 실행에 중요한 정보의 관리 단위

프로그램 헤더

프로그램 헤더정보는 readelf 를 통해서 확인할 수 있다.

readelf 프로그램 헤더

 

프로그램이 커질 수로 한번에 실행하기 어려워지므로, 동적 링커를 활용한다.

이 과정에서 개입하여 조작할 수 있다.

LD_PRELOAD

시스템 표준 함수보다 내가 만든 함수를 먼저 로딩하여 기능을 바꾼다.

이때 라이브러리를 찾는 순서도 중요한데, 보통 DT_RPATH -> LD_LIBRARY_PATH -> DT_RUNPATH 순으로 탐색한다고 한다.

 

DT_RUNPATH

 

이런 동적 링킹의 원리를 통해 함수를 Hooking 할 수도 있다.

 

읽다보면 해시 테이블을 왜쓰는지에 대한 이유도 나온다.

 

TSL 는 보안에만 나오는지 알았더만, Thread Local Storage 의 약자로 스레드마다 독립적인 변수 공간을 갖게 해주는 기술이다.

TLS에 접근하는 방식(액세스 모델)은 크게 4가지가 있다.

  1. Global Dynamic (GD): 가장 느리지만 가장 유연함 (모든 경우 커버)
  2. Local Dynamic (LD): 같은 모듈 내의 변수 접근 최적화
  3. Initial Executable (IE): 프로그램 시작 시 결정되는 변수용
  4. Local Executable (LE): 메인 실행 파일 내부 변수용 (가장 빠름)

컴파일러가 상황에 따라 최적의 모델을 선택해준다.

 

그리고 CoreDump 라는 말을 많이 들어봤을거다.

gdb 가 아니더라도 파일 구조를 알면 직접 분석할 수도 있다.

"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다."

 

고수준 코드 위에서 일할 때는 모든 기능이 안정적으로 굴러가는 것처럼 보인다. 하지만 그 아래에는 로더, 링커, 커널,메모리 모델, CPU 구조 같은 층위가 촘촘하게 맞물려 있다. 이 책은 그 층위를 하나씩 걷어내며 시스템이 실제로 어떻게 움직이는지 보여 준다. 초반부의 어셈블리와 ELF 구조 설명은 단순한 입문을 넘어서, 이후에 등장하는 IFUNC 전환, TLS 구조, 보조 벡터, 라이브러리 로딩 기법을 자연스럽게 이해하도록 기반을 다져 준다. 팁만 늘어놓는 방식이 아니라, 실행 흐름을 따라가며 저수준으로 내려가는 과정이 거슬리지 않게 구성돼 있다.

 


OS와 컨테이너 파트는 특히 흥미롭다. 평소 익숙하게 사용하는 기능이 네임스페이스, cgroup, seccomp, eBPF 같은 요소가 결합되어 작동한다는 사실을 다시 확인하게 된다. 기능을 호출하는 입장에서 벗어나, 그 내부 구조를 바라보는 관점이 생긴다.보안 파트는 깊이가 있다. ASLR, CET, CFI, ROP 같은 기법이 어떤 흐름 속에서 등장했는지 정리돼 있어, 조각으로만 알고 있던 지식이 하나로 이어진다. 멜트다운, 스펙터, Row Hammer 같은 하드웨어 취약성은 현대 시스템이 가진 구조적 제약을 그대로 보여주는 사례다.

 

후반부에서는 수치 표현, SIMD, 언어 처리계 등 값을 다루는 구조에 집중한다. 이 영역은 주변부처럼 보이지만 실제로는 성능,안정성, 정확성, 보안과 바로 연결된다. 부동소수점 반올림 방식이나 컴파일러 최적화와 충돌하는 사례는 코드 한 줄이 실행 환경에서  어떻게 동작하는지 이해하는 데 좋은 지점이다. LD_PRELOAD 기반 메모리 할당자 교체, ABI와 호출 규약, ucontext 기반 코루틴  구현 같은 실험도 따라가다 보면 내부 동작이 선명하게 잡힌다. 이 책의 장점은 깊이를 억지로 드러내지 않는 구성이다. 난해한 개념을 무겁게 밀어붙이기보다, 구조와 흐름을 이해하는 데 필요한 만큼만 정확하게 꺼낸다. 저수준 내용을 다루지만 부담스럽지 않고, 고수준 개발자가 시스템 쪽으로 자연스럽게 이동할 수 있는 통로 같은 느낌이다. 결론적으로, 이 책은 저수준을 탐색하는 감각을 일깨워 준다. 현대 시스템의 기반이 어떻게 연결되고 움직이는지 알고 싶은 독자에게, 89개의 Hack은 각각 짧은 실험이자 작은 탐험처럼 읽힌다. 표면의 기능만 보던 관점에서 벗어나 그 아래 구조를 실제 흐름처럼 느끼고 싶은 사람에게 충분히 매력적인 책이다.
 

“한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.”

 

 


바이너리(Binary). 0과 1로 이루어진 이진수를 의미하는 이 단어는 디지털 세상을 구성하는 가장 근원적인 원자와도 같다. 리눅스 환경에서 C언어를 활용한 시스템 개발을 오랫동안 해왔고, 학부 시절 어셈블리어와 포트란, C언어를 배우며 컴퓨터와 대화했던 기억이 있는 나에게도 '바이너리'라는 단어는 여전히 묘한 긴장감을 준다. 우리가 매일 실행하는 수많은 파일들이 결국 이 0과 1의 조합이라는 사실은 당연하면서도 때로는 경이롭게 다가온다.

이번에 읽게 된 “Binary Hacks Rebooted”는 바로 그 0과 1 사이, 우리가 흔히 '실행 파일'이라 부르는 블랙박스 안을 집요하게 파헤치는 책이다. 책을 덮으며 든 생각은 한 마디로 요약할 수 있다.

“어렵다. 하지만 지독하게 흥미롭다.”

바야흐로 파이썬(Python)이나 자바스크립트(JavaScript) 같은 인터프리터 기반의 스크립트 언어가 대세인 시대다. 인간의 언어에 가까운 추상화된 도구들은 개발 생산성을 비약적으로 높여주었다. 하지만 기계에게 친숙한 로우 레벨(Low Level)의 언어는 여전히 그 자리를 굳건히 지키고 있다. 그들이 보장하는 압도적인 '성능'과 하드웨어를 직접 제어하는 '자유도'는 그 어떤 고수준 언어로도 대체할 수 없기 때문이다.

물론 그 대가는 '어려움'이다. 이 책은 그 어려움을 피하지 않고 정면으로 마주한다. 리눅스 커널, 가상화, 컨테이너, 바이너리 분석, 디버거, 보안 등 시스템의 기저에 깔린 핵심 기술들을 총 89가지의 'Hack(기법)'이라는 이름으로 펼쳐 보인다.

단순히 "코딩을 잘하는 법"을 알려주는 책이 아니다. 오히려 "코드가 기계 안에서 실제로 어떻게 살아 움직이는가?"에 대한 해부학 개론에 가깝다. 시스템 프로그래머의 입장에서 볼 때, 이 책은 실전에서 마주칠 수 있는 가장 난해한 문제들을 해결할 수 있는 열쇠꾸러미와도 같다.

특히 인상 깊었던 점은 현대 IT 인프라의 핵심인 '컨테이너'와 '최적화' 기술의 근본을 다루는 방식이다.

클라우드와 HPC 환경을 다루는 엔지니어로서, 도커(Docker)나 쿠버네티스(Kubernetes) 같은 도구는 이제 공기처럼 익숙하다. 하지만 이 책은 툴의 사용법을 넘어선다.

리눅스 네임스페이스(Linux Namespace)와 cgroup이 어떻게 프로세스를 격리하고 리소스를 제어하는지, 루트 없는(Rootless) 컨테이너가 어떻게 작동하는지 등 컨테이너 기술의 뼈대를 적나라하게 보여준다. 추상화된 명령어로만 접하던 기능들의 내부 메커니즘을 이해하는 순간, 트러블슈팅의 시야가 완전히 달라짐을 느꼈다.

또한 고성능 소프트웨어를 고민하는 개발자에게 필수적인 지식을 제공한다. 프로그램이 메모리에 로드되는 과정, 부동소수점 연산의 미묘한 차이, SIMD 병렬화 코드 작성법 등은 극한의 성능을 쥐어짜야 하는 상황에서 빛을 발하는 지식들이다.

현대의 컴퓨터 시스템은 견고한 다층 구조(Layer)로 이루어져 있다. 우리는 잘 설계된 추상화 덕분에 내부의 복잡함을 몰라도 기능을 구현할 수 있다. 하지만 때로는 그 장막을 걷어내야 할 때가 온다. 남들이 만든 도구로는 해결할 수 없는 문제를 만났을 때, 더 높은 성능이 필요할 때, 혹은 시스템의 보안 취약점을 방어해야 할 때가 그렇다.

실전적인 예시와 함께 이어지는 설명들은 시스템의 심연을 탐험하는 가이드 역할을 톡톡히 해낸다. 비록 내용은 어렵지만, 그 구조적 아름다움과 논리적 완결성을 발견하는 과정은 지적 유희에 가깝다. 마치 미술관에서 작품의 표면만 보다가, 엑스레이 분석을 통해 붓터치 아래 숨겨진 작가의 의도와 밑그림을 발견했을 때의 전율과 비슷하다.

프로그래머가 아니더라도, 혹은 로우 레벨 개발자가 아니더라도 이 책의 가치는 충분하다. IT 기술의 구조적이고 근본적인 부분을 이해하는 것은 결국 어떤 기술이든 빠르게 습득하고 응용할 수 있는 '체력'이 되기 때문이다.

“Binary Hacks Rebooted”는 친절하게 떠먹여 주는 입문서가 아니다. 하지만 0과 1이 빚어내는 거대한 시스템의 세계, 그 숨겨진 이면을 탐구하고 싶은 이들에게는 더할 나위 없는 나침반이 되어줄 것이다. 다양한 기법 위에 펼쳐진, 깊고 매혹적인 시스템의 세계로 여러분을 초대한다. 시스템 엔지니어라면 책장에 꽂아두는 것만으로도 든든한 무기를 얻은 기분이 들 것이다.

"20년 만에 더 강력하게 돌아온 전설의 바이블과 함께, 0과 1 사이의 블랙박스를 열고 시스템을 완전히 장악하는 '대체 불가능한 개발자'로 거듭나세요."

한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.


0과 1 사이 / 가와타 아키라, 고이케 유키, 와타나베 게이치, 사에키 다카야, 아라타 미즈키 외 1명 지음 / 한빛미디어

 

개인 실습

이 책을 직접 실습해보지 않고 평가하는 건 저자들에 대한 예의가 아니라 생각했다.

책 일부를 정독하고, 4장 37절 리눅스 네임스페이스에 대한 내용을 실습해보며 느낀 점들을 서평으로 남겼다.

Binary Hacks Rebooted - 4.37 리눅스 네임스페이스로 프로세스 분리하기

Binary Hacks Rebooted - 4.37 리눅스 네임스페이스로 프로세스 분리하기 - README.md

gist.github.com

마크다운으로 남긴 실습 기록


1️⃣ 저수준 프로그래밍 기술

임베디드 개발자들은 어셈블리 수준에서의 조작을 해봤을 것이고,  C언어를 사용해봤다면 라이브러리를 타고 들어가다 시스템 콜과 연관된 코드를 본 경험이 있을 것이다. 리눅스 자격증을 취득한 사람들이라면 OS, 커널, 파일, 프로세스 등 컴퓨터 구조와 명령어 사이의 관계에 익숙할 것이다. 보안 전공자라면 이진 파일을 다양한 방식으로 해석할 수 있다는 사실과 도구를 활용해서 디버깅/시뮬레이션을 할 수 있다는 것을 알테고, 애플리케이션 개발자들은 컨테이너와 하이퍼바이저를 이용한 오케스트레이션에 친숙할 것이다. 놀랍게도 앞서 말한 내용들 모두 이 책에서 언급되는 내용이다. 즉, 당신이 무엇을 상상하든 이 책은 그 이상을 다루고 있으리라.

실습을 진행한 4장 컨테이너 Hack 내용 일부


2️⃣ 현대 환경에 필요한 Hack

지금껏 역사는 추상화 계층을 쌓아올라가며 멋진 것을 더 쉽게 만들 수 있도록 발전해왔다. Rust와 WASM, 컨테이너화와 Unikernel 등 너무나  멋진 기술들이 문제 해결을 위해 등장했다. 이 책은 그러한 변혁을 고려하여 저수준 프로그래밍 기술을 현대 시스템의 구조적 변화와 필요에 맞춰 폭넓게 다루고 있다. 하드웨어의 연산 효율이나 컴퓨터 구조와 같은 본질은 쉽게 변하지 않지만, 그 본질이 중요해지는 맥락이 바뀌었다는 사실을 책을 읽으며 느낄 수 있었다.

 

이번에 알게된 Unikernel도 정말 참신한 아이디어라 생각한다. 기존에 alpine 버전이나 Dockerfile을 활용하여 간소화한 빌드를 만드는 차원이 아니라, 애플리케이션에 필요한 기능만 탑재하여 커널 수준에 최적화하는 방식이다. 빌드 크기 감소와 성능 개선은 당연하고, 공격 표면을 감소시켜 보안을 향상시킬 수 있다는 점이 핵심이라 생각한다. 이로서 특정한 이미지에 취약점이 발견되더라도, 향후에는 해당 기능이 의존하는 시스템 콜을 포함하는 기능을 이미지에서 제외하고 빌드하는 식으로 실시간 패치가 가능해질지도 모른다.

Unikernel: 등장 배경과 의의


3️⃣ 차근차근 따라할 수 있는 구성

솔직히 평소에 저수준으로 프로그래밍 할 일이 없어서, 이 책에 있는 내용 대부분은 잘 모른다. 하지만 이 책은 앞서 다룬 내용을 바탕으로 뒤의 내용을 설명하기 때문에, 처음부터 순차적으로 읽으면서 차근차근 이해를 쌓아나가기 좋게 구성되었다. 실습에 필요한 소스 코드도 레포에 정리되어있고, 시뮬레이션에 필요한 명령어 실행 방식과 결과도 중요하고 필요한 부분만 간결하게 표현해두어 읽기 편했다.

GitHub - chinium/binary-hacks-rebooted: 『Binary Hacks Rebooted』のサポートリポジトリ

『Binary Hacks Rebooted』のサポートリポジトリ. Contribute to chinium/binary-hacks-rebooted development by creating an account on GitHub.

github.com


이 책의 특징

⚠️ GNU/Linux OS에 집중한다

이 책은 대부분 GNU/linux를 기반으로 서술되어 있다. 그래서 Windows는 WSL 또는 Docker나 Podman 같은 가상화 환경을 준비할 필요가 있다. macOS는 POSIX 호환성을 갖춘 UNIX 기반의 OS이기에 비교적 접점이 많은 편이다. 하지만 x86-64와 AArch64 명령어 집합 아키텍처의 차이 등 자신이 사용하는 mac 기기가 저수준에서 어떤 차이를 갖는지 인지하고 있어야 올바른 결과를 얻을 수 있을 것이다.

?‍♂️ 어렵다

평소에 자주 다루지 않는 저수준의 내용들이라 익숙하지 않음도 있겠지만, 깊이가 있어 대체적으로 좀 어렵다. 개인적으로는 읽으면 '아 그런 말이구나' 이해는 갔는데, 막상 직접 활용하고 응용하라하면 못할 것 같다.


마치며...

이 책의 저자는 모두 일본인이다. 그러고보면 일본에는 장인정신을 가진 사람들이 참 많은 것 같다. 우직하게 한 우물을 파내려가는 그들의 모습은 가치를 창출해내는 근로자의 관점에서는 다소 비효율적으로 보일 수도 있다. 오히려 그렇기에 Hacking이 더 예술적이고 아름답게 느껴지는지도 모른다. 내게도 언젠가 하나에 열중하게 되는 날이 찾아오길 바란다.

"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다."

 

 

책의 부제를 유심히 살펴봤다.

"고수준 코드 아래 숨은 실행, 구조, 보안, 메모리의 비밀"

"이 책은 저수준 프로그래밍의 세계를 탐색하고 이해하는 데 필요한 기법, 즉 핵(Hack)를 89가지 엄선해 제공합니다."

그렇다 이 책은 기본적인 수준에 그치지 않고 더 깊이있는 접근을 한다.

 

거의 모든 프로그래밍 책에서 시작은 “Hello, World!”를 출력하는 것부터 시작한다.

이 책에서는 이런 기본적인 printf 에서 나아가

  1. libc의 시스템 콜 래퍼를 사용
  2. 어셈블리 언어 사용

을 통해서 “Hello, World!’를 출력해본다. 

 

흥미로운 챕터를 살펴보자.

 

Hack #40 일반 유저가 root처럼 행동하는 방법 3가지

  1. setuid 설정하기
  2. 필요한 케이퍼빌리티만 부여하기
  3. 유저 네임스페이스 내에서 root 되기

케이퍼빌리티는 root 권한을 세분화한 것으로 스레드별로 부여되는 속성입니다. 각 스레드는 여러 케이퍼빌리티를 가질 수 있으며 커널은 스레드가 가진 케이퍼빌리티를 부여하여 할 수 있는 작업을 늘리거나 반대로 root 권한을 가진 프로세스에서 케이퍼빌리티를 제거하여 실행 가능한 작업을 제한할 수 있습니다.

 

Hack #55 ASLR: 잘못된 메모리 접근에 대한 보안 메커니즘

- 리눅스 유저 영역 프로세스에 대한 ASLR의 동작

- 리눅스 유저 영역 프로세스에 대한 ASLR의 구현

- ASLR을 회피하는 공격기법

  1. 랜덤화되지 않거나 랜덤화 엔트로피가 낮은 메모리 영역 이용하기
  2. 주소 특정하기
  3. Heap Spraying하기
  4. mmap으로 매핑된 영역이 연속하는 점 이용하기

깊이있는 내용이 많다.

89가지 기법을 하나씩 이해하고 넘어가는 방법보다는, 관심있는 주제에 대해 스터디 모임용으로 가져가면 좋을 것 같다. 

그래도 친절한 LLM들 덕분에 이해하는데 부담이 없어서 다행이다.

리뷰쓰기

닫기
* 상품명 :
0과 1 사이
* 제목 :
* 별점평가
* 내용 :

* 리뷰 작성시 유의사항

글이나 이미지/사진 저작권 등 다른 사람의 권리를 침해하거나 명예를 훼손하는 게시물은 이용약관 및 관련법률에 의해 제재를 받을 수 있습니다.

1. 특히 뉴스/언론사 기사를 전문 또는 부분적으로 '허락없이' 갖고 와서는 안됩니다 (출처를 밝히는 경우에도 안됨).
2. 저작권자의 허락을 받지 않은 콘텐츠의 무단 사용은 저작권자의 권리를 침해하는 행위로, 이에 대한 법적 책임을 지게 될 수 있습니다.

오탈자 등록

닫기
* 도서명 :
0과 1 사이
* 구분 :
* 상품 버전
종이책 PDF ePub
* 페이지 :
* 위치정보 :
* 내용 :

도서 인증

닫기
도서명*
0과 1 사이
구입처*
구입일*
부가기호*
부가기호 안내

* 온라인 또는 오프라인 서점에서 구입한 도서를 인증하면 마일리지 500점을 드립니다.

* 도서인증은 일 3권, 월 10권, 년 50권으로 제한되며 절판도서, eBook 등 일부 도서는 인증이 제한됩니다.

* 구입하지 않고, 허위로 도서 인증을 한 것으로 판단되면 웹사이트 이용이 제한될 수 있습니다.

닫기

해당 상품을 장바구니에 담았습니다.이미 장바구니에 추가된 상품입니다.
장바구니로 이동하시겠습니까?