일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- CustomScrollView
- android
- Coroutines
- ScrollView
- Button
- LifeCycle
- viewmodel
- activity
- DART
- drift
- livedata
- Flutter
- 앱
- binding
- 안드로이드
- intent
- Kotlin
- tabbar
- TEST
- scroll
- appbar
- 계측
- 앱바
- data
- Compose
- Dialog
- textfield
- Navigation
- 테스트
- textview
- Today
- Total
Study Record
[리버싱 기초개념] 메모리 보호기법 본문
Linux 메모리 보호기법
1. ASLR(Address Space Layout Randomization)
프로그램이 실행되어 메모리 공간에 올라갈때, 메모리상의 공격을 어렵게 하기 위해 스택이나 힙, 라이브러리 등의 주소를 무작위로 프로세스 주소 공간에 배치함으로써 실행할 때 마다 데이터의 주소가 바뀌게 하는 기법이다.
※ 프로세스 정보 확인
/proc/self : 현재 사용되고 있는 프로세스 정보
/proc/self/maps : 현재 사용되고 있는 프로세스의 주소맵
실제로 ASLR을 사용하고 안하고의 차이를 확인해보자.
# cat /proc/self/maps | head
처음 실행했을 때와 두번째 실행했을 때 메모리 주소값이 다른 걸 볼 수 있다.
※ ASLR 사용 설정
# vi /proc/sys/kernel/randomize_va_space
0 # ASLR 해제
1 # 랜덤 스택 & 랜덤 라이브러리 설정
2 # 랜덤 스택 & 랜덤 라이브러리 & 랜덤 힙 설정
2. DEP(Data Execution Prevention) / NX(Non-Excutable)
'heap과 stack과 같이 buffer overflow 공격에 이용되는 메모리 공간(스택/힙)에 있는 코드를 실행시키지 않는다.
3. ASCII-Armor
공유 라이브러리 함수(Libc)의 상위 주소에 \x00인 NULL 바이트를 삽입하는 기법이다.
libc라고 하는 공유 라이브러리 내의 함수로 리턴하게 하여 프로그램의 실행흐름을 조작하는 공격인 RTL(Return To Library)을 막기 위해 고안된 방법으로 'strcpy()'와 같은 취약한 함수들은 NULL byte를 만나면 종료되기 때문에 공격을 힘들게 만든다.
→ 공유 라이브러리는 모든 프로세스가 공통적으로 사용하는 라이브러리로 주소값이 변하지 않는다.
정적 라이브러리 : 미리 만들어 놓은 라이브러리 함수의 오브젝트 코드를 ar도구를 이용하여 아카이브로 만들어 놓은 것(확장자 : .a) 정적 라이브러리를 이용하여 실행하면 실행 파일에 라이브러리 함수의 코드가 포함된다. 따라서 프로그램마다 라이브러리 함수의 코드가 따로 포함된다.
동적(공유) 라이브러리 : 운영체제를 포함한 수많은 프로그램들이 참조하는 라이브러리로 항상 실행되어 있어야 하므로 한번 메모리에 올라가 그 주소값이 변하지 않는다. (확장자 : .so)
4. 스택 가드(SG, Stack Guard | SC, Stack Canary)
컴파일러가 프로그램의 함수 호출할 때 ret 앞에 canary(카나리아) 값을 주입하고 종료할 때 canary 값의 변조 여부를 확인하여 버퍼 오버플로우 공격을 탐지한다.
→ Random canary : 프로그램을 실행할 때마다 canary 값을 바꾼다.
→ Null canary : 공격자가 버퍼 오버플로 공격을 시도할 때 NULL 문자열은 해당 값의 종료를 나타낸다. 즉, NULL은 절대로 넣을 수 없다는 것을 이용하여 Canary(0x00000000) 문자열을 포함시킨다.
→ Terminator canary : NULL, CR(Cary Return : 0x0d) , LF(Line Feed : 0x0a), EOF(End Of File : 0xff), -1 등을 조합하여 canary 값을 만든다.
5. 스택 쉴드(SS, Stack Shield)
스택 쉴드는 함수의 리턴 주소를 복사하여 실제 리턴 주소를 참조하지 않고, 복사된 함수의 리턴주소를 사용하는 방식식으로 버퍼 오버플로우 공격을 탐지할 수 있다. 하지만, 스택쉴드의 경우 안전한 장소로 함수의 리턴 주소를 복사하는 과정에서 프로그램의 성능이 다소 떨어질수 있다.
Window 메모리 보호기법
1. ASLR(Address Space Layout Randomization) == Linux의 메모리 기법 ASLR
메모리상의 공격을 어렵게 하기 위해 스택이나 힙, 라이브러리 등의 주소를 무작위로 프로세스 주소 공간에 배치함으로써 실행할 때 마다 데이터의 주소가 바뀌게 하는 기법이다.
2. GS == Linux의 stack canary와 비슷
buffer와 ret에 특정 값을 넣어놓고, 버퍼 오버플로우가 발생시에 이 값이 변조된다. 만약 이 값이 변조가 될시, 세그먼테이션 에러를 발생 시킨 후 프로그램을 종료 시킨다. (visual studio 2003 부터 적용 된다)
※ GS 우회기법 : SEH overwrite(는 일단 카나리 변조로 GS를 발동시킨다음에 리턴되는 지점을 다른 지점으로 덮어 씌우는 기술이다
3. Safe SEH(Safe Structured Exception Handling)
런타임 중의 SEH를 이용한 공격을 방지하기 위한 보안 메커니즘으로 SafeSEH가 적용된 프로그램은 링커가 safe Exception handler table을 하나 만들게 되면서 예외가 발생하면 프로그램은 SEH 체인에 있는 주소가 위의 테이블에 있는지, 해당 주소가 SafeSEH가 적용된 모듈에 속하는지 확인하게 된다. 만약 없다면, 프로그램을 종료하게 된다. 또한 SEH가 스택 주소를 가리키고 있어도 종료된다.
강제로 핸들러 루틴에 들어가게 만들고 핸들러 루틴 처리 부분에 해커가 원하는 동작을 하도록 만들면서 공격한다.
※ SEH : 하드웨어와 소프트웨어의 예외 처리를 위한 윈도우 메커니즘이다.
4. DEP(Data Excution Prevention) == Linux의 메모리 기법 DEP/NX
DEP는 리눅스에서 NX비트와 같다. 스택에 실행권한을 주지 않아 스택 내에서 쉘 코드를 실행할 수 없게 만든다.
https://m.blog.naver.com/sosbaoxbak/221964434155
https://bpsecblog.wordpress.com/2016/05/16/memory_protect_linux_1/
'리버싱 > 기초 개념' 카테고리의 다른 글
[리버싱 기초개념] 에그 쉘 (eggshell) (0) | 2021.11.21 |
---|---|
[리버싱 기초개념] 쉘 코드 만들기 - 경량 쉘 코드 (0) | 2021.11.18 |
[리버싱 기초개념] 공유메모리 (0) | 2021.11.17 |
[리버싱 기초개념] 포맷 스트링 공격 구문 (0) | 2021.11.17 |
[리버싱 기초개념] 버퍼 오버플로우 (0) | 2021.11.16 |