[linux] 0. 메모리 보호기법 - abstract

두비니

·

2020. 10. 11. 15:16

 

 

 

 

 

이번주는 메모리 보호기법에 대해서 서술해보려고 합니다.

 

일단 메모리 보호기법 자체에 대한 정의를 알아봅시다.

 

메모리 보호는 컴퓨터 메모리의 사용을 제어하는 방법이며 모든 운영 체제에서 중요한 쟁점사항 중 하나이다. 운영 체제에서 실행하고 있는 프로세스가 자신에게 할당되지 않은 영역의 메모리에 접근하는 것을 막는 것이 메모리 보호의 주된 목적이다. 이를 통해 프로세스 내의 버그가 다른 프로세스의 동작에 영향을 미치는 것을 예방하며 악성 소프트웨어가 시스템에서 허가되지 않은 접근권한을 갖고 시스템에 영향을 끼치는 것을 막아준다.

-Wikipedia

 

네. 뭐 위키는 저렇다는데 쉽게 얘기하면 메모리 사용을 제어하는 방법입니다. 시스템 해킹을 배워보신 분이라면 사용하길 원하는 함수/메모리의 주소, 입력해야 하는 데이터의 길이 등 필요한 요소들을 알고 계실 겁니다. 메모리 보호기법은 이런 시스템 해킹에 필요한 요소들을 알기 어렵게 하는 것들입니다. 그니깐 취약점은 존재하나, 해킹은 하기 어렵게 만드는 것이지요.

 

Q. 어떻게 취약점은 존재하는데 해킹은 하기 어려울 수 있죠?

 

지금 저 말이 이해 안되시는 분들이 있다고 생각하실 겁니다. 음 그럼 이렇게 얘기해봅시다. 시스템 해킹을 배울 때 가장 먼저 배우는 Buffer Overflow를 예를 들어볼게요. 예를 들어 한 프로그램이 입력의 크기에 제한을 두지 않아 Buffer Overflow 문제가 발생한다고 생각해봅시다. 그런 경우, Buffer Overflow문제의 전형적인 공격 시나리오는 다음과 같습니다.

 

1. 접근할 수 있고 비어있는 메모리 공간에 쉘코드 삽입

2. Buffer Overflow를 이용하여 RET영역에 해당 버퍼의 주소 삽입

 

프로그램이 return하는 주소를 변조하여 원하는 명령을 실행시키는 식입니다. 근데 만약에 쉘코드를 실행시킬 수 없다면?(NX) RET영역 위에 오버플로우가 되었는지 확인하는 값이 있다면?(Canary) 주소가 매번 실행할 때마다 바뀐다면?(ASLR, PIE)

 

그럼 기존의 프로그램은 아직 BOF 취약점은 존재하지만, 위 시나리오는 사용할 수 없겠죠? 그런 뜻에서 '취약점은 존재하지만, 해킹은 하기 어렵다'고 할 수 있는 것입니다.

 

 

Q. 그럼 해킹이 불가능한거 아닌가요?

 

아뇨, 해커들은 그걸 또 해킹해냅니다.... 각 보호기법은 존재하지만, 그에 따른 우회기법들 또한 존재합니다. 음....그럼 의미없는거 아니냐구요? 뭐 틀린말은 아니긴한데, 정말 최소한의 해킹들은 방지를 하자는 거죠.

 

 

Q. 실제 프로그램에 대해서 보호기법을 확인하고싶을 때는 어떻게 확인할 수 있나요?

 

gdb-peda나 checksec.sh를 이용하면 확인할 수 있습니다. gdb-peda가 없으신 분은 아래 글 참고!

gdb-peda: go-madhat.github.io/gdb-peda/

 

gdb-peda 설치 및 사용법!

요즘 pwnable 문제의 binary를 분석하기위해 gdb를 종종 사용한다. write-up등을 보다보면 gdb가 이쁘길래 어떻게 한 것인가 찾아보다가 gdb-peda를 알게 되었다!

go-madhat.github.io

 

 

gdb-peda로는 파일을 peda로 열고, 간단히 checksec 명령어를 입력해주면 됩니다.

 

 

저는 그냥 예시로 보여주기 위해 pwnable.kr의 unlink프로그램을 확인해보았습니다. NX와, Partial RELRO만 걸려있는 것을 확인할 수 있네요.

 

이렇게 확인하는게 중요한 이유는 보호기법 설정에 따라 사용할 수 있는 공격기법이 추려지기 때문입니다. 그래서 ctf문제들을 풀 때도, 가장 먼저 보호기법을 확인하고, 사용할 공격기법의 후보군을 추린 뒤 취약점을 찾는 게 가장 이상적입니다. 근데 저도 맨날 그래야지 해놓고 보호기법 안보고 익스하다가 나중에 깨닫고 있긴 합니다....ㅎ

 

그래서 이번주는 5가지의 linux 메모리 기법을 알아볼 겁니다. 각 글마다 프로그램을 직접 구현하여 보호기법의 유무에 따라 어떤 점이 바뀌는지 알아볼 겁니다. 매일 글 한개씩 올리기로 했으니깐 목요일(10/15)까지 다 올라와있을 겁니다. 아마도,,,,,,,,,,,,,,,,,,,,,,,

 


 

 

1. ASLR(Address Space Layout Randomization) : dokhakdubini.tistory.com/298

 

[linux] ASLR(Adress Space Layout Randomization)에 대하여

ASLR Address Space Layout Randomization 1. What is ASLR? 자 오늘은 리눅스 메모리 보호기법 첫 번째 입니다. ASLR에 대해서 배워 볼 건데요, 일단 ASLR이란 Address Space Layout Randomization의 줄임말입니..

dokhakdubini.tistory.com

2. Canary : dokhakdubini.tistory.com/299

 

[linux] Canary에 대하여

Canary Linux Memory Protection - 2 1. What is Canary? **Stack Smashing Detected** 빼앵앵애ㅐㅇ애에에ㅔㅔㄱ Canary기법이란 'buffer와 SFP(Stack Frame Pointer) 사이에 buffer overflow를 탐지하기 위한 임..

dokhakdubini.tistory.com

3. NX(with DEP) : dokhakdubini.tistory.com/300

 

[linux] NX(with DEP)에 대하여

NX(with DEP) Non-Executable / Data Execution Protection Linux Memory Protection - 3 1. What is NX/DEP? NX와 DEP는 둘 다 같은 개념의 보호기법으로 각각 Non executable과 Data Execution Protection의 약..

dokhakdubini.tistory.com

4. PIE : dokhakdubini.tistory.com/304

 

[linux] 4. PIE에 대하여

PIE Position Independent Execution Linux Memory Protection - 4 1. What is PIE? 리눅스 보호기법의 마지막, PIE입니다. 우선 PIE는 Position Independent Execution의 약자로, 해석하면 "위치 독립 실행"이라..

dokhakdubini.tistory.com

5. ASCII ARMOR

 


 

ㅎㅇㅌㅎㅇㅌ!