Bypass NX & ASLR
NX
NX
No-eXecute(NX) : 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법, NX가 적용된 바이너리는 실행될 때 각 메모리 영역에 필요한 권한만 부여받음
NX를 인텔은 XD(eXecute Disable) , AMD는 NX, 윈도우는 DEP(Data Execution Prevention) , ARM에서는 XN(eXecute Never) 라고 칭하고 있음
NX disable 시 리눅스커널마다 동작방법이 다름. 리눅스 5.4.0 미만 버전은 스택 영역 뿐만 아니라 힙, 데이터 영역 등 읽기권한이 있는 모든 페이지에 실행권한 부여, 5.4.0 이상 버전은 스택 영역에만 실행권한 부여
checksec을 이용하면 NX가 적용됬는지 확인 가능
ASLR
ASLR
Address Space Layout Randomization (ASLR) : 바이너리가 실행될 때 마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법
ASLR은 데이터 영역만 무작위화, PIE는 바이너리 영역을 무작위화
주소의 Image Base, 즉 시작 주소만 바뀜 -> VA(절대 주소 ) = Image base값 + RVA(상대주소) 로 정해지는데 Image base만 바뀌기 때문에 중간에 address leak을 하면 다른 함수도 접근 가능
ASLR을 실행시키면 code, data, BSS section은 그대로 but heap, stack, binary section은 실행할때마다 주소가 바뀜

ASLR 확인법 : $ cat /proc/sys/kernel/randomize_va_space -> 2
0 : No ASLR(ASLR 적용 X)
1 : Conservative Randomization(1) : 스택, 라이브러리, vdso 등
2 : Conservative Randomization + brk(2) : (1)의 영역과 brk로 할당한 영역
ASLR의 특징
코드 영역의 main 함수를 제외한 다른 영역의 주소들은 실행할 때마다 변경됨, 실행할 때 마다 주소가 변경되기 때문에 바이너리를 실행하기 전에 해당 영역들의 주소를 예측할 수 없음
바이너리를 반복해서 실행해도 libc_base 주소 하위 12비트 값과 printf 주소 하위 12비트 값 변경 안됨 why? -> 리눅스는 ASLR이 적용됐을 때 파일을 페이지 단위로 임의 주소에 매핑하기 때문 따라서 페이지의 크기인 12비트 이하로는 주소가 변경되지 않음
libc_base와 printf의 주소차이는 항상 같음 why? ASLR이 적용되면 라이브러리는 임의 주소에 매핑됨 but 라이브러리 파일을 그대로 매핑하는 것이므로 매핑된 주소로부터 라이브러리의 다른 심볼들까지의 거리는 항상 같음
마치며
NX와 ASLR이 적용되면 스택, 힙, 데이터 영역에는 실행 권한이 제거되며, 이들이 할당되는 주소가 계속 변합니다. 그러나 바이너리의 코드가 존재하는 영역은 여전히 실행 권한이 존재하며, 할당되는 주소도 고정되어 있습니다.
코드 영역에는 유용한 코드 가젯들과 함수가 포함되어 있습니다. 반환 주소를 셸 코드로 직접 덮는 대신, 이들을 활용하면 NX와 ASLR을 우회하여 공격할 수 있습니다. 관련된 대표적인 공격 방법으로는 Return-to-Libc (RTL)과 Return Oriented Programming (ROP)가 있습니다. 다음 강의부터는 이 공격 기법들에 대한 배경 지식을 살펴보고, 이들을 이용하여 ASLR과 NX 그리고 카나리를 우회하는 실습을 해보도록 하겠습니다.
다음 강의에서는 라이브러리와 동적 링크, 그리고 정적 링크에 대한 내용을 다루겠습니다. 🚩
키워드
Address Space Layout Randomization(ASLR): 메모리를 무작위 주소에 할당하는 보호 기법. 최신 커널들은 대부분 적용되어 있음. 리눅스에서는 페이지 단위로 할당이 이루어지므로 하위 12비트는 변하지 않는다는 특징이 있음.
NX(No-eXecute bit): 프로세스의 각 세그먼트에 필요한 권한만 부여하는 보호 기법. 일반적으로 코드 영역에는 읽기와 실행을, 나머지 영역에는 읽기와 쓰기 권한이 부여됨.
Last updated