Buffer OverFlow에 대해서 알아보겠습니다.
다른 언어에서는 그렇지 않은데, C같은 언어를 사용할 때, 입력하라는 값을 초과하면 입력값이 메모리 영역에 쓰여지는 경우가 있습니다.
이 때문에 메모리 주소값을 조작해서 BOF공격이 가능합니다.
일단 리눅스 환경에서 BOF를 하기 전에 ASLR을 해지합니다.
ASLR(Address Space Layout Randomization )이란 실행 할 때마다 주소가 바뀌는 기능입니다.
randomize_va_space=0 : ASLR 해제
randomize_va_space=1 : 랜덤 스택 & 랜덤 라이브러리 설정
randomize_va_space=2 : 랜덤 스택 & 랜덤 라이브러리 & 랜덤 힙 설정
Stack Canaries 라고 Stack상의 변수들의 공간과 SFP 사이에 특정한 값을 추가 할 수 있습니다.
SSP 옵션으로 아래와 같은 옵션들이 있습니다.
fstack-protector (default) |
SSP 적용 (취약한 Function들) |
-fno-stack-protector |
SSP 사용 않음 |
-fstack-protector-all |
모든 Function에 SSP 적용 |
그럼 Stack Canaries에 대해 파훼법이 없는 것인가요?
- 스택 카나리는 직접적인 BOF에 대한 공격만 고려한 방어 방법이며, return address 조작을 통해 BOF를 발생하는 경우 취약할 수 있다.
ASLR은 Stack이나 heap를 임의의 메모리 주소로 배치하는 기법인데, 이를 통해 모든 BOF를 막을 수 있나요?
- 안됩니다. 무작위 공격에 대해 취약합니다.