라이브러리
- 라이브러리는 컴퓨터 시스템에서, 프로그램들이 함수나, 변수를 공유해서 사용할 수 있게함
- 다수의 프로그램들은 서로 공통으로 사용하는 함수들이 많다.
C언어를 비롯하여 많은 컴파일 언어들은 자주 사용되는 함수들의 정의를 묶어서 하나의 라이브러리 파일로 만들고 여러 프로그램 파일이 공유해서 사용할 수 있도록 재원.
링크
링크는 많은 프로그래밍 언어에서 컴파일 마지막 단계, 프로그램에서 어떤 라이브러리 함수를 사용한다면, 호출된 함수와 실제 함수의 링크 과정에서 연결된다.
리눅스에서 C 소스 코드는 전처리, 컴파일, 어셈블 과정을 거쳐서 ELF형식을 갖춘 오브젝트 파일로 번역된다.
오브젝트 파일은 실행 가능한 형식은 갖추고 있지만 라이브러리 함수들의 정의가 어디 있는지 알지 못하므로 실행은 불가능 하다.
완전히 컴파일 하기 전
완전히 컴파일 후
라이브러리와 링크의 종류
라이브러리는 크데 동적 라이브러리와 정적 라이브러리로 구분된다.
동적 링크
동적 링크된 뱌이너리를 실행하면 동적 라이브러리가 프로세스의 메모리에 매핑됩니다. 그리고 실행 중에 라이브러리 함수를 호출하면 매칭된 라이브러리에서 호출할 함수의 주소를 찾고, 그 함수를 실행 합니다.
정적 링크
정적 링크를 하면 바이너리에 정적 링크에 필요한 모든 함수가 포함됩니다. 따라서 해당 함수를 호출할 때 라이브러리를 참조 하는 것이 아니라, 자신의 함수를 호출 하는 것처럼 호출할 수 있습니다. 라이브러리에서 원하는 함수를 찾지 않아도 되므로 탐색 비용이 절감되는 것 같지만, 여러 바이너리에서 라이브러리를 사용하면 그 라이브러리의 복제가 여러번 이루어지게 되므로 용량을 낭비하게 됩니다.
비교
각각의 용량을 비교해보면 용량의 차이가 많이 나는 것을 확인할 수 있습니다.\
static
static은 0x40a750에서 직접 puts 함수를 호출 하는 것을 알 수 있습니다.
dynamic
하지만 dynamic은 puts의 plt주소인 0x401030을 호출합니다. 이러한 차이는 동적 링크된 바이너리는 함수의 주소를 라이브러리에서 찾아야하기 때문입니다. plt는 이과정에서 사용되는 테이블 입니다.
PLT 와 GOT
PLT와 GOT는 라이브러리에서 동적 링크된 심봉의 주소를 찾을 때 사용되는 테이블 입니다.
바이너리가 실행될 때 ASLR에 의해 라이브러리가 임의의 주소에 매핑된다. 이 상태에서 함수를 호출하면 함수의 이름을 바탕으로 라이브러리에서 심볼들을 탐색하고, 해당 함수의 정의를 발견하면 그 주소로 실행 흐름을 옮기게 됩니다.
이 전 과정을 통틀어 return resolve 라고 합니다.
그런데 반복되는 함수의 정의를 매번 탐색하게 된다면 매우 비효율적일 것입니다. 그래서 ELF는 GOT라는 테이블을 두고,
resolve된 함수의 주소를 해당 테이블에 저장합니다. 그리고 다시 해당 함수를 호출하면 저장된 주소를 꺼내서 사용합니다.
'시스템 해킹 > DreamHack으로 해커를 꿈꾸며' 카테고리의 다른 글
[DreamHack] Return To Library (0) | 2023.02.27 |
---|---|
NX & ASLR 이란? (1) | 2023.02.27 |
[DreamHack] basic_exploitation_001 (0) | 2023.02.22 |
[DreamHack] basic_exploitation_000 (Stack Buffer Overflow) (0) | 2023.02.21 |
[DreamHack] Return Address Overwrite (0) | 2023.02.20 |