티스토리 뷰
1. 구조적 예외 핸들러 (SEH, Structured Exception Handling)
2. 데이터 실행 방지 (DEP, Data Execution Prevention)
3. Return-to-Library (RTL)
4. 임의의 주소 공간 배치 (ASLR, Address Space Layout Randomization)
5. Return-to-Oriented-Programming (ROP)
1. 구조적 예외 핸들러 (SEH, Structured Exception Handling)
- Windows에서 지원하는 예외 처리 기법
- Windows에서는 메모리 접근 위반이나 0에 의한 나눗셈 같은 예외가 발생했을 때 그 예외를 발생시킨 스레드가 그에 대한 에러 처리를 할 수 있게 해줌
- 기본적으로 예외를 어떻게 처리할 것인지는 운영체제가 결정
- User-mode, Kernel-mode 모두에서 동작함
- C 컴파일러에서는 __try, __except, __finally 키워드로 SEH 사용
- 개발자가 직접 예외 처리를 할 수 있게 하여 프로그램 안정화 및 디버깅이 용이함
(1) SEH가 악용될 수 있는 사례
- jpg, exe 등 어떤 실행파일에 강제적으로 에러가 발생되도록 파일을 변조
- 사용자는 파일을 실행
- Windows에서 발생하는 에러 메시지 대신 악성 코드가 실행됨 (SEH 핸들러의 주소를 조작)
- MS04-028 공격
(2) Windows 예외
- 예외 자체는 Windows에서 이벤트의 하나로 정의됨
- Hardware Exception, Software Exception 두 종류가 존재함
Hardware Exception 발생 | 프로세스가 만들어낸 예외 |
프로그램이 잘못된 주소를 참조하는 경우 | |
0으로 나누기 | |
Software Exception 발생 | 잘못된 핸들을 닫으려 시도하는 경우 |
프로그램이 에러를 보고하기 위해서 예외를 생성할 때 발생 |
(3) Windows에서 예외 처리 과정
- 예외 발생 시 최초로 실행되는 것은 Windows 코드
- CPU는 예외가 발생하면 그때까지 실행하고 있던 처리를 중단
- Windows에서 미리 설정한 주소에 있는 예외 처리용 코드 실행
- Application 안에 들어있는 예외 처리 함수도 호출하는 구조가 필요
- 콜백 함수의 주소를 TIB(Thread Information Block)에 설정
* 콜백 함수 : 어떠한 정보(또는 이벤트)를 관리하는 대상이 자신의 정보가 변경되거나 이벤트가 발생할 때 자신의 변경된 정보나
이벤트에 따른 어떠한 처리를 할 수 있도록 제공하는 함수. 사용자가 호출을 결정할 수 없고 Windows가 호출 시기를 결정
- 실행 중인 스레드의 TIB는 FS레지스터로 접근 가능
(4) EXCEPTION_REGISTRATION_RECORD 구조체
- 예외 처리가 발생하면 Windows에서는 FS레지스터에 저장되어 있는 EXCEPTION_REGISTRATION_RECORD 값을 찾아 에러
핸들러를 호출
- FS:[0]에는 해당 스레드의 EXCEPTION_REGISTRATION_RECORD의 포인터가 저장되어 있어 사용자 지정 에러 핸들러를 찾을 수
있음 (TIB의 최초 4Byte)
- 이 구조체의 핸들러 멤버에 예외 처리용 콜백 함수 포인터를 보관
- 예외 처리가 발생하면 Windows에서 이 정보를 바탕으로 내부에서 콜백함수 호출
(5) pop, pop, ret 명령어
- 로드된 모듈의 주소 범위 밖에서 pop, pop, ret 명령어 블록을 가진 주소를 검색
- ESP+8 지점에 EXCEPTION_REGISTRATION_RECORD 구조를 가리키는 포인터가 존재
- EXCEPTION_REGISTRATION_RECORD 구조체로 실행 흐름을 돌릴 수 있음
- EXCEPTION_REGISTRATION_RECORD 구조로 돌아온 뒤에 shell까지 정상 실행
- findjmp.exe 툴을 사용해 검색 (0x77ECA616)
- 예외 처리가 발생하면 스레드가 동작
(6) SEH 공격 예방 방법
- 운영체제 업그레이드를 잘해야 함
- Windows XP Service Pack 2 이상 사용 권장
- 수상한 실행파일 함부로 열람 금지
- 백신을 100% 신뢰해서도 안되지만 실시간 감시를 권장
- 이상한 파일이 실행되면 언제나 의심
- VEH(Vectored Exception Handling) 사용
2. 데이터 실행 방지 (DEP, Data Execution Prevention)
- 실행 권한이 없는 메모리 영역에서 코드가 실행되지 못하도록 막는 기법
- 데이터 실행 방지 종류
하드웨어 기반 DEP | NX bit(No-eXecute bit)를 이용하여 메모리 페이지를 실행 불가능한 영역으로 설정 |
스택(Stack) 또는 힙(Heap)에 쉘코드 삽입은 가능하나 실행 불가 | |
소프트웨어 기반 DEP | 예외 처리 메커니즘(SEH)을 활용하는 공격 차단 → SafeSEH 구현 |
(1) 하드웨어 기반 DEP
- 하드웨어 기반 DEP 지원 여부 확인
- 방법1 : 제어판 - 시스템 및 보안 - 시스템 - 고급 시스템 설정 - 고급 탭 - 성능 - 설정 클릭 - 데이터 실행 방지(DEP)
- 방법2 : 작업 관리자 - 보기 탭 - 열 선택 - 데이터 실행 방지(DEP) 선택
(2) 시스템 구성에서의 DEP 관리
- Boot.ini 파일의 스위치 또는 BCDedit.exe를 통해 제어
구성 | 설명 |
Optln | Windows 시스템 기본 구성 |
선택한 바이너리만 DEP 적용 | |
해당 옵션 사용시 기본적으로 Windows 시스템 바이너리만 DEP 적용 | |
OptOut | 선택한 바이너리만 DEP 적용 제외 |
AlwaysOn | 모든 프로세스에 항상 DEP 적용 |
AlwaysOff | 모든 프로세스에 항상 DEP 미적용 |
- cmd(관리자 권한) - bcdedit -nx 옵션에서 확인 가능
옵션 변경 : bcdedit/set {current} nx [옵션] (Optln, AlwaysOn 등)
3. Return-to-Library (RTL)
- 라이브러리 내에 있는 함수로 리턴
- DEP로 인해 메모리에서 쉘코드 실행이 막힌 경우 라이브러리 내 함수로 리턴을 시킴으로써 직접 원하는 함수를 호출하는 공격 기법
- DEP 메모리 보호 기법을 우회 가능
- 페이로드 구성
① 입력 값 길이 제한이 없는 gets() 함수 확인
② 메모리에 DEP 적용 → 스택에서 쉘코드 실행 불가
③ 직접 WinExec 함수 호출시키는 페이로드 필요
④ WinExec함수의 첫 번째 매개변수 : "calc"가 저장된 주소 필요
WinExec함수의 두 번째 매개변수 : 1로 구성 → SW_SHOW
4. 임의의 주소 공간 배치 (ASLR, Address Space Layout Randomization)
- 프로세스 실행 시 메모리 주소 공간을 무작위로 배치하는 메모리 보호 기법
- Windows Vista 이후(Kernel 6.x Version)에는 ASLR이 도입되면서 BOF 공격의 난이도 증가
- Image Base, Heap, Stack, PEB(Process Environment Block), TEB(Thread Environment Block)의 주소를 임의로 배치
- 가상 메모리 주소는 변경되지만 물리 메모리 주소는 ASLR의 영향을 받지 않음
- 주소 공간이 무작위로 배치될 경우 쉘코드를 메모리에 입력하더라도 반환시킬 주소를 알 수 없음
- "PE File Format" - NT_HEADER - OPTIONAL_HEADER - Dll Characteristics의 내용으로 확인 가능
5. Return-to-Oriented-Programming (ROP)
- 가젯(Gadget)이라고 부르는 기계어 코드로 리턴
- 공격자가 프로그램 제어 흐름을 하이재킹(Hijacking)하기 위해 사용
- 콜 스택의 제어를 통제하는 기술
- ASLR, DEP 우회 가능
(1) Gadget Chain 구성 기준
- 전체 함수를 사용하는 대신에 명령어의 연속된 작은 덩어리들을 이용
- 명령어 조각은 2개에서 5개 정도의 크기로 선택
- 명령어 조각의 끝은 RET 명령어가 되도록 구성
- 명령어 조각들은 'gadget'으로 서로 연결되어 명령어 덩어리를 형성
- Gadget은 의도된 특정 행동을 수행 (load, store, xor or branch)
- 공격자는 여러 개의 gadget을 조합해 공격의 정교함을 더할 수 있음
(2) ROP Gadget Chain 예시 - 페이로드 구성
- 스택에서 값을 가져와서 EAX에 저장하고, 이 값을 0x80만큼 증가시키는 코드가 필요한 경우
① "POP EAX; RET"를 가리키는 주소를 찾아서 스택에 삽입(가젯1)
② EAX에 반드시 삽입되어야 하는 값은 가젯1 바로 아래에 삽입되어야 함
③ ADD EAX, 80; RET를 가리키는 주소를 찾아 EAX에 삽입되어야 하는 값 바로 밑에 삽입(가젯2)
④ 체인을 발동시키기 위해 첫 번째 가젯(POP EAX; RET)으로 점프
(3) ROP 공격 시 고려 사항
- 사용 가능한 ROP 가젯(Gadget)들이 무엇이 있는지 고려
- ROP 가젯 체인 가능성과 체인의 첫 부분으로 프로그램의 흐름 조작이 가능한지 여부 고려
- 스택 조작 여부 고려
'정보보호' 카테고리의 다른 글
SQL injection (SQLi) - 2 (0) | 2021.09.01 |
---|---|
SQL injection (SQLi) - 1 (0) | 2021.08.31 |
버퍼 오버플로우 (0) | 2021.08.26 |
메모리 구조 (0) | 2021.08.26 |
소프트웨어 취약성 개요 (0) | 2021.08.26 |
- Total
- Today
- Yesterday
- int
- Screen 객체
- c언어
- History 객체
- Char
- 키워드
- DOM
- window 객체
- 리액트 #React #props #state #javascript
- location 객체
- Navigator 객체
- 컴파일
- short
- bom
- keyword
- Browser Object Model
- stdio.h
- gcc
- 자료형
- Document Object Model
- long
- 변수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |