[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로는 파일을 peda로 열고, 간단히 checksec 명령어를 입력해주면 됩니다.
저는 그냥 예시로 보여주기 위해 pwnable.kr의 unlink프로그램을 확인해보았습니다. NX와, Partial RELRO만 걸려있는 것을 확인할 수 있네요.
이렇게 확인하는게 중요한 이유는 보호기법 설정에 따라 사용할 수 있는 공격기법이 추려지기 때문입니다. 그래서 ctf문제들을 풀 때도, 가장 먼저 보호기법을 확인하고, 사용할 공격기법의 후보군을 추린 뒤 취약점을 찾는 게 가장 이상적입니다. 근데 저도 맨날 그래야지 해놓고 보호기법 안보고 익스하다가 나중에 깨닫고 있긴 합니다....ㅎ
그래서 이번주는 5가지의 linux 메모리 기법을 알아볼 겁니다. 각 글마다 프로그램을 직접 구현하여 보호기법의 유무에 따라 어떤 점이 바뀌는지 알아볼 겁니다. 매일 글 한개씩 올리기로 했으니깐 목요일(10/15)까지 다 올라와있을 겁니다. 아마도,,,,,,,,,,,,,,,,,,,,,,,
1. ASLR(Address Space Layout Randomization) : dokhakdubini.tistory.com/298
2. Canary : dokhakdubini.tistory.com/299
3. NX(with DEP) : dokhakdubini.tistory.com/300
4. PIE : dokhakdubini.tistory.com/304
5. ASCII ARMOR
ㅎㅇㅌㅎㅇㅌ!
'Coding_Algorithm > Operating System' 카테고리의 다른 글
[linux] 2. Canary에 대하여 (0) | 2020.10.13 |
---|---|
[linux] 1. ASLR(Adress Space Layout Randomization)에 대하여 (0) | 2020.10.11 |
bits.c code (비공개) (0) | 2020.10.07 |
[linux] scp로 서버 파일 가져오기 (1) | 2020.10.03 |
[linux] gdb에서 core사용하기 (0) | 2020.07.17 |