728x90
반응형
Address Space LAyout Randomization
rtl 공격을 어렵게 할 수 있다.
라이브러리, 힙, 스택 영역 등의 주소를 바이너리가 실행될 때마다 랜덤한 영역에 배치하여, 공격에 필요한 Target Address 를 예측하기 어렵게 만든다.
NX bit 는 바이너리의 컴파일 옵션에 따라 적용 여부가 결정되지만 ALSR 은 서버의 설정 파일에 의해 보호 기법의 적용이 결정된다.
기본적으로 ASLR 은 비활성화 되어있다.
ASLR 은 데이터영역만 무작위화 시킨다.
메모리의 처음 부분에 정해지지 않은 크기의 공간을 추가하거나, 메모리의 섹션을 재배치하는 방식을 사용
장점
직접적인 메모리 참조가 힘들어진다.
단점
주소의 Image Base, 즉 시작 주소만 바뀐다.
VA(절대 주소) = Image Base + RVA(상대주소) 로 정해지는데, Image Base 만 바귀기 때문에 중간에 address leak 을 한다면 다른 함수도 결국 접근 가능하다.
Apply ASLR
echo [NUM] > /proc/sys/kernel/randomize_va_space
randomize_va_space = 0: ASLR을 적용하지 않음 1: 스택, 라이브러리를 랜덤화 2: 스택, 라이브러리, 힙 메모리를 랜덤화
Test Code
#include <stdio.h> #include <stdlib.h> #include <string.h> char *global = "Lazenca.0x0"; int main(){ char *heap = malloc(100); char *stack[] = {"LAZENCA.0x0"}; printf("[Heap] address: %p\n", heap); printf("[Stack] address: %p\n", stack); printf("[libc] address: %p\n",**(&stack + 3)); printf("[.data] address: %p\n",global); gets(heap); return 0; }
바뀌지 않는 부분
[vsyscall] Syscall의 overhead 문제를 줄이기 위해서 User Space 에 할당된 커널 영역
How to ex
- BruteForcing
- Nop Sled
- Symbolic link + RTL
/bin/cat 부분이 안바뀌는 것을 이용
symboliclink를 이용해 이 영역 안의 항상 있을법한 기계어 (ex \x01)를 파일명으로 사용하고, 이전에 만들었던 /tmp/sh 파일에 대한 실행 명령어(/tmp/sh)를 넣어 우회한다. 이렇게 하는 이유는 RTL공격에서는 /tmp/sh를 환경변수에 넣어서 실행했는데, ASLR은 환경변수도 사용할 수 없기 때문에 있을법한 기계어를 넣어서 일종의 동명이인을 이용하는 느낌 - Address Leak
가장 현실적인 우회방법
ASLR은 각 힙, 스택, 바이너리의 주소가 바뀌는 것은 맞지만, Image Base, 즉 시작 주소만을 바꿔주는 것 뿐.
따라서 절대주소 VA의 값은 Image base값 + RVA(상대주소)로 정해지는데 Image base만 바뀐다.
예를 들어 printf와 system사이의 주소 차를 알아놓고
printf의 주소를 프로그램 실행 중에 알아 낼 수 있다면 결국 system 함수도 실행시킬 수 있다.
Leak 후 ROP로 풀 수 있다.
이 글은 옵시디언을 이용해서 작성되었습니다.
728x90
반응형
'TOOR' 카테고리의 다른 글
[TOOR] 9.3. aslr_2 write up (미완) (0) | 2023.09.24 |
---|---|
[TOOR] 9.2 ASLR_1 write up (0) | 2023.09.24 |
[TOOR] 8,10 공유 라이브러리 & Lazy Binding & Now Binding (0) | 2023.09.20 |
[TOOR] 7. Lazy Binding & Now Binding (0) | 2023.09.20 |
[TOOR] 6.1. Canary & canary write_up (0) | 2023.09.19 |