본문 바로가기
CTF/Dreamhack

[Dreamhack] System Hacking STAGE 7 - Mitigation: NX & ASLR, Background: Library - Static Link vs. Dynamic Link

by 8희 2022. 11. 6.

Mitigation: NX & ASLR

NX와 ASLR

- NX와 ASLR이 적용되면 스택, 힙, 데이터 영역에는 실행 권한이 제거되며, 이들이 할당되는 주소가 계속 변한다.

- 그러나 바이너리의 코드가 존재하는 영역은 여전히 실행 권한이 존재하며, 할당되는 주소도 고정

 

ASLR

- Address Space Layout Randomization(ASLR)은 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법

- ASLR은 커널에서 지원하는 보호 기법

- cat /proc/sys/kernel/randomize_va_space  /  해당 명령어로 확인 가능

- 리눅스에서 이 값은 0, 1, 또는 2의 값을 가질 수 있다.

- 각 ASLR이 적용되는 메모리 영역

  • No ASLR(0): ASLR을 적용하지 않음
  • Conservative Randomization(1): 스택, 힙, 라이브러리, vdso 등
  • Conservative Randomization + brk(2): (1)의 영역과 brk로 할당한 영역

- addr.c 코드는 메모리의 주소를 출력하는 코드

 

NX

- No-eXecute(NX)는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법

- CPU가 NX를 지원하면 컴파일러 옵션을 통해 바이너리에 NX를 적용할 수 있으며, NX가 적용된 바이너리는 실행될 때 각 메모리 영역에 필요한 권한만을 부여받는다.

-  NX가 적용된 바이너리에는 코드 영역 외에 실행 권한이 없다.

- NX가 적용되지 않은 바이너리에는 스택, 힙, 데이터 영역에 실행 권한이 존재

- checksec을 이용하면 바이너리에 NX가 적용됐는지 확인할 수 있다.

- NX를 인텔은 XD(eXecute Disable), AMD는 NX, 윈도우는 DEP(Data Execution Prevention), ARM에서는 XN(eXecute Never)라고 칭하고 있다.

 

NX와 ASLR을 우회하여 공격하는 방법

 - 코드 영역에 포함된 유용한 코드 가젯들과 함수들을 활용해서 NX와 ASLR을 우회하여 공격 가능

1, RTL(Return-to-Libc)

2. ROP(Return Oriented Programming)

 


Background: Library - Static Link vs. Dynamic Link

라이브러리

- 라이브러리는 컴퓨터 시스템에서, 프로그램들이 함수나, 변수를 공유해서 사용할 수 있게 한다.

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

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

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

 

링크

- 링크(Link)는 많은 프로그래밍 언어에서 컴파일의 마지막 단계

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

- 리눅스에서 C 소스 코드는 전처리, 컴파일, 어셈블 과정을 거쳐 ELF형식을 갖춘 오브젝트 파일(Object file)로 번역

- 오브젝트 파일은 실행 가능한 형식을 갖추고 있지만, 라이브러리 함수들의 정의가 어디 있는지 알지 못하므로 실행은 불가능

 

라이브러리와 링크의 종류

- 라이브러리는 크게 동적 라이브러리와 정적 라이브러리로 구분되며, 동적 라이브러리를 링크하는 것을 동적 링크(Dynamic Link), 정적 라이브러리를 링크하는 것을 정적 링크(Static Link)

 

1, 동적 링크

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

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

 

2. 정적 링크

- 정적 링크를 하면 바이너리에 정적 라이브러리의 필요한 모든 함수가 포함

- 해당 함수를 호출할 때, 라이브러리를 참조하는 것이 아니라, 자신의 함수를 호출하는 것처럼 호출할 수 있다.

- 라이브러리에서 원하는 함수를 찾지 않아도 되니 탐색의 비용이 절감되는 듯하지만, 여러 바이너리에서 라이브러리를 사용하면 그 라이브러리의 복제가 여러 번 이루어지게 되므로 용량을 낭비

 

PLT와 GOT

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

- ELF는 GOT라는 테이블을 두고, resolve된 함수의 주소를 해당 테이블에 저장

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

- GOT Overwrite: 임의 주소에 값을 쓸 수 있을 때, RCE를 하기 위한 방법으로 사용될 수 있다.