GS 기초 공부 1

2018. 1. 9. 02:510x04 pwnable/윈도우즈 어플리케이션 취약점 분석

728x90

GS


Guard Stack 

: Stack의 저장한 RET가 변조 여부를 감지하기 위해 임의의 값을 Stack 보다 윗 부분에 삽입 

=> 그 임의의 값이 덮여지게 되면 예외처리 루틴을 통해 프로그램이 즉시 종료가 된다.


GS Cookie라고도 한다.


Visual Studio에서 GS 활성화 하면 다음과 같은 어셈을 볼 수 있다.


00401002  in          al,dx 

00401003  sub         esp,80h 

00401009  mov         eax,dword ptr [___security_cookie (403000h)] 

0040100E  xor         eax,ebp 

00401010  mov         dword ptr [ebp-4],eax 


예외처리 루틴이 Stack에 존재하는 경우가 SEH이다.


우리는 SEH를 공략해서 우회를 시도한다.


Structured Exception Handling

얘도 리턴 값을 가지고 있다고 한다.


SEH에 ShellCode 주소를 넣으면 우회를 할 수 있다.


하지만, SEH Safe도 우회를 해야한다. 

XP SP(Service Pack)1부터 적용이 되어있다.


SEH 한번 더 언급


예외처리를 위한 핸들링 구조체 

쌍을 이루고 있다. 

어플리케이션에서 예외를 처리하는 경우 / OS에서 예외를 처리하는 경우 

SEH 구조체는 스택에 위치하기 때문에 BOF 공격에 취약하다.


예외적 발생 : 0xCC, 양수를 0으로 나눔, 가상머신에서 할당되지 않은 영역을 불러올 때 

                                             (커널에 유저가 접근하려고 하거나 (ring 0에 접근))


체인 핸들러의 끝은 0xFFFFFFFF이다. 그리고 체인은 한 쌍을 이룬다.


실습. NOTEPAD


Ollydbg -> View -> SEH Chain


//

SEH chain of main thread, item 0

 Address=0007FFB0

 SE handler=NOTEPAD.010075BA


SEH chain of main thread

Address    SE handler

0007FFB0   NOTEPAD.010075BA

0007FFE0   kernel32.7C839B48


//

SEH chain of main thread, item 1

 Address=0007FFE0

 SE handler=kernel32.7C839B48


SEH chain of main thread

Address    SE handler

0007FFB0   NOTEPAD.010075BA

0007FFE0   kernel32.7C839B48



스택에서 확인

0007FFB0 


0007FFB0  |0007FFE0  Pointer to next SEH record

0007FFB4  |010075BA  SE handler

0007FFB8  |01001898  NOTEPAD.01001898

0007FFBC  |00000000

0007FFC0  \0007FFF0


r fs(INTEL Register) 

: fs 레지스터 값 출력 


dg 3b

: display Selector

show the segment descriptor for the specified selector.


dt 7ffdf000 _TEB

: 심볼과 함께 덤프로 출력 



fs 레지스터를 통해 TEB를 찾을 수 있다. 


fs -> TEB를 가리킴 -> NT TIB를 가리킴 -> SEH Handler의 주소 정보를 가리킴


실습 windbg


File -> Symbol File Path 

: src "http://msdl.microsoft.com/download/symbols

심볼을 설정하는 이유는 windbg에 윈도우 구조체에 대한 정보가 없기 때문이다.


File -> Open Executable -> notepad.exe


r fs  #register fs 


0:000> r fs

fs=0000003b


dg 3b #fs가 어디를 가리키는지 볼 수 있다.


0:000> dg 3b

                                  P Si Gr Pr Lo

Sel    Base     Limit     Type    l ze an es ng Flags

---- -------- -------- ---------- - -- -- -- -- --------

003B 7ffdf000 00000fff Data RW Ac 3 Bg By P  Nl 000004f3

       -->fs가 가리키고 있는 것 


dt 7ffdf000 _TEB  #해당 주소를 테이블 형식으로 DISPLAY


지금은 symbol file 에러가 발생했다. 강의자는 발생안하던데 음.. 



0:000> dt 7ffdf000 _TEB

ntdll!_TEB

   +0x000 NtTib            : _NT_TIB     # 7ffd7000 

   +0x01c EnvironmentPointer : (null) 

   +0x020 ClientId         : _CLIENT_ID

   +0x028 ActiveRpcHandle  : (null) 

   +0x02c ThreadLocalStoragePointer : (null) 

   +0x030 ProcessEnvironmentBlock : 0x7ffd5000 _PEB

   +0x034 LastErrorValue   : 0

   +0x038 CountOfOwnedCriticalSections : 0

   +0x03c CsrClientThread  : (null) 

   +0x040 Win32ThreadInfo  : (null) 

   +0x044 User32Reserved   : [26] 0

   +0x0ac UserReserved     : [5] 0

   +0x0c0 WOW32Reserved    : (null) 

   +0x0c4 CurrentLocale    : 0x409

   +0x0c8 FpSoftwareStatusRegister : 0

   +0x0cc SystemReserved1  : [54] (null) 

   +0x1a4 ExceptionCode    : 0n0

   +0x1a8 ActivationContextStack : _ACTIVATION_CONTEXT_STACK

   +0x1bc SpareBytes1      : [24]  ""

   +0x1d4 GdiTebBatch      : _GDI_TEB_BATCH

   +0x6b4 RealClientId     : _CLIENT_ID

   +0x6bc GdiCachedProcessHandle : (null) 

   +0x6c0 GdiClientPID     : 0

   +0x6c4 GdiClientTID     : 0

   +0x6c8 GdiThreadLocalInfo : (null) 

   +0x6cc Win32ClientInfo  : [62] 0

   +0x7c4 glDispatchTable  : [233] (null) 

   +0xb68 glReserved1      : [29] 0

   +0xbdc glReserved2      : (null) 

   +0xbe0 glSectionInfo    : (null) 

   +0xbe4 glSection        : (null) 

   +0xbe8 glTable          : (null) 

   +0xbec glCurrentRC      : (null) 

   +0xbf0 glContext        : (null) 

   +0xbf4 LastStatusValue  : 0

   +0xbf8 StaticUnicodeString : _UNICODE_STRING "USER32.dll"

   +0xc00 StaticUnicodeBuffer : [261] 0x55

   +0xe0c DeallocationStack : 0x00040000 Void

   +0xe10 TlsSlots         : [64] (null) 

   +0xf10 TlsLinks         : _LIST_ENTRY [ 0x0 - 0x0 ]

   +0xf18 Vdm              : (null) 

   +0xf1c ReservedForNtRpc : (null) 

   +0xf20 DbgSsReserved    : [2] (null) 

   +0xf28 HardErrorsAreDisabled : 0

   +0xf2c Instrumentation  : [16] (null) 

   +0xf6c WinSockData      : (null) 

   +0xf70 GdiBatchCount    : 0

   +0xf74 InDbgPrint       : 0 ''

   +0xf75 FreeStackOnTermination : 0 ''

   +0xf76 HasFiberData     : 0 ''

   +0xf77 IdealProcessor   : 0 ''

   +0xf78 Spare3           : 0

   +0xf7c ReservedForPerf  : (null) 

   +0xf80 ReservedForOle   : (null) 

   +0xf84 WaitingOnLoaderLock : 0

   +0xf88 Wx86Thread       : _Wx86ThreadState

   +0xf94 TlsExpansionSlots : (null) 

   +0xf98 ImpersonationLocale : 0

   +0xf9c IsImpersonating  : 0

   +0xfa0 NlsCache         : (null) 

   +0xfa4 pShimData        : (null) 

   +0xfa8 HeapVirtualAffinity : 0

   +0xfac CurrentTransactionHandle : (null) 

   +0xfb0 ActiveFrame      : (null) 

   +0xfb4 SafeThunkCall    : 0 ''

   +0xfb5 BooleanSpare     : [3]  ""



WINDBG 심볼 패스 설정법을 구글링으로 알아내었다.


File - Symbol File Path에 내가 아까 잘못 기입했었다. 

src가 아니고 SRV였고 "아니고 *였다. ㅎㅎ


SRV*c:\symbols*http://msdl.microsoft.com/download/symbols


그리고 친구 말로는 symbols디렉터리도 있어야 한다 했다.


그 후 콘솔에 .reload


명령어:

dt 7ffdf000 _NT_TIB


0:000> dt 7ffdf000 _NT_TIB

ntdll!_NT_TIB

   +0x000 ExceptionList    : 0x0007fd0c _EXCEPTION_REGISTRATION_RECORD

   +0x004 StackBase        : 0x00080000 Void

   +0x008 StackLimit       : 0x0006f000 Void

   +0x00c SubSystemTib     : (null) 

   +0x010 FiberData        : 0x00001e00 Void

   +0x010 Version          : 0x1e00

   +0x014 ArbitraryUserPointer : (null) 

   +0x018 Self             : 0x7ffdf000 _NT_TIB


 

: fs를 통해 TEB를 들어가면 _NT_TIB가 존재를 하고(0 byte offset)

_NT_TIB의 바로 첫 OFFSET에 ExceptionList라는 심볼이 존재한다.


결국 fs를 호출하면 SEH Handler가 나온다. 

(전부다 0 offset이기 때문이라고 한다)

fs[0] : SEH Handler


'0x04 pwnable > 윈도우즈 어플리케이션 취약점 분석' 카테고리의 다른 글

SEH Handler 공부  (0) 2018.01.09
SEH 기초공부 1  (0) 2018.01.09
BOF 기초공부 4  (1) 2018.01.09
BOF 기초공부중 3  (0) 2018.01.09
BOF 기초공부 중 2  (0) 2018.01.09