[ Pwnable ] BOF 공격을 방어하는 메모리 보호기법
by 월루서문
우리는 저번 시간에 기본 BOF 공격에 대해 알아봤다, 하지만 저번 시간의 환경에선 어떠한 메모리 보호 기법도 적용되지 않은 상태에서 진행하였기 때문에 어떠한 문제없이 공격에 성공할 수 있었다, 오늘은 시스템이 의도하지 않은 메모리 공간의 쓰기, 실행을 방지하는 여러 메모리 보호 기법을 알아보겠다.
메모리 보호 기법이란?
사전적 정의는 '운영 체제에서 실행하고 있는 프로세스가 자신에게 할당되지 않은 영역의 메모리에 접근하는 것을 막는 것이 메모리 보호의 주된 목적이다'라고 설명하고 있다.
메모리 보호 기법의 종류
1. DEP / NX (Data Execution Protection / Non Executable)
-> DEP와 NX는 둘 다 같은 개념의 보호 기법이다. 보통 리눅스 개열에선 NX라는 용어를 많이 사용하고, 윈도우 개열에서는 DEP라는 용어를 더 많이 사용한다. 용어의 뜻에서 알 수 있듯이 해당 기법의 주된 기능은 메모리 공간의
실행 권한을 뺐는 것이다. 이는 스택뿐만 아니라 힙 영역도 포함된다. 따라서 우리가 쉘 코드를 삽입했던
스택 영역의 실행 권한을 제거하여 해당 쉘 코드를 무력화하는 기술이다.
2. ASLR (Address Space Layout Randomization)
-> ASLR는 용어의 뜻 그대로 주소의 공간을 무작위로 변경하는 기법이다. 이때 해당되지 않는 메모리 공간은 텍스트 영역, 즉 프로그램의 바이너리 영역이다. 바이너리 공간의 주소를 임의로 바꾸는 기술은 PIE 기술이다. 어쨌든 ASLR은 데이터, 스택, 힙 영역의 주소를 무작위로 변경하는 기법이다. 환경변수 또한 스택 영역에 할당된다, 따라서 환경변수의 주소 값을 매 실행마다 다르게 하여 원하는 값이나 주소를 가져오지 못하도록 만드는 기술이다. 하지만 주소가 완전히 랜덤으로 바뀌는 것이 아니라 PE 헤더의 'Image Base' 값만 임의로 변경하기 때문에 RVA 주소는 동일하다. (PE 헤더나 RVA에 대한 정보는 PE 헤더를 추가로 공부하길 바란다)
3. ASCII-Armor
-> ASCII-Armor는 라이브러리 함수(Libc)의 주소에 \x00인 NULL 바이트를 넣음으로써 문자열로 RTL 공격을 시도할 때특정 함수의 호출을 막는 기술이다. 문자열은 \x00을 만나면 문자열이 끝났다고 인식하여 원하는 주소를 삽입할 수 없다.
3. Canary
-> Canary는 버퍼 공간에서 SFP(Stack Frame Pointer) 사이에 BOF를 탐지하기 위한 임의의 데이터를 넣고 해당
데이터가 임의의 데이터로 변조되었는지를 확인하여 BOF를 막는 기술이다. 하지만 Canary의 임의의 데이터 값만
알 수 있다면 생각보다 순조롭게 우회할 수 있다.
오늘 소개한 기법은 대표적인 메모리 보호 기법이다. 따라서 더 많은 메모리 보호 기법도 존재한다.
각 기법별 우회방법 !
1. DEP / NX
-> DEP / NX는 RTL 기술을 이용하여 우회할 수 있다, RTL은 쉘 코드를 특정 영역에 삽입하는 것이 아니라, 라이브러리 함수(Libc)의 주소와 인자를 덮어쓰고 호출하여(대표적으로 execl() 함수가 있다) 원하는 로직을 실행하는 기술이다.
2. ASLR
-> ASLR은 NOP Siled 기술을 사용하여 성공 확률을 높이거나, RTL, 뒤에 소개할 ROP 기술과 ASLR이 적용되지 않은 바이너리 영역의 데이터를 활용하여 공격이 가능하다.
3. ASCII-Armor
-> ASCII-Armor은 ROP 기술을 활용하여 PLT&GOT Overwrite 하여 PLT를 호출함으로써 공격이 가능하다.
ROP 기술은 라이브러리 함수를 연속으로 호출하는 기술이고, PLT&GOT Overwrite는 특정 함수의 GOT 값을
우리가 원하는 라이브러리의 주소로 ROP를 이용하여 복사, 덮어쓰고 RET에서 PLT 영역을 실행하여 호출하는 방법이다. PLT와 GOT에 대한 지식이 없다면 따로 공부해보길 바란다.
4. Canary
-> Canary는 Canary의 데이터 값의 위치와 값을 디버깅으로 조사한 뒤 해당 위치에 동일한 Canary값을 넣음으로써 우회가 가능하다.
* 위에 설명한 각 기술의 실습은 해당 블로그에 순서대로 올릴 예정이다.
마치며...
제가 글을 쓰는 가장 큰 이유는 배운 내용을 정리하고 나중에 다시 공부하기 위해서입니다, 따라서 잘못된 정보가 포함되어 있거나 중요한 내용이 빠져 있을 수 있습니다, 잘못된 내용이나 빠진 내용이 있는 경우 댓글로 말씀해주시면 정말 감사드리겠습니다!
'정보보안 > Pwnable' 카테고리의 다른 글
[ Pwnable ] 기본 BOF 시작하기 [해킹] (0) | 2021.07.04 |
---|---|
[ Pwnable, Reversing ] BOF의 기본 쉘 코드 만들기 [해킹] (0) | 2021.06.16 |
블로그의 정보
남쪽의 외딴섬
월루