NX
프로레스 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술
NX 특성으로 지정된 모든 메모리 구역은 데이터 저장을 위해서만 사용되고, 프로세서 명령어가 그 곳에 상주하지 않음으로써 실행되지 않도록 만들어 준다
ex) 공격자가 Heap, Stack 영역에 shellcode를 저장해서 실행하기 위해서는 해당 영역에 실행권한이 있어야한다.
NX 비활성화 옵션 : gcc -z execstack
ASLR
ASLR(Address Space Layout Randomization)
스택, 힙, 라이브러리, 등의 주소를 랜덤한 영역에 배치하여, 공격에 필요한 target address를 예측하기 어렵게 만든다.
프로그램이 실행 될 때마다 각 주소들이 변경이 된다.
echo 0 > /proc/sys/kernel/randomize_va_space
0 : ASLR 해제 / 1 : 랜덤 스택 & 랜덤 라이브러리 설정 / 2 : 랜덤 스택 & 랜덤 라이브러리 & 랜덤 힙
echo 0 > /proc/sys/kernel/randomize_va_space
주소 변경 x
echo 1 > /proc/sys/kernel/randomize_va_space
stack , libc의 주소 영역이 변경된다.
echo 2 > /proc/sys/kernel/randomize_va_space
heap, stack, libc의 주소 영역이 변경됨
Canaries
버퍼 오버플로우를 모니터하기 위해 버퍼와 제어 데이터 사이에 설정 된 값이다. 버퍼 오버플로우가 발생하면 canary 값이 손상되고, canaries 데이터의 검증이 손상되어 데이터의 검증에 실패하게 되고, 오버플로우에 대한 경고가 출력이 됩니다.
Terminator canaries
canary의 값을 문자열의 끝을 나타내는 문자들을 이용해 생성한다. NULL (0x00), CR(0x0d), LF(0x0a) 및 EOF(0xFF)로 구성되어 있다.
Random canaries
canary의 값을 랜덤하게 값이 생성한다.
Random XOR canaries
canary의 값을 모든 제어 데이터 또는 일부를 사용해 XOR-scramble 하여 생성한다.
PIE
위치 독립 코드로 이루어진 실행 가능한 바이너리
(위치 독립 코드 :실행할 때마다 매핑되는 주소가 어디든지에 상관없이 실행되는 파일)
바이너리의 주소를 랜덤화해서 바이너리의 특정 주소의 값을 수정하는 것과 같은 공격을 방어한다.
https://qhrhksgkazz.tistory.com/248
[메모리 보호기법]PIE
출처 http://lazenca.net/display/TEC/02.TechNote https://bpsecblog.wordpress.com/2016/06/10/memory_protect_linux_4/ PIE PIE (Position Independent Executable) 위치 독립 코드로 이루어진 실행 가능한 바이너리 (위치 독립 코드 : 실행
qhrhksgkazz.tistory.com
checksec로 확인을 해보면 다음과 같다.
PIE가 적용되지 않은 프로그램 같은 경우에는 전역 변수와 사용자 정의 함수의 주소가 변경되지 않는다.
PIE 가 적용된 프로그램은 전역 변수와 사용자 정의 함수의 주소가 변경된다