Training 2020 #5-1 ( SEH , EggHunter )

Training 2020 #5 는 SEH 에 대한것과 함께 EggHunter 에 대한 내용 또한 다루고 있는데 이번 포스팅에서는 SEH에 대해서만 다룰 예정이다.


SEH Chain

SEH : Structured Exception Handling 의 약자로, Windows 를 위한 네이티브 예외 처리 메커니즘이다. 각 스레드마다 독립적으로 설치되고 처리된다.

image

_EXCEPTION_REGISTRATION_RECORD는 __try 문의 중첩 정도에 따라 그림과 같은 링크드 리스트 구조를 갖고 스택에 할당된다.

  1. 먼저 pExceptionHandler 함수가 호출된다.
  2. 해당 핸들러에서 익셉션을 처리하지 못할 경우 pNextSEHRecord를 참조하여 다음 핸들러를 호출한다.
  3. 이를 계속 반복한다.
  4. pNextSEHRecord에 0xFFFFFFFF가 할당되어 있는 디폴트 핸들러인 UnhandledExceptionHandler까지 도달할 경우 해당 익셉션을 커널로 넘겨 프로세스를 재개하거나 종료시킨다.

SEH OVERWRITE ( WINDOWS ) 개념

  • Stack guard ( SG ), Stack shield ( SS ), Stack cookie, canary, 보안검사 등 여러가지 이름으로 불리는 방어기법을 우회하기 위한 방법

    • Stack cookie ( Canary ) : 스택에 Cookie ( Canary ) 라고 불리는, 랜덤한 데이터를 저장해 둔다. ret 하기 전에 넣어둔 Cookie ( Canary ) 가 변조됐는지 확인한다. 변조됐다면 공격을 감지하고 에러 메시지를 출력한다.
    • image
  • SEH overwrite는 Cookie와 Return address를 넘어, 등록해 둔 SEH 데이터를 예외 핸들러와 Next SEH Record 포인터를 바꾸는 공격방식이다.

    • Next SEH Record에는 셸 코드로 점프하는 코드를, 예외 핸들러는 POP POP RET 코드가 있는 주소를 써 준다.
    • 이 상태로 예외를 발생시키면, POP POP RET 코드가 실행되고, RET 코드를 통해 Next SEH Record의 주소에 있는 점프 코드를 실행한다. 점프 코드를 실행하면 셸 코드에 도달한다.
    • image

실습

image

우선 reader_seh.exe 내부에서 pop pop ret 가젯을 찾아보도록 하자. 그리고 주소를 기억해두자.

image

그리고 저 값을 쉘코드의 SEH 값으로 주고 NSEH에는 dummy값 ( 여기서는 좀 더 수월하게 진행하기 위해 nop 를 끼워둠 )2byte와 jmp 6 코드를 넣어주도록 하자. 그럼 위에서 설명한 과정을 거쳐 우리가 설정해둔 메세지 박스가 실행될 것이다.

image