본문 바로가기

My Study/Reversing

TEB안의 SEH를 알아보자.

Defcon 2009 윈도우 바이너리 문제를 보던 중 진짜 나의 실력이 어느정도인지 가늠해 볼 수 있었습니다.
코드를 진득하게 추적하는 능력이 부족하고, 그리고 조금 난독화된 코드들을 접해보아 많이 당황했습니다.
역시 Defcon.. 그리고 FS:[0] 이러한 루틴이 시작되면 지레 겁부터 먹는 나를 발견하게 되었습니다.

일단 제목에 맞게 글을 써야겠네요.
인터넷 찾으면 나오는지 안나오는지 모르겠지만 
일단 찾아보기 전에 스스로 알아보았기 때문에 제 생각한 대로 작성하겠습니다.
=========================================================================
TEB는 다들 아실 것입니다.
Thread Environment Block의 약자로 스레드에 대한 정보를 담고있는 구조체 입니다.
여기서 TEB구조체의 구조를 잠깐 봐보겠습니다.
많은 구조체 멤버들이 있습니다. FS:[0x30] 에는 PEB구조체 포인터도 보입니다.

여기서 알아볼 멤버는 FS:[0x0] 인 TEB의 첫번째 멤버입니다.
맨날 안티디버깅만 보다보면 PEB구조체 등등 이런것만 봐왔는데 정작 FS:[0x0]은 뭔지 모르겠더군요.
첫번째 멤버는 _NT_TIB구조체 멤버입니다.
그러면 _NT_TIB구조체의 구조를 보도록 하겠습니다.
첫번째 인자는 ExceptionList입니다.
이제 올디에서 봐볼건데 그냥 간단하게 ExceptionList 멤버에 대해서만 보도록 하겠습니다.

그리고 offset 0x18자리엔 Self멤버가 있는데 이 멤버는 TEB구조체를 가리키고 있습니다.
즉, fs:[0x0] == fs:[0x18] 입니다.

올디에서 일단 봐보겠습니다.

빨간색 네모친 부분이 TEB의 첫번째 멤버입니다. 옆에 Comment를 보니 Pointer to SEH chain이라고 나왔군요.
예외처리 체인의 포인터랍니다. 그러면 저 주소를 따라가면 예외관련 정보가 나오는가 봅니다.
한번 따라가 보았습니다.

옆의 코멘트가 전부 답을 주고 있습니다. 올디는 나의 선생님? ^^;
따라가보니 첫번째 인자는 다음 예외처리를 가리키고 있고 두번째 인자는 예외가 났을 때 가게되는 주소가 있습니다.
그러면 첫번째 인자를 따라 끝까지 가보겠습니다.

마지막 예외처리 부분입니다. 그 다음 예외가 없으므로 아무것도 가리키고 있지 않습니다. ( 0xFFFFFFFF )

그러면 위 정보를 토대로 깔끔하게 그림으로 보시겠습니다.

아무튼 그림을 보시는거와 같이 구조가 되어있습니다.
분석할 땐 이렇게 볼 필요가 있더군요. 
이 구조를 모르는 상황에서 분석을 하려니 쫌 막히는 부분이 있어서 이렇게 정리를 해보았습니다.
만약 예외가 발생했을 때 예외처리 루틴으로 가게된다면 첫번째 예외부터 실행되고 두번째 예외가 실행되면 두번째 예외처리 루틴이 실행되게 됩니다. 
( 디버거 상에서 예외처리 루틴으로 가기 위해서는 ~~ Shift + F7,8,9로 가야겠죠?
   그렇지 않으면 디버거가 자체적으로 예외처리를 해버릴 것입니다... 아.. 하하? )

그리고 그냥 어떠한 예외처리 루틴들이 있는지 볼 때는 이렇게 보시지 마시고..~!



이렇게 View에서 SEH chain을 누르셔서 보시면 됩니다.

이제 이렇게 알아보았으니 실전에선 어떠한 코드로 나오는지 봐보도록 하겠습니다.
코드를 그냥 찾아보다가 못찾겠어서 간단하게 예외처리를 추가시키는 코드를 짜보았습니다.
그냥 __try, __except를 사용하면 구현이 끝납니다..

어셈코드를 보시겠습니다.

VS에서 옵션 뺄꺼 다 빼니까 간단하게 나와서 좋았습니다 ^^;

일단 코드 길이는 4줄 밖에 되지 않습니다. 위 코드를 분석해보도록 하겠습니다.
먼저 첫번째 줄부터 보시면
PUSH 0x004098EC를 하고 있습니다. 스택 가장 위쪽에 있겠군요.
그리고 FS:[0x0]을 EAX 레지스터에 넣고있습니다. FS:[0x0]은 첫번째 예외처리 구조체의 주소를 가지고 있습니다.
그 값을 또 PUSH하고 있습니다. 
두 개의 값이 PUSH가 됬고 그 마지막으로 PUSH된 스택의 주소를 FS:[0x0]에 넣고 있습니다.
그러면 저 4개의 명령어를 실행 후 스택의 상태를 그림으로 보시겠습니다.

( 주소를 쓰기 번거로워서 그냥 알파벳으로 썼습니다. )
그림에 대해 약간 설명을 해보면 원래 TEB 첫번째 멤버는 B를 가리키고 있었습니다.
하지만 저 4줄을 실행시킨 후에는 위 그림처럼 하나의 예외처리가 더 늘어난 것입니다.
저기서 A값은 ESP값이 되겠습니다.

예외처리 루틴이 추가될 땐 위와같은 코드로 추가가 되게됩니다~!

'My Study > Reversing' 카테고리의 다른 글

Hand-Ray 연습..!!  (2) 2010.06.05
OF, CF, SF를 알아보자  (6) 2010.06.03
Software Breakpoint Detection  (2) 2010.05.18
DLL 파일 EXE로 바꿔서 실행 시키기  (5) 2010.05.11
DeleteFiber을 사용한 안티디버깅 기법  (4) 2010.05.10