| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Dreamhack
- zb
- pwnable
- CTF
- NX
- strcpy
- 혼공 c
- Stack Canary
- 2차원 배열
- ssh
- Bandit
- Git
- pwntools
- shellcode
- ASLR
- 혼공C
- buffer
- 배열
- c언어
- 포인터
- linux
- Crypto
- zbhack
- sfp
- Little Endian
- c 언어
- pwnable.kr
- plt
- C
- stack buffer overflow
- Today
- Total
zerobean's archive
[pwnable] PLT & GOT 본문
dreamhack 시스템 해킹 로드맵 중 Library - static link vs dynamic link를 정리한 글입니다.
틀린 부분은 댓글로 알려주시기 바랍니다.
1. 라이브러리
C언어에는 함수들이 많다.
사용자가 지정할 수 있는 함수도 있지만 기본적으로 라이브러리에 정의된 함수가 있다.
대표적으로 stdio.h에 정의되어 있는 printf라는 함수가 있다.
이렇게 함수들을 미리 정의해 놓은 곳을 라이브러리라고 한다.
C의 표준 라이브러리인 libc는 /lib/x86_64-linux-gnu/libc.so.6에 존재한다.
2. 링크
링크는 컴파일에 마지막 단계로 프로그램에서 라이브러리의 함수를 사용하는 경우 호출된 함수와 실제 라이브러리의 함수가 링크로 연결된다. 리눅스에서 전처리, 컴파일, 어셈블 다음에 하는 것이 링크이다. 어셈블을 완료하면 object file로 번역되는데 이 오브젝트 파일은 링크가 되지 않아 함수 실행이 불가능하다. 오프젝트 파일에는 심볼로는 기록되어 있지만 자세한 기록은 없다. 심볼과 관련된 내용을 찾아서 최종 파일에 기록하는 것이 링크의 일 중 하나다.
링크를 완료하면 libc에서 함수의 정의를 찾아 연결된다. gcc는 모든 표준 라이브러리를 찾아 컴파일 하기 때문에 libc을 같이 컴파일할 필요는 없다.
3. 동적 링크 vs 정적 링크
라이브러리는 동적 라이브러리와 정적 라이브러리가 있고 이에 해당하는 링크를 각각 동적 링크와 정적링크로 부른다.
동적 링크된 바이너리가 실행 된 경우 동적 라이브러리는 프로세스의 메모리에 매핑되고 함수를 호출할 때마다 이 동적 라이브러리에서 호출할 함수의 주소를 찾는다.
정적 링크된 바이너리가 실행 된 경우 정적 라이브러리는 모든 함수를 프로세스에 데리고 와서 함수가 필요하면 바로 사용하면 된다.
정적 링크는 동적 링크에 비해 빠르지만 용량을 많이 차지한다.
여기서 동적 링크된 바이너리는 동적 라이브러리에서 함수를 찾아야 하기 때문에 PLT라는 테이블을 사용한다. 앞에서 보면 어셈블리어에서 <read@plt>라고 되어있는 이것이 동적 링크가 사용하는 것이 plt임을 보여준다.
4. PLT & GOT
PLT는 Procedure Linkage Table의 약자로 GOT(Global Offst Table)과 함께 라이브러리에서 동적 링크된 심볼의 주소를 찾는 데 사용하는 테이블이다.
바이너리가 실행되면 ASLR에의해 라이브러리에 임의의 주소가 매핑되고 이 상태에서 라이브러리의 함수를 호출하면 함수의 이름으로 라이브러리에서 심볼들을 탐색하여 발견하면 그 주소로 실행흐름을 옮긴다. 이를 runtime resolve라고 한다.
GOT는 PLT를 통해 한번 실행 된 함수의 주소들을 저장하는 테이블이다. 반복되는 함수를 매번 찾아주는 수고를 덜어준다.
하지만 GOT는 두번째두 번째 호출할 때 주소를 확인하지 않는다는 보안상 취약점이 존재한다. gdb에서 got을 입력한 후 두 번째 함수가 호출되기 직전 GOT 엔트리의 값을 변경해 주면 실행 흐름을 옮길 수 있다. 이를 활용한 공격기법은 GOT Overwrite라고 한다.
'pwnable > 개념' 카테고리의 다른 글
| [pwnable] NX & ASLR (0) | 2024.01.12 |
|---|---|
| [pwnable] Stack Canary (0) | 2024.01.12 |
| [pwnable] stack buffer overflow (0) | 2023.09.24 |
| [pwnable] calling convention (0) | 2023.09.23 |
| [pwnable] pwntools (0) | 2023.07.14 |