ASLR은 메모리 손상 취약점 공격을 방지하기 위한 기술이다. 프로그램이 실행될 때마다 메모리의 주요 영역의 주소를 랜덤화하여 공격자가 특정 메모리 위치를 예측하기 어렵게 만드는 메커니즘이다.
ASLR(Address Space Layout Randomization)은 주소 공간 배치 무작위화를 의미한다. 컴파일 시에 DYNAMICBASE 옵션을 설정하면 해당 프로그램이 실행될 때마다 코드 주소, 스택 주소, 라이브러리 주소 등이 모두 무작위로 변경된다. 이를 통해 공격자가 특정 메모리 주소를 예측하여 공격하는 것을 어렵게 만든다.
ASLR의 목적
가장 단순한 방법으로, 익스플로잇에서 사용했던 고정된 주소 값이 나올 때까지 무작위로 대입을 시도하는 방법이다. 랜덤의 특성상 언젠가는 원하는 주소에 걸릴 수 있지만, 확율이 낮고 시간이 오래 걸린다는 단점이 있다. 또한, 공격으로 인해 프로그램이 종료되는 환경에서는 사용하기 어렵다.
0x90(NOP) 명령어를 많이 늘어놓은 다음 뒷쪽에 쉴코드를 넣어 프로그램이 랜덤한 주소로 리턴하거나 점프해도 0x90 구간 내에 EIP가 떨어질 확률을 높이는 방법이다. 이 방법은 퍼버의 크기가 제한되어 있을 경우 효과적이지 않을 수 있다.
프로그램들은 많은 모듈을 사용하는데, 이 중에서 ASLR이 적용되지 않은 모듈을 찾아 공격하는 방법이다. Immunity Debugger의 mona module을 사용해 ASLR이 적용되지 않은 모듈을 찾을 수 있다.
ASLR이 4바이트 주소 중 상위 바이트만 변경되는 특성을 이용하는 기법이다. 리턴 주소 변조 시 전체가 아닌 일부분만 덮어쓰는 방식으로 공격한다. 예를 들어, 정상 주소가 0x4011ABD일 때 하위 1-3바이트를 변조하여 0x401ABD로 흐름을 변경할 수 있다.
메모리 주소를 노출시키는 취약점을 활용해 ASLR을 무력화하는 방법이다. 공격에 필요한 다양한 정보들을 먼저 획득한 뒤, 그 정보를 바탕으로 ROP 체인 등을 구성하여 공격하는 기법이다. 예를 들어, Vtable 주소를 기반으로 오프셋 값을 계산하면 모듈의 Base Address 값을 확인할 수 있고, 이를 이용하여 ASLR을 우회할 수 있다.
힙 공간의 메모리가 해제되는 순간에 같은 크기의 악성코드를 할당하면 빈 주소에 악성코드가 할당되는 원리를 이용한 공격 방법이다. 이 방법은 특히 웹 브라우저 환경에서 자바스크립트를 통해 자주 사용된다.
Info Leak 취약점을 이용하여 Base Address를 알아보면
이렇게 뒤에 나오는 문자열의 길이가 저장되어 있는 부분을 덮어 씌운다면 해당 문자열 객체의 뒤에 존재하는 객체의 메모리 주소까지 모두 노출 되게 된다.
객체의 첫 4바이트는 Vtable 이며, Vtable은 코드 영역에 존재하므로 계산을 통해 프로그램의 Base Address를 구할 수 있다.
Vtable = Base Address + Offset
Base Address = Vtable - Offset
003F2100 - 003F1000 = 1100 => Offset 값
해당 프로그램은 ASLR 이 적용된 프로그램이므로 프로그램을 다시 실행 시키면 주소값이 변경된다.
다시 실행하고 BaseAddress 를 구해보면
01222100 - 1100 = 01221000
BaseAddress를 구할 수 있다.
이런 방법으로 ASLR이 적용된 환경에서 BaseAddress를 구할수 있으며, 해당 BaseAddress + Offset을 하여 모듈 내의 명령어에 대한 주소들을 구할 수 있다.