본문 바로가기

System Hacking

PLT & GOT

1. 라이브러리 정의

  • 자주 사용하는 함수들의 정의를 묶어서, 하나의 라이브러리 파일로 만들고
    이를 프로그램이 공유해서 사용할 수 있도록 지원하는 것이다.
  • 같은 함수를 정의해야 하는 일이 줄어들음으로써, 코드 개발의 효율이 높아진다는 장점이 있다.

2. C언어의 라이브러리

  • C의 표준 라이브러리는 libc이며, 우분투에 기본적으로 탑재되어있다.
    (실행환경에서는 /lib/x86_64-linux-gnu/libc-2.27.so에 존재한다.)
  • 프로그램에서 공통으로 사용하는 함수 중 C언어의 대표적인 것은 printf, scanf, strlen, memcpy, malloc 등의 함수가 존재한다.
  • 라이브러리는 크게 동적 라이브러리와 정적 라이브러리로 구분된다.

3. 표준 라이브러리의 경로를 확인 명령어

$ ld --verbose | grep SEARCH_DIR | tr -s ' ;' '\n'

4. 정적 링크 (Static Link)

  • 정적 라이브러리를 링크하는 것을 의미한다.
  • 바이너리에 정적 라이브러리의 모든 함수가 포함된다. 따라서 해당 함수를 호출할 때, 라이브러리를 참조하는 것이 아니라, 자신의 함수를 호출하는 것처럼 호출할 수 있다.
  • 라이브러리에서 원하는 함수를 찾지 않아도 되지만, 여러 바이너리에서 라이브러리를 사용하면 그 라이브러리의 복제가 여러 번 이루어져서 용량을 낭비하는 문제가 발생한다.

5. 동적 링크 (Dynamic Link)

  • 동적 라이브러리를 링크하는 것을 의미한다.
  • 동적 링크된 바이너리를 실행하면, 동적 라이브러리가 프로세스의 메모리에 매핑된다. 그리고 실행 중에 라이브러리의 함수를 호출하면, 매핑된 라이브러리에서 호출할 함수의 주소를 찾고 그 함수를 실행한다.

6. PLT & GOT 정의

  • PLT는 Procedure Linkage Table이고, GOT는 Global Offset Table의 약자이다.
  • 동적 링크된 바이너리에서 라이브러리 함수의 주소를 찾고 기록할 때 사용되는 테이블이다.
  • 동적 링크는 PLT 테이블을 이용해서, 호출할 함수의 주소를 라이브러리에서 찾는다.

7. 동적링크 동작원리

① 바이너리가 실행되면 ASLR에 의해 라이브러리가 매핑한다.

② 이후, 라이브러리 함수를 호출하면 함수의 이름을 바탕으로 라이브러리에서 심볼을 탐색한다.

③ 해당 함수의 정의를 발견하면, 그 주소로 실행 흐름을 옮기게 된다.

* 해당 과정을 "runtime resolve"라고 한다.

8. PLT 정의

  • PLT는 실제 호출 코드를 담고 있는 테이블이다.
  • 내용 참조를 위해 _dl_runtime_resolve가 수행되어, 실제 시스템 라이브러리 호출이 이뤄지게 된다.
  • runtime resolve를 하기 위한 코드는 PLT에 들어있습니다.

9. GOT 정의

  • 반복적으로 호출되는 함수의 정의를 매번 탐색해야 한다면 비효율적이기 때문에, GOT테이블을 사용한다.
  • 그래서 ELF는 GOT라는 테이블을 두고 resolve된 함수의 주소를 해당 테이블에 저장하여,
    함수를 다시 호출할 경우 저장된 주소를 꺼내서 사용하게 된다.

10. GOT의 문제점

  • PLT에서 GOT를 참조하여 실행흐름을 옮길 때, GOT의 값을 검증하지 않는다.
  • GOT에 저장된 함수의 주소를 공격자가 임의로 변경할 수 있으면, 함수가 재호출 될 때 공격자가 원하는 코드가 실행될 수 있다. 이를 "GOT Overwrite"라고 한다.
  • 보통 임의 주소에 값을 쓸 수 있을 때, RCE 하기 위한 방법으로 사용된다.

 

 

'System Hacking' 카테고리의 다른 글

Fake EBP  (0) 2022.08.03
RTC (Return To CSU)  (0) 2022.07.04
RTL (Return to Library)  (0) 2022.06.29
NX & ASLR  (0) 2022.06.27
Stack Canary  (0) 2022.06.25