ASLR(Address Space Layout Randomization)이란?
- 메모리 손상 취약점 공격을 방지 하기 위한 기술
- 스택, 힙, 라이브러리 등의 주소를 랜덤한 영역에 배치하여, 공격에 필요한 Target address를 예측하기 어렵게 만든다.
- 프로그램이 실행 될 때 마다 각 주소들이 변경된다.
예를 들어 Return-to-libc 공격을 하기 위해서는 공유 라이브러리에서 사용하려는 함수의 주소를 알아야 하는데 이러한 주소 값들이 프로그램이 호출 될때 마다 바뀐다면 공격이 어려워진다(불가능하지는 않음).
- Set ASLR
cmd
echo 0 > /proc/sys/kernel/randomize_va_space
option
0 : ASLR 해제
1 : 랜덤 스택 & 랜덤 라이브러리 설정
2 : 랜덤 스택 & 랜덤 라이브러리 & 랜덤 힙 설정
- Check the protection techniques of binary files
- checksec.sh
system-wide ASLR (kernel.randomize_va_space): On (Setting: 2)
- Memory map
"/proc/<PID>/maps" 파일을 통해 프로세스의 메모리 구조 및 주소를 확인 할 수 있다.
프로그램을 처음 실행했을 때와 두번째 실행했을 때의 메모리 배치가 다른 것을 확인 할 수 있다.
Linux 폴더 정보
/proc : process의 줄임말이며, 이 디렉토리에 프로세스의 정보들이 저장됨.
/proc/self : 현재 실행되고 있는 프로세스의 정보가 담겨있는 디렉토리.
/proc/self/maps : 현재 실행되고 있는 프로세스의 주소 맵.
- data 영역
ASLR의 설정을 2로 설정해도 .data 영역의 주소는 변경되지 않는다. 해당 영역 주소도 매번 새로운 주소에 할당하기 위해서는 PIE를 적용해야 한다.
www.lazenca.net/display/TEC/06.PIE에서 더 자세한 내용 확인 가능
Canaries란?
- Canaries 또는 Canary word는 버퍼 오버 플로우를 모니터하기 위해 버퍼와 SFP 사이에 설정 된 값이다.
- 버퍼 오버플로가 발생하면 Canary 값이 손상되며, Canaries 데이터의 검증에 실패하여 오버플로에 대한 경고가 출력되고, 손상된 데이터가 무효화 처리된다(프로그램 종료).
Types of canaries
- Terminator canaries
- Terminator Canaries는 Canary의 값을 문자열의 끝을 나타내는 문자들을 이용해 생성한다.
- Terminator Canaries의 값은 NULL (0x00), CR (0x0d), LF (0x0a) 및 EOF (0xff)로 구성되어 있다(공격자는 Canaries를 우회하기 위해 Return address를 쓰기 전에 null문자를 써야 하는데, null문자로 인해 overflow를 방지하게 된다).
- 이 보호에도 불구하고 공격자는 잠재적으로 Canary를 알려진 값으로 겹쳐쓰고 정보를 틀린 값들로 제어해서 Canary 검사 코드를 통과할 수 있다.
- Random canaries
- Random Canaries는 Canary의 값을 랜덤하게 생성한다(일반적으로 익스플로잇을 이용해 Canary를 읽는 것은 논리적으로 불가능).
- Random Canaries는 프로그램 초기 설정 시에 전역 변수에 Canary 값이 저장된다(이 값은 보통 매핑되지 않은 페이지에 저장되는데, 해당 메모리를 읽으려는 시도를 할 경우 segmentation fault가 발생하고 프로그램이 종료된다).
- 공격자가 Canary 값이 저장된 stack address를 알거나 스택의 값을 읽어올수 있는 프로그램이 있다면 Canary의 값을 확인 할 수 있다.
- Random XOR canaries
- Random XOR Canaries는 Canary의 값을 모든 제어 데이터 또는 일부를 사용해 XOR-scramble 하여 생성한다(Canary의 값, 제어 데이터가 오염되면 Canary의 값이 달라진다).
- Random XOR Canaries는 Random Canaries와 동일한 취약점을 가지고 있다(단지 Canary 값을 Stack에서 읽어오는 방법이 조금 더 복잡해진다 공격자는 Canary를 다시 인코딩 하기위해 Original Canary 값, 알고리즘, 제어 데이터가 필요하다).
bof가 발생하면 canary 영역을 침범하기 때문에 canary 값이 오염되고, 이를 감지하여 스택 버퍼 오버플로우 경고 메세지를 출력한 후, 프로그램이 강제 종료된다.
- Check the protection techniques of binary files
- checksec.shCanary_Do-not-set: No canary found
- Canary: Canary found
- How to detect Canary in the "Checksec.sh" file
- Binary
'readelf' 명령어를 이용해 해당 파일의 심볼 테이블 정보를 가져와 Canary 설졍여부를 확인.
파일의 심볼 테이블에 "__stack_chk_fail"가 있으면 Canary가 적용되었다고 판단.
- ProcessBinary의 확인 방식과 비슷하며, 전달되는 파일의 경로가 다음과 같이 다름. ex) /proc/<PID>/exe
추가로 '/proc/<PID>/exe' 파일에 'Symbol table' 정보가 있는지 확인.
'Study > System Hacking' 카테고리의 다른 글
[dreamhack] Linux Exploitation & Mitigation Part 3 / SSP & RELRO & PIE (0) | 2021.02.21 |
---|---|
[LOB] troll -> vampire (0) | 2021.02.12 |
[dreamhack] Linux Exploitation & Mitigation Part 2 / ASLR & PLT, GOT Section (0) | 2021.02.12 |
[LOB] orge -> troll (0) | 2021.02.09 |
[LOB] darkelf -> orge (0) | 2021.02.09 |