Information Security
[DreamHack] Static Link vs. Dynamic Link 본문
라이브러리
- 컴퓨터 시스템에서, 프로그램들이 함수나, 변수를 공유해서 사용할 수 있게 함
- 같은 함수를 반복적으로 정의해야 하는 수고를 덜 수 있어서 코드 개발의 효율이 높아진다는 장점
링크(Link)
- 심볼과 관련된 정보들을 찾아서 최종 실행 파일에 기록하는 것
- 컴파일의 마지막 단계
gcc는 소스 코드를 컴파일할 때 표준 라이브러리의 라이브러리 파일들을 모두 탐색
$ ld --verbose | grep SEARCH_DIR | tr -s ' ;' '\n'
표준 라이브러리의 경로 확인
=> 링크를 거치고 나면 프로그램에서 puts를 호출할 때, puts의 정의가 있는 libc에서 puts의 코드를 찾고, 해당 코드를 실행하게 됨
정적 컴파일동적 컴파일
$ gcc -o static hello-world.c -static
$ gcc -o dynamic hello-world.c -no-pie
용량 확인
$ ls -lh ./static ./dynamic
-rwxrwxr-x 1 dreamhack dreamhack 16K May 22 02:01 ./dynamic
-rwxrwxr-x 1 dreamhack dreamhack 880K May 22 02:01 ./static
-> 정적이 동적보다 50배 더 많은 용량을 차지함
호출
static
- puts 가 있는 0x40c140 을 직접 호출
dynamic
- puts 의 plt주소인 0x401040 을 호출
plt: 이 과정에 사용되는 테이블
PLT(Procedure Linkage Table)와 GOT(Global Offset Table)
라이브러리에서 동적 링크된 심볼의 주소를 찾을 때 사용하는 테이블
GOT 테이블을 두고, resolve된 함수의 주소를 해당 테이블에 저장
runtime resolve
바이너리가 실행되면 ASLR에 의해 라이브러리가 임의의 주소에 매핑
이 상태에서 라이브러리 함수를 호출
함수의 이름을 바탕으로 라이브러리에서 심볼들을 탐색
해당 함수의 정의를 발견하면 그 주소로 실행 흐름을 옮기게 됨
resolve 되기 전
GOT의 상태 확인
$ gdb ./got
pwndbg> entry
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
pwndbg>
puts 의 GOT 엔트리인 0x404018 에는 아직 puts 의 주소를 찾기 전이므로, 함수 주소 대신 .plt 섹션 어딘가의 주소인 0x401030 이 적혀 있음
resolve 된 후에는
puts@plt 하면 puts 의 GOT 엔트리에 실제 puts 의 주소인 0x7ffff7e02ed0 가 쓰여있어서 바로 puts 가 실행됨
시스템 해킹의 관점에서 본 PLT와 GOT
PLT에서 GOT를 참조하여 실행 흐름을 옮길 때, GOT의 값을 검증하지 않는다는 보안상의 약점
GOT 엔트리에 저장된 값을 공격자가 임의로 변경할 수 있으면, 함수가 호출될 때 공격자가 원하는 코드가 실행되게 할 수 있음
ex) got바이너리에서 main() 내 두 번째 puts() 호출 직전에 puts의 GOT 엔트리를 “AAAAAAAA”로 변경한 후 실행시키면, 실제로 “AAAAAAAA”로 실행 흐름이 옮겨지는 것을 확인할 수 있습니다.
$ gdb -q ./got
pwndbg> b *main+33
pwndbg> r
...
──────────────────────[ DISASM / x86-64 / set emulate on ]──────────────────────
► 0x401157 <main+33> call puts@plt <puts@plt>
s: 0x402021 ◂— 'Get address from GOT'
0x40115c <main+38> mov eax, 0
pwndbg> got
GOT protection: Partial RELRO | GOT functions: 1
[0x404018] puts@GLIBC_2.2.5 -> 0x7ffff7e02ed0 (puts) ◂— endbr64
pwndbg> set *(unsigned long long *)0x404018 = 0x4141414141414141
pwndbg> got
GOT protection: Partial RELRO | GOT functions: 1
[0x404018] puts@GLIBC_2.2.5 -> 0x4141414141414141 ('AAAAAAAA')
pwndbg> c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401044 in puts@plt ()
...
──────────────────────[ DISASM / x86-64 / set emulate on ]──────────────────────
► 0x401044 <puts@plt+4> bnd jmp qword ptr [rip + 0x2fcd] <0x4141414141414141>
GOT Overwrite
GOT 엔트리에 임의의 값을 오버라이트(Overwrite)하여 실행 흐름을 변조하는 공격 기법
일반적으로 임의 주소에 임의의 값을 오버라이트하는 수단을 가지고 있을 때 수행하는 공격 기법
'INTERLUDE > System Hacking' 카테고리의 다른 글
[DreamHack] Return Oriented Programming (0) | 2024.02.23 |
---|---|
[DreamHack] Return to Library (0) | 2024.02.15 |
[DreamHack] NX & ASLR (0) | 2024.02.13 |
[DreamHack] Stack Canary (1) | 2024.02.13 |
[DreamHack] BOF / basic_exploitation_001 (0) | 2024.02.08 |