NX & ASLR

2026. 5. 19. 15:16·System Hacking

NX (No - eXecute)

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

코드 영역에 쓰기 권한이 있으면 공격자가 코드 수정으로 원하는 코드를 실행할 수 있고, 스택이나 데이터 영역에 실행 권한이 있으면 쉘코드를 해당 영역에 입력한 후 반환 주소를 조작해서 쉘코드를 실행할 수 있다.

 

*인텔은 XD(eXecute Disable), 윈도우는 DEP(Data Execution Prevention), ARM은 XN(eXecute Never) 라고 칭한다.

 

NX를 지원하는 CPU라면 컴파일러는 바이너리에 NX를 적용할 수 있다. 해당 기능이 적용되면 실행될 때 각 메모리 영역에 필요한 권한만을 부여받는다.

gdb의 vmmap으로 할당된 권한을 확인할 수 있다.

NX가 적용되지 않은 바이너리에는 스택 영역에 실행 권한이 부여되어 rwx권한을 가진다. NX가 적용된 바이너리는 코드영역에만 실행권한이 부여된다.

 

더보기
// Name: r2s.c
// Compile: gcc -o r2s r2s.c -zexecstack

#include <stdio.h>
#include <unistd.h>

int main() {
  char buf[0x50];

  printf("Address of the buf: %p\n", buf);
  printf("Distance between buf and $rbp: %ld\n",
         (char*)__builtin_frame_address(0) - buf);

  printf("[1] Leak the canary\n");
  printf("Input: ");
  fflush(stdout);

  read(0, buf, 0x100);
  printf("Your input is '%s'\n", buf);

  puts("[2] Overwrite the return address");
  printf("Input: ");
  fflush(stdout);
  gets(buf);

  return 0;
}

NX 보호 기법을 바이너리에 적용하지 않는 경우 -zexecstack

왼쪽은 NX 보호 기법을 적용하지 않고 컴파일한 결과이다. NX disable로 나오는 듯 한데, 나는 NX unknown 으로 뜬다. 어쨌든 적용되지 않은듯.

RWX에 Has RWX segments는 RWX 권한을 모두 가진 메모리 영역이 있음을 뜻한다. 

 

공격 코드는 r2s 문제에서 썼던 공격을 재활용한다. 

왼쪽의 경우는 익스플로잇이 성공한다. 하지만 오른쪽의 경우는 Segment fault가 발생하면서 익스플로잇에 실패한다.

NX가 적용되어 스택 영역에 실행권한이 사라지면서 쉘코드가 실행되지 못하고 종료되었기 때문이다. 

NX 적용 후 익스플로잇 결과

 

ASLR (Address Space Layout Randomization

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

현대 리눅스 시스템에 실제로 적용된 보호기법이다. 

 

앞서 만든 r2s 프로그램을 실행할 때마다 버퍼 주소가 달라지는 것을 확인할 수 있는데, 이는 ASLR이 적용된 결과이다.

0은 ASLR을 적용하지않음. 1은 스택, 라이브러리, vdso 등. 2는 1의 영역과 brk로 할당한 영역

스택영역, 힙영역, 라이브러리 함수, 코드 영역 함수, 라이브러리 매핑 주소를 출력하는 프로그램의 결과이다. 

- 코드 영역의 main함수를 제외한 다른 영역들은 주소가 실행될 때마다 변경됨

- libc_base와 printf의 주소 하위 12비트 값은 변경되지 않음. 이는, 리눅스가 ASLR이 적용됐을 때 파일을 페이지 단위로 임의의 주소에 매핑하기 때문에, 페이지 크기인 12비트 이하로는 주소가 변경되지 않는다. 

- libc_base와 printf의 주소 차이는 항상 같음. ASLR 적용 시 라이브러리(파일)가 임의의 주소에 매핑되므로 매핑된 주소로부터 라이브러리의 다른 심볼들까지의 오프셋(거리)는 항상 같다.

 

대표적인 공격 방법으로는 Return-to-Libc(RTL)과 Return Oriented Programming(ROP)가 있다. 

저작자표시 비영리 변경금지 (새창열림)

'System Hacking' 카테고리의 다른 글

Return to Library (RTL공격. NX우회)  (0) 2026.05.19
Static Link와 Dynamic Link  (0) 2026.05.19
Stack Canary  (0) 2026.05.17
Stack Buffer Overflow 스택 버퍼 오버플로우  (0) 2026.05.16
셸코드 Shellcode  (0) 2026.05.12
'System Hacking' 카테고리의 다른 글
  • Return to Library (RTL공격. NX우회)
  • Static Link와 Dynamic Link
  • Stack Canary
  • Stack Buffer Overflow 스택 버퍼 오버플로우
권 한
권 한
포렌식 같이 하실래요?
  • 권 한
    Kwon5an.log
    권 한
    • 분류 전체보기 (115) N
      • @Xpert (28)
        • 2025 (23)
        • 2026 (5)
      • Forensic (26)
        • Windows (7)
        • Linux (3)
        • Memory (4)
        • Network (0)
      • System Hacking (6)
      • Reversing (0)
      • STUDY (11)
        • 컴퓨터 구조 (2)
        • 운영체제 (0)
        • 알고리즘 자료구조 (0)
        • CS (7)
      • #컴공에서살아남기 (15) N
        • 201 C++ (3)
        • 201 보안기초 (12) N
        • 201 OSS (0)
      • Write-up (15)
        • H4CKING GAME (1)
        • DreamHack (12)
        • bandit (0)
      • PROGRAM (0)
        • K-shield.jr (0)
      • PROJECT (0)
      • 사담.생각.끄적끄적 (7)
  • 공지사항

    • Notice
  • 링크

    • DAILY BLOG
    • Velog
    • NOTION
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.6
권 한
NX & ASLR
상단으로

티스토리툴바