카테고리 없음

드림핵 stage7 Bypass NX & ASLR

O'bin 2022. 7. 24. 23:37

Address Space Layout Randomization(ASLR)

바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법

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

메모리를 무작위 주소에 할당하는 보호 기법. 최신 커널들은 대부분 적용되어 있음.

리눅스에서는 페이지 단위로 할당이 이루어지므로 하위 12비트는 변하지 않는다는 특징이 있음.

 

ASLR 확인 명령어  : cat /proc/sys/kernel/randomize_va_space

위 명령 실행 결과 0,1,2 결과값 가짐

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

ASLR의 특징

실행할 때 마다 주소가 변경되기 때문에 바이너리를 실행하기 전에 해당 영역들의 주소를 예측할 수 없음

libc_base와 printf의 주소 차이는 항상 같음
ASLR이 적용되면, 라이브러리는 임의 주소에 매핑

그러나 라이브러리 파일을 그대로 매핑하는 것이므로 매핑된 주소로부터 라이브러리의 다른 심볼들 까지의 거리(Offset)는 항상 같음

 

 

No-eXecute(NX)

실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법

CPU가 NX를 지원하면 컴파일러 옵션을 통해 바이너리에 NX를 적용할 수 있음

NX가 적용된 바이너리는 실행될 때 각 메모리 영역에 필요한 권한만을 부여받음

프로세스의 각 세그먼트에 필요한 권한만 부여하는 보호 기법.

일반적으로 코드 영역에는 읽기와 실행을, 나머지 영역에는 읽기와 쓰기 권한이 부여됨.

checksec ./파일 이름 명령을 통해 NX 적용 여부 확인 가능

 

 

NX를

인텔은 XD(eXecute Disable),

AMD는 NX,

윈도우는 DEP(Data Execution Prevention),

ARM에서는 XN(eXecute Never)

라고 칭함

 

라이브러리

자주 사용되는 함수들의 정의를 묶어서 하나의 라이브러리 파일로 만들고,

이를 여러 프로그램이 공유해서 사용할 수 있도록 지원

 

링크

많은 프로그래밍 언어에서 컴파일의 마지막 단계로 알려져 있습니다. 프로그램에서 어떤 라이브러리의 함수를 사용한다면, 호출된 함수와 실제 라이브러리의 함수가 링크 과정에서 연결

라이브러리는 크게 동적 라이브러리와 정적 라이브러리로 구분되며,

동적 라이브러리를 링크하는 것을 동적 링크(Dynamic Link)

정적 라이브러리를 링크하는 것을 정적 링크(Static Link)라고 부름

 

동적 링크

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

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

 

정적 링크

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

라이브러리에서 원하는 함수를 찾지 않아도 됨 -> 탐색의 비용이 절감되는 듯하지만,

여러 바이너리에서 라이브러리를 사용하면 그 라이브러리의 복제가 여러 번 이루어져 용량 낭비

 

 

 

PLT(Procedure Linkage Table)와 GOT(Global Offset Table)

라이브러리에서 동적 링크된 심볼의 주소를 찾을 때 사용하는 테이블

resolve된 함수의 주소를 해당 테이블에 저장

나중에 다시 해당 함수를 호출하면 저장된 주소를 꺼내서 사용

 

 

시스템 해커의 관점에서 보면 PLT에서 GOT를 참조하여 실행 흐름을 옮길 때,

GOT의 값을 검증하지 않는다는 보안상의 약점

GOT Overwrite라고 부르며, 임의 주소에 값을 쓸 수 있을 때, RCE를 하기 위한 방법으로 사용

 

Return To Library =  Return To Libc

실행 권한이 남아있는 코드 영역으로 반환 주소를 덮는 공격 기법

 libc의 함수들로 NX를 우회하고 셸을 획득하는 공격 기법