Information Security

[DreamHack] Static Link vs. Dynamic Link 본문

INTERLUDE/System Hacking

[DreamHack] Static Link vs. Dynamic Link

sohexz 2024. 2. 14. 17:43

라이브러리

- 컴퓨터 시스템에서, 프로그램들이 함수나, 변수를 공유해서 사용할 수 있게 함

- 같은 함수를 반복적으로 정의해야 하는 수고를 덜 수 있어서 코드 개발의 효율이 높아진다는 장점

 

링크(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