본문 바로가기

DreamHack: System Hacking/F Stage 7

ASLR, NX & Static-Link, Dynamic-Link

ASLR & NX

[ASLR(Address Space Layout Randomization)]

메모리를 무작위 주소에 할당하는 보호 기법. 최신 커널들은 대부분 적용되어 있음. 리눅스에서는 페이지 단위로 할당이 이루어지므로 'libc_base'와 'printf'등 함수의 하위 12비트는 변하지 않는다는 특징이 있음.
또한, ASLR이 적용되어도 PIE가 적용되어 있지 않다면, "데이터 세그먼트(plt, got ∈ 데이터 세그먼트)", "코드 세그먼트"의 주소는 고정되어있음.

 

[NX(No-eXecute bit)] 프로세스의 각 세그먼트에 필요한 권한만 부여하는 보호 기법. 일반적으로 코드 영역에는 읽기와 실행을, 나머지 영역에는 읽기와 쓰기 권한이 부여됨.

 

Static Link & Dynamic Link

[라이브러리]: 많은 함수들이 정의되어 저장되어있는 공간

[링크]: 호출된 함수와 실제 라이브러리의 함수가 연결되는 과정
- 링크를 거치고 나면 프로그램에서 함수(ex. printf)를 호출할 때 함수의 정의가 있는 라이브러리(ex. libc)에서 함수의 코드를 찾고, 해당 코드를 실행한다.

[동적 링크]: 동적(Dynamic) 라이브러리를 링크하는 것
1) 동적 링크된 바이너리를 실행 -> 동적 라이브러리가 프로세스의 메모리에 매핑됨.
2) 실행 중에 라이브러리의 함수를 호출 -> 메모리에 매핑된 라이브러리에서 호출된 함수의 주소를 찾고, 그 함수를 실행함

[정적 링크]: 정적(Static) 라이브러리를 링크하는 것
1) 정적 링크를 하면 바이너리에 정적 라이브러리의 필요한 모든 함수가 포함됨.
2) 따라서 함수를 호출할 때 라이브러리를 참조한느 것이 아니라, 자신의 함수를 호출하는 것처럼 호출함

[PLT(Procedure Linkage Table) & GOT(Global Offset Table)]: 라이브러리에서 "동적 링크"된 "심볼의 주소를 찾을 때" 사용하는 테이블
-프로그램의 실행 과정:
1) 바이너리가 실행되면 ASLR에 의해 라이브러리가 임의의 주소에 매핑됨.
2) 이 상태에서 라이브러리 함수를 호출하면, 함수의 이름을 바탕으로 라이브러리에서 심볼을 탐색함
3) 심볼을 탐색하여, 해당 함수의 정의를 발견하면, 그 주소로 실행 흐름을 옮김.
((1)~(3)의 과정을 통틀어 "Runtime Resolve"라고 칭함)
4) ELF는 GOT라는 테이블을 두고, resolve된 함수의 주소를 해당 테이블에 저장함
5) 나중에 다시 해당 함수를 호출하면 GOT에 저장된 주소를 꺼내서 사용함


***in short) 함수(printf)를 처음 호출 -> plt의 섹션을 참조 -> plt가 가리키고 있는 GOT 엔트리로 실행 흐름을 옮김 -> GOT 엔트리에 해당 함수의 주소가 없다면 PLT의 "_dl_runtime_resolve_fxsave" 함수가 실행됨 -> 이 함수(_dl_runtime_resolve_fxsave)를 통해 printf의 주소가 구해지고, 이 printf의 주소를 GOT 엔트리에 씀. -> 이후에 같은 함수(printf)를 호출할 때 GOT 엔트리에 쓰여진 그 함수(printf)의 실제 주소를 통해 해당 함수를 실행

--------------------------------------------------------------------------------------------------------------------------------------
[퀴즈 1]
Q: PLT에서 GOT를 참조하여 실행 흐름을 옮길 때, GOT의 값은 반드시 라이브러리 함수의 주소를 가리켜야 한다
A: (X). 처음 함수를 호출할 때 GOT에는 라이브러리의 해당 함수의 주소를 갖고 있지 않다.

[퀴즈 2]
Q: 정적 링크된 바이너리에서 처음 함수 func를 호출하면, runtime resolve를 거쳐야 해서 시간이 소모된다
A: (X). 정적 링크된 바이너리는 해당 함수를 자신이 갖고 있으므로 runtime resolve 과정을 거치지 않고, 바로 해당 함수를 호출할 수 있다.

[퀴즈 3]
Q: GOT에는 runtime resolve를 하기 위한 코드가 들어있다
A: runtime resolve를 하기 위한 "_dl_runtime_resolve_fxsave" 함수는 plt에 포함되어 있다. plt를 통해 got를 참조했을 때 해당 함수의 주소가 없다면 plt는 "_dl_runtime_resolve_fxsave" 함수를 호출하여 해당 함수를 찾고, GOT 테이블에 해당 함수의 주소를 갱신한다.

[퀴즈 4]
Q: 동적 링크된 바이너리는 정적 링크된 바이너리에 비해 바이너리의 크기가 작다는 장점이 있다
A: (O). 그렇다.



'DreamHack: System Hacking > F Stage 7' 카테고리의 다른 글

basic_rop_x86  (0) 2023.06.14
basic_rop_x64  (0) 2023.06.14
[함께 실습] Return Oriented Programming  (0) 2023.06.11
[함께 실습] Return to Library  (0) 2023.06.10