본문 바로가기

System Security/Theory

Chapter 7. BOF(Buffer OverFlow) III

Chapter 7. BOF(Buffer OverFlow) III
1. Security Cookie

 - Stack에 할당된 Buffer 영역과 SFP 영역 사이에 존재하는 임의의 값으로 RET 공격을 방어하기위해 나온 기술이다.
 - BOF 공격을 하면 RET 영역을 조작하기위해 Buffer 영역, Security Cookie, SFP 덮어쓰게 되며 기존의 Security Cookie 값과 현재 실행 중인 Program의 Security Cookie 값을 비교해 Security Cookie 값이 변경된 것을 확인하게 되면 BOF 공격을 감지하게 된다.
 - Windows 운영체제에서 Visual Studio 7.0(2003) Version 이후부터 적용한 기술이다.
 - Compile 시 /GS Option을 사용하면 적용되며 Default Option으로 적용되어 있기 때문에 개발자가 의도적으로 수정하지 않는 경우에는 기술이 적용된다.
 - Security Cookie를 우회하기 위한 방법으로 'SEH'를 이용하는 방법이 있다.

 

2. SEH(Structured Exception Handling)
 - Windows 운영체제에서 지원하는 예외처리 기법
 - Program의 실행 중에 예외 상황이 발생했을 때 SEH에 의해 해당 예외가 처리되는 방식이다.
 - Windows 운영체제에서는 Exception 자체를 Event 내에서 정의되어 있다.

 - Exception 종류
  · Hardware Exception
  ◦ Program이 잘못된 주소를 참조하는 경우 발생하는 예외
  · Software Exception
  ◦ 잘못된 Handle을 닫으려 시도하는 경우 발생하는 예외
 - UNIX 계열의 Signal을 사용하는 것과 유사하다.
 - Exception 종류
  · EXCEPTION_ACCESS_VIOLATION
  ◦ 존재하지 않거나 접근 권한이 없는 Memory 영역에 대해 접근을 시도할 경우 발생하는 예외
  · EXCEPTION_BREAKPOINT
  ◦ 실행 Code에 BP를 설치하면 CPU가 그 메모리 주소를 실행하려 할 때 발생하는 예외
  · EXCEPTION_ILLEGAL_INSTRUCTION
  ◦ CPU가 해석할 수 없는 Instruction을 만날 때 발생하는 예외
  ◦ 즉, 정의된 Instruction이 아닌 경우 발생
  · EXCEPTION_INT_DIVIDE_BY_ZERO
  ◦ 0으로 나누는 경우 발생하는 예외
  · EXCEPTION_SINGLE_STEP
  ◦ 명령어 하나를 실행하고 멈추는 것
  ◦ CPU가 Single Step 모드로 전환되면 명령어 하나를 실행 하고 해당 예외를 발생시켜 실행을 멈춤
  ◦ EFLAGS Register의 TF Bit를 1로 Setting

 

3. Security Cookie 우회(SEH OverWrite)
 - Security Cookie 때문에 실행할 수 없게 된 RET 공격을 SEH를 이용해 예외를 발생시켜 우회해 공격하는 방법으로 Buffer Overflow 공격의 일종이다.
 - 공격 단계
  · 입력 값이 Program에 할당된 Stack 영역을 벗어나게 되어 입력을 할 경우 할당되지 않은 Memory 공간에 값을 입력
  · EXCEPTION_ACCESS_VIOLATION 예외가 발생되어 예외처리기가 실행
  · 예외처리기가 있는 Handler 주소를 Stack에 있는 Shell Code의 주소로 조작
  · 예외를 발생시켜 공격자가 의도한 Shell Code를 실행
 - SEH OverWrite의 예
  · 사용 Program
  ◦ Text Transform
  ◦ A-PDF All to MP3 Convert
  ◦ HxD
  ◦ OllyDbg 1.1
  · Payload(요구 값) 구하기
  ◦ Text Transform

   ▹ 종류에서 'Pattern'을 선택해 Pattern 생성한다.
   ▹ 'Input'에 숫자 값을 입력하면 Byte 크기로 Pattern이 생성된다.

   ▹ 임의의 값을 5000으로 설정 후 Create로 5000Byte만큼의 Pattern을 생성한다.
   ▹ 생성한 Pattern을 복사해 'HxD'에 복사해 확장자 'wav' 형태의 File로 저장한다.
  ◦ 'A-PDF All to MP3'에 생성한 File Test

   ▹ 'Try'를 선택한다.

   ▹ 'Batch Convert Mode'를 선택 후 Next를 선택한다.

   ▹ 'Text Transfrom' 'HxD'를 이용해 생성한 File을 해당 화면으로 Drag한다.

   ▹ Error가 발생해 종료되는 것을 알 수 있으며 접근 권한이 없는 Memory 영역에 대해 접근을 시도 했기 때문에 Program이 종료된다.
  ◦ 'A-PDF All to MP3' Payload 값 구하기
   ▹ Program을 OllyDbg로 Debug

    ▸  'A-PDF All to MP3'를 실행시킨 후 'Next'를 선택하지 않은 상태로 놓고 OllyDbg를 실행시킨다.

    ▸  'File'의 'Attach'를 선택

    ▸  Program을 Debug할 수 있도록 OllyDbg에 'A-PDF All to MP3'의 Process를 붙인다(Attach).

    ▸  해당 Program을 붙이고 나면 붙인 시점을 기준으로 Break Point가 설정되어 Program이 정지된다.
    ▸  'Debug' 'Run'(F9)을 선택해 실행한다.

    ▸  'Text Transfrom'과 'HxD'를 이용해 생성한 File을 해당 화면으로 Drag한다.

    ▸  해당 Program Buffer 영역의 끝 주소와 시작 주소를 뺀다.

    ▸  0012F964 - 0012E944 = 1024 → 10진수 : 4132Byte
    ▸  즉 SEH에 도달하기위해 필요한 Payload은 4132Byte가 된다.
    ▸  Payload 값 내에 Shell Code를 삽입하고 Payload 값 직후 Memory 영역(Pointer to next SEH record)을 Buffer 영역으로 조작하면 Shell Code를 실행할 수 있다.
   ▹ Pointer to next SEH record 주소값 찾기
    ▸  해당 Program을 몇 번 실행해보면 겹치는 주소영역이 생긴다.
    ▸  같은 Program은 항상 같은 Memory 영역에 할당되리란 보장은 없지만 비슷한 영역에 할당되어 실행된다는 특징을 이용한다.
    ▸  Payload 영역 탐색
     ▫  첫 번째 실행 시 Payload 영역
      ▪  0012E944 ~ 0012F968 
     ▫  두 번째 실행 시 Payload 영역
      ▪  0012E93C ~ 0012F960
     ▫  세 번째 실행 시 Payload 영역
      ▪  0012E964 ~ 0012F988
    ▸  대략적인 Payload 시작 주소 : 0012EA00
    ▸  0012E900부터 0012EA00 사이에서 시작하기 때문에 0012EA00을 시작주소로 잡는다.
   ▹ HxD로 File 생성
    ▸  BOF 공격 방법
     ▫  Payload 영역 내에 Shell Code를 삽입해 'Pointer to next SEH record' 조작
     ▫  'JMP ESP'를 이용해 Shell Code 실행
    ▸  Payload 영역 내에 Shell Code를 삽입해 'Pointer to next SEH record' 조작 : cmd

     ▫  앞서 구한 Payload만큼의 내용에서 4를 뺀 1020Byte만큼을 90(NOP : No Operate)로 채운다.

     ▫  나머지 1024Byte의 4Byte를 'Little Endian' 형식으로 Return 하고자하는 주소로 채워 넣는다.
     ▫  일반 형식 : 00 12 EA 00 → Little Endian 00 EA 12 00

     ▫  중하단 부분에 Shell Code를 '붙여넣기 쓰기'로 삽입한다.

     ▫  '다른 이름으로 저장'으로 모든 형식의 'wav' File로 저장한다.

     ▫  생성한 Exploit File을 삽입한다.

     ▫  실행을 확인한다.
    ▸  'JMP ESP'를 이용해 Shell Code 실행 : 계산기(calc.exe)

     ▫  'A-PDF All to MP3' 실행 시 발생하는 'JMP ESP' 즉 'FF E4'를 찾아본다.
     ▫  찾아보면 위와 같이 많은 'JMP ESP'를 찾을 수 있는데 현재 Program의 'JMP ESP' 'KERNEL32.DLL' 'JMP ESP'를 사용하는 것이 가장 안정적이다.
     ▫  여기서는 해당 Program 내의 'JMP ESP'(0043C8D1)를 이용한다.

     ▫  'Text Transform' Program으로 1020Byte만큼의 문자열 Pattern을 생성해 'HxD'의 새 문서에 붙여 넣는다.

     ▫  'Little Endian' 형식으로 Return 하고자하는 주소로 채워 넣는다.
     ▫  일반 형식 : 00 43 C8 D1  Little Endian D1 43 C8 00

     ▫  'JMP ESP' 직후에 실행하고자 하는 Shell Code를 삽입한다.

       ▫  생성한 Exploit File을 삽입한다.


       ▫  실행을 확인한다.
      ▸  'JMP ESP'를 이용해 Shell Code 실행 : MessageBox

       ▫  'A-PDF All to MP3' 실행 시 발생하는 'JMP ESP' 즉 'FF E4'를 찾아본다.
       ▫  찾아보면 위와 같이 많은 'JMP ESP'를 찾을 수 있는데 현재 Program의 'JMP ESP' 'KERNEL32.DLL' 'JMP ESP'를 사용하는 것이 가장 안정적이다.
       ▫  여기서는 'KERNEL32.DLL'의 'JMP ESP'(0043C8D1)를 이용한다.

       ▫  'Text Transform' Program으로 1020Byte만큼의 문자열 Pattern을 생성해 'HxD'의 새 문서에 붙여 넣는다.

       ▫  'Little Endian' 형식으로 Return 하고자하는 주소로 채워 넣는다.
       ▫  일반 형식 : 7C 86 46 7B → Little Endian : 7B 46 86 7C

       ▫  'JMP ESP' 직후에 실행하고자 하는 Shell Code를 삽입한다.

       ▫  생성한 Exploit File을 삽입한다.

       ▫  실행을 확인한다.

'System Security > Theory' 카테고리의 다른 글

Chapter 10. Race Condition Attack  (0) 2015.08.18
Chapter 9. 취약점 분석  (0) 2015.08.18
Chapter 6. BOF(Buffer OverFlow) II  (0) 2015.08.18
Chapter 5. BOF(Buffer OverFlow) I  (0) 2015.08.18
Chapter 4. Malware II  (0) 2015.08.18