상세 컨텐츠

본문 제목

Lazy binding (Feat. Now binding)

Computer Science/Linux System

by RACC8N 2020. 3. 9. 09:51

본문

Lazy binding

  • Lazy Binding은 lazy linking 또는 on-demand symbol resolution이라고도 한다.
  • Lazy Binding은 심볼이 실제로 사용될 때까지 심볼의 라이브러리 파일의 주소 값 확인이 수행되지 않는다.

Lazy binding behavior flow

  • 모든 동적라이브러리 함수는 PLT(Procedure Linkage Table) stub코드를 통해 호출된다.
    • PLT의 stub 코드는 상대 주소를 이용하여, 사용할 GOT(Global Offset Table)의 주소 값을 검색한다.
    • PLT는 GOT의 위치를 알고 있으며, 해당 GOT에 저장된 대상 함수의 주소를 읽고 이동한다.
  • 이와 같은 동작이 실행되기 위해서 GOT에 적절한 주소가 채워 져야한다.
    • Lazy Binding은 함수 호출이 처음 요청될 때 stub 코드를 이용해 GOT영역에 해당 함수의 심볼 주소를 생성한다. 
    • Stub 코드는 런타임 링커가 제공하는 바인딩 함수에 필요한 정보를 설정하는 역할을 하며, 설정이 완료되면 스텁 코드는 바인딩 함수로 이동한다.
  • 바인딩 함수는 "_dl_runtime_resolve" 함수에 대한 인수를 설정 후에 해당 함수를 호출한다.
    • 그리고 "_dl_runtime_resolve" 함수에서 반환 된 주소로 이동한다.
  • 다음부터는 유저가 함수를 호출 할 때 PLT stub code는 호출한 함수로 바로 이동한다.
    • GOT 영역에 해당 함수의 동적 라이브러리 주소 값이 저장되어 있기 때문이다.
  • 초기 GOT 영역에는 특수 Stub code의 주소가 저장되어 있고, 런타임 링커는 로드 기반에 대한 단순한 재배치만 수행한다.
    • 런타임 링크는 부하 베이스에 대한 간단한 재배치만 수행한다.

Lazy binding

  • 다음과 같이 심볼 주소가 저장된다.
    • main 함수는 printf 함수를 호출하기 위해 0x4005b0 주소를 호출한다.
    • 0x4005b0 영역의 코드는 0x601020 영역에 저장된 주소로 이동한다.
    • 0x601020 영역에는 0x4005b6 주소 값이 저장되어 있다.
      • printf 함수가 한번도 호출 되지 않았기 때문에 stub 코드 영역의 주소가 저장되어 있다.
    • 0x4005b6 영역에서는 개별 함수 번호를 스택에 저장하고, 0x400590 영역으로 이동한다.
    • 0x400590 영역에서는 프로그램 파일의 정보를 스택에 저장하고, 0x601010 주소에 저장된 영역으로 이동한다.
    • 0x601010 영역은 _dl_runtime_resolve() 함수의 코드 영역이다.

    •  _dl_runtime_resolve() 함수는 _dl_fixup() 호출을 통해 실제 함수 주소를 got 영역에 저장하고 리턴한다.
  • 해당 작업으로 인해 printf 함수만 got 영역에 실제 주소가 저장된다.
    • 아직 호출되지 않은 함수들은 got 영역에 실제 주소가 저장되어 있지 않다.

Now binding

  • 다음과 같이 심볼 주소가 저장된다.
    • main함수는 printf 함수를 호출하기 위해 0x4005c8 주소를 호출한다.
    • 0x4005c8 영역의 코드는 0x600fc8 영역에 저장된 주소로 이동한다.
    • lazy binding과 달리 0x600fc8 영역에는 0x0 값이 저장되어 있다.
    • Now binding의 경우 프로그램이 실행될 때 해당 프로그램에서 사용되는 함수들의 주소를 읽어와 got영역에 저장한다.
    • 해당 과정을 확인하지 위해 0x600fc8 영역을 watchpoint로 설정하고 프로그램을 실행하면 해당 영역의 값이 실제주소값으로 변경되는 것을 확인할 수 있다.

'Computer Science > Linux System' 카테고리의 다른 글

04. RELRO  (0) 2020.03.09
03. Canaries  (0) 2020.03.08
02. ASLR  (0) 2020.03.08
01. NX Bit (MS : DEP)  (0) 2020.03.08

관련글 더보기

댓글 영역