2018. 1. 9. 02:51ㆍ0x04 pwnable/윈도우즈 어플리케이션 취약점 분석
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 |