Iriton's log

Background: Library 본문

Pwnable/Study

Background: Library

Iriton 2024. 5. 22. 04:10

*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다.

라이브러리

프로그램들이 함수나, 변수를 공유해서 사용할 수 있게 한다.

자주 사용되는 함수들의 정의를 묶어서 하나의 라이브러리 파일로 만들고, 이를 여러 프로그램이 공유해서 사용할 수 있도록 지원하고 있다.

C의 표준 라이브러리인 libc는 우분투에 기본으로 탑재된 라이브러리

 

링크

많은 프로그래밍 언어에서 컴파일의 마지막 단계로 알려져 있다.

프로그램에서 어떤 라이브러리의 함수를 사용한다면 호출된 함수와 실제 라이브러리의 함수가 링크 과정에서 연결된다.

리눅스에서 c 소스 코드는 전처리, 컴파일, 어셈블 과정을 거쳐 ELF 형식을 갖춘 오브젝트 파일로 번역된다.

오브젝트 파일은 실행 가능한 형식을 갖추고 있지만, 라이브러리 함수들의 정의가 어디 있는지 알지 못하므로 실행은 불가능하다. 심볼과 관련된 정보들을 찾아서 최종 실행 파일에 기록하는 것이 링크 과정에서 하는 일 중 하나다.

동적 링크

링크된 바이너리를 실행하면 동적 라이브러리가 프로세스의 메모리에 매핑

실행 중에 라이브러리의 함수를 호출하면 매핑된 라이브러리에서 호출할 함수의 주소를 찾고 그 함수를 실행

정적 링크

바이너리에 정적 라이브러리의 필요한 모든 함수가 포함된다. 따라서 해당 함수를 호출할 때, 라이브러리를 참조하는 것이 아니라, 자신의 함수를 호출하는 것처럼 호출할 수 있다. 라이브러리에서 원하는 함수를 찾지 않아도 되니 탐색의 비용이 절감되는 듯하지만 여러 바이너리에서 라이브러리를 사용하면 그 라이브러리의 복제가 여러 번 이루어지게 되므로 용량 낭비.

 

PLT & GOT

**PLT(Procedure Linkage Table)**와 **GOT(Global Offset Table)**는 라이브러리에서 동적 링크된 심볼의 주소를 찾을 때 사용하는 테이블

바이너리가 실행되면 ASLR에 의해 라이브러리가 임의의 주소에 매핑.

이 상태에서 라이브러리 함수를 호출하면, 함수의 이름을 바탕으로 라이브러리에서 심볼들을 탐색하고, 해당 함수의 정의를 발견하면 그 주소로 실행 흐름을 옮김.

그런데 만약 반복적으로 호출되는 함수의 정의를 매번 탐색해야 한다면 비효율적일 것. 그래서 ELF는 GOT라는 테이블을 두고, resolve된 함수의 주소를 해당 테이블에 저장. 그리고 나중에 다시 해당 함수를 호출하면 저장된 주소를 꺼내서 사용.

시스템 해킹의 관점에서 본 PLT와 GOT

PLT와 GOT는 동적 링크된 바이너리에서 라이브러리 함수의 주소를 찾고, 기록할 때 사용되는 중요한 테이블

그런데, 시스템 해커의 관점에서 보면 PLT에서 GOT를 참조하여 실행 흐름을 옮길 때, GOT의 값을 검증하지 않는다는 보안상의 약점이 있다.

따라서 만약 앞의 예에서 puts의 GOT 엔트리에 저장된 값을 공격자가 임의로 변경할 수 있으면, puts가 호출될 때 공격자가 원하는 코드가 실행되게 할 수 있다.

GOT 엔트리에 저장된 값을 임의로 변조할 수 있는 수단이 있음을 가정하고, 이 공격 기법이 가능한지 gdb를 이용하여 간단하게 실험을 해볼 수 있다.

got바이너리에서 main() 내 두 번째 puts() 호출 직전에 puts의 GOT 엔트리를 “AAAAAAAA”로 변경한 후 실행시키면, 실제로 “AAAAAAAA”로 실행 흐름이 옮겨지는 것을 확인할 수 있다.

'Pwnable > Study' 카테고리의 다른 글

Exploit Tech: Return Oriented Programming  (0) 2024.05.29
Exploit Tech: Return to Library  (0) 2024.05.29
Mitigation: NX & ASLR  (1) 2024.05.22
Exploit Tech: Return to Shellcode  (0) 2024.05.15
Mitigation: Stack Canary  (0) 2024.05.07
Comments