일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- ARM
- PCA
- system hacking
- Image Processing
- bloc
- fastapi를 사용한 파이썬 웹 개발
- llm을 활용 단어장 앱 개발일지
- BOF
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- Kaggle
- pytorch
- ML
- DART
- FastAPI
- C++
- MDP
- Got
- MATLAB
- 영상처리
- Dreamhack
- BFS
- Stream
- BAEKJOON
- Algorithm
- 백준
- study book
- Flutter
- rao
- Widget
- Computer Architecture
- Today
- Total
Bull
[System Hacking] PLT & GOT 본문
시스템 해킹과 보안 분야에서 "PLT(Procedure Linkage Table)"와 "GOT(Global Offset Table)"는 주로 동적 링킹을 지원하는 시스템에서 사용되며, 실행 시간에 함수와 변수의 실제 주소를 결정하는 역할을 한다.
여기서 동적 링킹이란 프로그램이 실행되는 동안 필요한 코드나 데이터를 다른 파일로부터 불러와 연결하는 과정이다.
PLT(Procedure Linkage Table)
PLT는 동적 링킹을 사용하는 프로그램이 외부 함수를 호출할 때 사용하는 테이블이다.
예를 들어, 어떤 프로그램이 C 라이브러리의 printf 함수를 호출하려 할 때, 해당 프로그램의 실행 파일 자체에는 printf의 실제 코드가 포함되어 있지 않다.
대신, 실행 시간에 동적 링커(dynamic linker)가 printf 함수의 실제 주소를 찾아내고, 이 주소를 PLT에 등록한다.
프로그램은 PLT를 통해 printf 함수를 호출한다
GOT(Global Offset Table)
GOT는 동적 링킹 과정에서 외부 변수나 함수의 주소를 저장하는 테이블입니다.
PLT와 마찬가지로, 프로그램이 실행될 때 외부 함수나 변수의 실제 주소는 알 수 없습니다.
동적 링커는 실행 시간에 이러한 주소를 찾아 GOT에 등록합니다.
프로그램 내부에서 해당 함수나 변수가 필요할 때, GOT에서 해당 주소를 찾아 사용합니다.
GOT는 프로그램이 실행되는 동안 변경될 수 있으며, 이를 통해 다양한 라이브러리와 모듈의 함수 및 변수에 접근할 수 있습니다.
링킹 과정
바이너리가 실행되면 ASLR에 의해 라이브러리가 임의의 주소에 매핑된다.
이 상태에서 라이브러리 함수를 호출하면 라이브러리에서 함수의 이름을 담은 심볼들을 탐색하고
해당 함수의 정의를 발견하면 그 주소로 실행 흐름을 옮기게 된다.
이 전 과정을 통틀어 runtime resolve라고 한다.
반복적으로 호출되는 함수의 정의를 매번 탐색해야 한다면 비효율적이다.
그래서 GOT라는 테이블을 두고, resolve된 함수의 주소를 해당 테이블에 저장합니다.
그리고 나중에 다시 해당 함수를 호출하면 저장된 주소를 꺼내서 사용한다.
resolve 되기 전
pwndbg> got
GOT protection: Partial RELRO | GOT functions: 1
[0x404018] puts@GLIBC_2.2.5 -> 0x401030 ◂— endbr64
pwndbg> plt
Section .plt 0x401020-0x401040:
No symbols found in section .plt
[0x404018] puts@GLIBC_2.2.5 -> 0x401030 ◂— endbr64
현재 puts() 앞의 주소(0x401030)는 puts 함수의 실제 주소가 아니라, PLT(Procedure Linkage Table) 섹션 내의 어딘가를 가리키고 있다.
이는 동적 링커가 아직 puts 함수의 실제 주소를 찾아 GOT에 업데이트하지 않았음을 의미한다.
0x401030
got에 있던 이 주소로 가서 실행을 하다보면 dl_runtime_resolve_fxsave()를 실행하게 된다.
그리고 puts()의 실제 주소인 0x7ffffe02ed0을 찾아서 got 테이블에 저장한다.
pwndbg> got
GOT protection: Partial RELRO | GOT functions: 1
[0x404018] puts@GLIBC_2.2.5 -> 0x7ffff7e02ed0 (puts) ◂— endbr64
resolve된 후
puts@plt 를 두 번째로 호출할 때는 puts 의 GOT 엔트리에 실제 puts()의 주소인 0x7ffff7e02ed0로 바로 puts() 가 실행된다.
시스템 해킹에서 got의 취약점
PLT에서 GOT를 참조하여 실행 흐름을 옮길 때, GOT의 값을 검증하지 않는다는 보안상의 약점이 있다.
따라서 만약 앞의 예에서 puts의 GOT 엔트리에 저장된 값을 공격자가 임의로 변경할 수 있으면,
puts가 호출될 때 공격자가 원하는 코드가 실행되게 할 수 있다.
참고자료
[DreamHack 강의]
[출처]: https://dreamhack.io/lecture/courses/66
'Computer Science > System Hacking' 카테고리의 다른 글
[System Hacking] Format String Bug (FSB) (0) | 2024.04.18 |
---|---|
[System Hacking] Return To Library(RTL) with ROPgadget (0) | 2024.04.10 |
[System Hacking] NX & ASLR (0) | 2024.04.09 |
[System Hacking] Stack Canary (0) | 2024.04.06 |
[System Hacking] Return Address Overwrite (0) | 2024.04.05 |