티스토리 뷰

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 구조

 

(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)

- 예외 처리가 발생하면 스레드가 동작

 

[그림 2] pop-pop-ret

 

(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)

[그림 3] 하드웨어 기반 DEP - 방법1

 

- 방법2 : 작업 관리자 - 보기 탭 - 열 선택 - 데이터 실행 방지(DEP) 선택

[그림 4] 하드웨어 기반 DEP - 방법2

 

(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 등)

 

[그림 5] cmd(관리자 권한)에서 bcdedit 도움말 참조

 

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
«   2024/09   »
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
글 보관함