Training 2020 #5-1 ( SEH , EggHunter )
Training 2020 #5 는 SEH 에 대한것과 함께 EggHunter 에 대한 내용 또한 다루고 있는데 이번 포스팅에서는 SEH에 대해서만 다룰 예정이다.
SEH Chain
SEH : Structured Exception Handling 의 약자로, Windows 를 위한 네이티브 예외 처리 메커니즘이다. 각 스레드마다 독립적으로 설치되고 처리된다.
_EXCEPTION_REGISTRATION_RECORD는 __try 문의 중첩 정도에 따라 그림과 같은 링크드 리스트 구조를 갖고 스택에 할당된다.
- 먼저 pExceptionHandler 함수가 호출된다.
- 해당 핸들러에서 익셉션을 처리하지 못할 경우 pNextSEHRecord를 참조하여 다음 핸들러를 호출한다.
- 이를 계속 반복한다.
- pNextSEHRecord에 0xFFFFFFFF가 할당되어 있는 디폴트 핸들러인 UnhandledExceptionHandler까지 도달할 경우 해당 익셉션을 커널로 넘겨 프로세스를 재개하거나 종료시킨다.
SEH OVERWRITE ( WINDOWS ) 개념
Stack guard ( SG ), Stack shield ( SS ), Stack cookie, canary, 보안검사 등 여러가지 이름으로 불리는 방어기법을 우회하기 위한 방법
- Stack cookie ( Canary ) : 스택에 Cookie ( Canary ) 라고 불리는, 랜덤한 데이터를 저장해 둔다. ret 하기 전에 넣어둔 Cookie ( Canary ) 가 변조됐는지 확인한다. 변조됐다면 공격을 감지하고 에러 메시지를 출력한다.
SEH overwrite는 Cookie와 Return address를 넘어, 등록해 둔 SEH 데이터를 예외 핸들러와 Next SEH Record 포인터를 바꾸는 공격방식이다.
- Next SEH Record에는 셸 코드로 점프하는 코드를, 예외 핸들러는 POP POP RET 코드가 있는 주소를 써 준다.
- 이 상태로 예외를 발생시키면, POP POP RET 코드가 실행되고, RET 코드를 통해 Next SEH Record의 주소에 있는 점프 코드를 실행한다. 점프 코드를 실행하면 셸 코드에 도달한다.
실습
우선 reader_seh.exe 내부에서 pop pop ret 가젯을 찾아보도록 하자. 그리고 주소를 기억해두자.
그리고 저 값을 쉘코드의 SEH 값으로 주고 NSEH에는 dummy값 ( 여기서는 좀 더 수월하게 진행하기 위해 nop 를 끼워둠 )2byte와 jmp 6 코드를 넣어주도록 하자. 그럼 위에서 설명한 과정을 거쳐 우리가 설정해둔 메세지 박스가 실행될 것이다.