CRT 뽀개기 신영진
누규? 신영진 codewiz, codewiz@gmail.com @codemaru http://www.jiniya.net Microsoft Visual C++ MVP 월간 마이크로소프트웨어 필자 ㈜웰비아닷컴 게임보안 제품 개발
핵심 주제 멀티스레드 CRT 버퍼 보안 검사 전역 변수 초기화
CRT 일반론
CRT가 먼가요? C/C++ Runtime Library C/C++ 표준 함수들을 포함하고 있는 라이브러리
CRT도 종류가 있다? 디버그와 릴리즈 멀티스레드와 싱글스레드(2005부터 삭제됨) 정적 라이브러리와 동적 라이브러리
디버그 vs 릴리즈 DllMain(instance, reason, lpReserved) Release 모드에서 lpReserved를 건드리면 쪼다 된다는거
멀티스레드 vs 싱글스레드
멀티스레드 버전은?
_getptd
__flsindex는 어디서 왔는가? _mainCRTStartup => mtinit
tiddata
그래서 결론은?
ptd 1번 스레드 2번 스레드 ptd 3번 스레드 ptd
정적 vs 동적 라이브러리 EXE EXE CRT DLL DLL CRT DLL CRT
CRT 종류 이름 설명 Libc.lib 정적, 싱글스레드, 릴리즈 Libcd.lib 정적, 싱글스레드, 디버그 Libcmt.lib 정적, 멀티스레드, 릴리즈 Libcmtd.lib 정적, 멀티스레드, 디버그 Msvcrt.lib 동적, 멀티스레드, 릴리즈 Msvcrtd.lib 동적, 멀티스레드, 디버그
CRT 설정하기
라이브러리 충돌 EXE CRT a.lib CRT DLL
해결방법
CRT가 하는 일? C/C++ 표준 함수 제공 프로그램 초기화/클린업 예외 처리 지원 안전한 예외 처리기(Safe SEH) 버퍼 보안 검사 64비트 정수 연산 지원 스택 관리 자체 힙 관리 전역 변수 초기화 우리가 모르는 온갖 잡다한 일들,…
버퍼 보안 검사
버퍼 보안 검사
Size Input RET ADDR EBP Buffer Buffer
RET ADDR EBP Security Cookie Buffer Buffer
push ebp mov ebp, esp sub esp, 0Ch mov eax, dword ptr [__security_cookie] xor eax, ebp mov dword ptr [ebp – 4], eax
mov ecx, dword ptr [ebp – 4] xor ecx, ebp call _security_check_cookie mov esp, ebp pop ebp ret
__security_check_cookie
전역 변수 초기화
전역 변수 초기화
dumpbin
cinit
_initterm
.CRT$X…
스택 관리 기법
스택 할당
윈도우 스택 관리 메커니즘 Commit Commit Commit Commit EXCEPTION GUARD PAGE Reserved Guard Page Reserved Reserved
_chkstk
예외 처리
C++ Exception, SEH
C++ Exception
CRT 전용 힙
malloc
malloc_base
heap_alloc
heap_init
new/delete 문제
new/delete 문제 EXE CRT DLL CRT
감사합니다. 끝~