[Pwnable] 8. Mitigation: NX & ASLR

Wonder_Land🛕·2022년 10월 24일
0

[Pwnable]

목록 보기
8/21
post-thumbnail

[Reference] : 위 글은 다음 내용을 제가 공부한 후, 인용∙참고∙정리하여 만들어진 게시글입니다.


  1. 서론
  2. ASLR
  3. NX
  4. Q&A
  5. 마치며

1. 서론

어떠한 보호 기법이 등장하면,
이를 우회하는 새로운 공격 기법이 등장하기도 합니다.

어떤 공격이 새롭게 등장할지는 아무도 모르는 것이기 때문에,
시스템 개발자들은 여러 겹의 보호 기법을 적용하여 시스템이 공격당할 수 있는 표면(Attack Surface)자체를 줄여나가려고 했습니다.

'드림핵'의 강의에서 등장한 프로그램을 보면,
첫째로, 반환 주소를 임의의 주소로 덮을 수 있었습니다.
두번째로, 사용자가 데이터를 입력할 수 있는 버퍼의 주소를 알 수 있었습니다.
마지막으로, 그 버퍼가 실행 가능했습니다.

이 중 첫번째 조건에 대한 보호 기법으로 '카나리(Canary)'를 도입했지만,
나머지 두 조건을 방어하지 않았기 때문에,
카나리만 우회하면 셀을 획득할 수 있었습니다.

따라서, 공격자의 침입을 어렵게 하기 위해선,
공격자가 메모리에서 임의의 버퍼 주소를 알기 어렵게 하고,
메모리 영역에서 불필요한 실행 권한을 제거
하는
보호 기법을 도입해야 합니다.

이와 관련하여 시스템 개발자들은
ASLR(Address Space Layout Randomization)
NX(No-eXecute)를 개발하고 적용했습니다.


2. ASLR

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

ASLR은 커널에서 지원하는 보호 기법이며, 다음의 명령어로 확인할 수 있습니다.

$ cat /proc/sys/kernel/randomize_va_space
2

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

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

다음 주소의 코드(https://learn.dreamhack.io/85#4)를 실행시켜 보면,
스택 영역의 buf_stack, 힙 영역의 buf_heap, 라이브러리 함수 printf, 코드 영역의 함수 main, 라이브러리 매핑 주소 libc_base가 출력됩니다.

  1. 코드 영역의 main함수를 제외한 다른 영역의 주소들은 매 실행마다 변경됩니다.
    실행 될 때마다 주소가 변경되기 때문에, 바이너리를 실행하기 전에는 해당 영역의 주소를 예측할 수 없습니다.

  2. 바이너리를 반복해서 실행해도, libc_base 주소 하위 12비트, printf 주소 하위 12비트 값은 변경되지 않습니다.
    ASLR이 적용되면, 라이브러리는 임의 주소에 매핑됩니다.
    그러나 라이브러리 파일을 그대로 매핑하는 것이므로, 매핑된 주소로부터 라이브러리의 다른 심볼까지의 거리(Offset)은 항상 같습니다.


3. NX

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

어떤 메모리 영역에 대해 쓰기 권한과 실행 권한이 함께 있으면, 시스템이 당연히 취약해지기 쉽습니다.

예를 들어, 코드 영역에 쓰기 권한이 있으면
공격자는 코드를 수정하여 원하는 코드가 실해오디게 할 수 있고,
반대로 스택이나 데이터 영역에 실행 권한이 있으면 Return to Shellcode와 같은 공격을 시도할 수 있습니다.

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

NX는 checksec을 통해 바이너리에 적용됐는지 확인할 수 있습니다.

참고로 NX는 다양한 명칭이 있습니다.
인텔은 XD(eXecute Disable), AMD는 NX, 윈도우는 DEP(Data Execution Prevention), ARM에서는 XN(eXecute Never)라고 부릅니다.


4. Q&A

-


5. 마치며

-

[Reference] : 위 글은 다음 내용을 제가 공부한 후, 인용∙참고∙정리하여 만들어진 게시글입니다.

profile
아무것도 모르는 컴공 학생의 Wonder_Land

0개의 댓글