홈 > IT > IT정보
IT정보

SEH Overwrite 기초 개념 정리

2 realdragonhead 0 485 1 0

SEH Overwrite 개념 정리 


SEH(Structured Exception Handler)

SEH는 Structured Exception Handler 의 약자로서, 기존 버퍼 오버플로우 취약점과 같은 문제점을 개선하기 위한 방안이다.

개념으로는 버퍼 오버플로우가 일어날 수 있는 buffer 다음 공간을 스택 쿠키(Stack Cookie)라고 부르는 임의의 값을 채워넣고

함수의 에필로그에서 검사하여, 이 값이 변경이되면 예외처리 루틴을 실행시켜 예외처리(Exception Handler)로 종료시킨다.

예외처리 루틴은 아래와 같다.

fa4030a265675d0931fafb790bb27801_1523512045_7943.png

SEH 스택으로 넘어가면 pointer to exception handler에서 발생한 예외를 처리하기 위한 handler 에 맞지 않는 다음으로 넘어가는 형식으로 예외처리가 이루어지는데, 예외처리가 마지막까지 이루어지지 않는다면, 커널에 넘기고 예외처리 루틴도 종료가 된다.

하지만 이 방식도 nseh 가 있는 부분까지 버퍼를 뒤집어써버리고, 예외처리 핸들러를 가르키는 부분을 쉘코드가 들어있는 주소를 삽입하여, 예외처리를 쉘코드로 반환하게 만들어 버리면 무용지물이여서, 옛날 윈도우에서 쓰던 방식이다.


그래서 도입한게 Safe SEH 인데 exception handler 를 가르키는 주소가 스택인지 확인하고, 스택범위일 경우 호출하지 않는다. 또 모든 모듈의 핸들러 주소가 저장된 PE 헤더의 Load Configuration Directory 의 값이 핸들러 주소 목록 중에 없을 경우에도 호출하지 않는 방식이다.


하지만 위 방식도 취약점이 존재하는데, 모듈 중 SafeSEH 가 적용되지 않는 모듈을 컴파일하면 SafeSEH 가 적용이 되지 않는다는 것이다.

그래서 SEH 스택 전까지 쓰레기값으로 채우고 nseh 에는 \xeb\x06(short jmp) + 쓰레기값(2byte) 를 채워넣고, seh에는 SafeSEH가 적용이 되지 않은 모듈의 ppr 부분의 주소값을 채워넣는다. 그러면 그럼 버퍼 이후 스택 쿠키가 변조되었으므로, 예외처리루틴으로 갈 것이고, seh로 들어가는데, 그곳에는 safeseh가 적용되지 않은 ppr이 존재하고, safeseh 적용을 받지않는 ppr 이 실행되어 ESP+8 부분으로 이동하여 실행이 되는데 그곳에 nseh 가 존재한다. 그럼 nseh 가 실행되어 그곳에 저장된 \xeb\x06 가 실행되는데 short jmp 란 6바이트를 점프하여 이동한다. 즉 쓰레기값 2바이트를 넘고 seh가 4바이트이므로, 결국 seh 다음에 존재하는 메모리 부분을 실행하는데, 그곳에 쉘코드를 덮어 저장해 두었다면 점프하여 쉘코드가 실행이 된다. 


이미지에 2byte, 4byte 라고 표기했는데 4byte, 8byte 로 표기해야 되는데 그리는 과정에서 실수 한것 같습니다.

,

0 Comments
Category
State
  • 현재 접속자 42 명
  • 오늘 방문자 228 명
  • 어제 방문자 721 명
  • 최대 방문자 948 명
  • 전체 방문자 127,475 명
  • 전체 게시물 1,618 개
  • 전체 댓글수 244 개
  • 전체 회원수 107 명
Facebook Twitter GooglePlus KakaoStory NaverBand