메뉴 바로가기 검색 및 카테고리 바로가기

한빛미디어

독자리뷰

어렵지만... 읽은 후가 기대된다

ysm***

|

2025-11-30

0과 1 사이

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

  • 저자 : 가와타 아키라 , 고이케 유키 , 와타나베 게이치 , 사에키 다카야 , 아라타 미즈키
  • 번역 : 진명조
  • 출간 : 2025-10-16

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

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 가 아니더라도 파일 구조를 알면 직접 분석할 수도 있다.

닫기

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