[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기GangSeok Lee
2014 CodeEngn Conference 10
MS 에게 속았어요
Windows 운영체제가 지원하는 디버거 지원 기능들과 브랜치 트레이서를 구현하기 위한 몇 가지 방법들을 소개하고, Windows 커널에 이미 구현되어있는 하드웨어 기반 브랜치 트레이서 코드 분석과 여기에 존재하는 의도된(?) 버그를 살펴본다.
http://codeengn.com/conference/10
http://codeengn.com/conference/archive
The document discusses analyzing crashes using WinDbg. It provides tips on reconstructing crashed call stacks and investigating what thread or lock is causing a hang. The debugging commands discussed include !analyze, !locks, .cxr, kb to find the crashing function and stuck thread.
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기GangSeok Lee
2014 CodeEngn Conference 10
MS 에게 속았어요
Windows 운영체제가 지원하는 디버거 지원 기능들과 브랜치 트레이서를 구현하기 위한 몇 가지 방법들을 소개하고, Windows 커널에 이미 구현되어있는 하드웨어 기반 브랜치 트레이서 코드 분석과 여기에 존재하는 의도된(?) 버그를 살펴본다.
http://codeengn.com/conference/10
http://codeengn.com/conference/archive
The document discusses analyzing crashes using WinDbg. It provides tips on reconstructing crashed call stacks and investigating what thread or lock is causing a hang. The debugging commands discussed include !analyze, !locks, .cxr, kb to find the crashing function and stuck thread.
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장Wooseok Seo
“기술로 배달 서비스를 선도하는 O2O 대표주자, 요기요”
안녕하세요. 알지피코리아에서 요기요 서비스를 책임지고 있는 서우석 CTO입니다.
대한민국은 아마도 전세계에서 가장 배달을 많이 시키고, 배달 서비스가 발전되어 있는 나라일 것입니다.
요기요와 같은 서비스가 있기 전에 우리는 어떻게 배달 주문을 했을까요? 그리고 배달 주문을 하면서 얼마나 많은 고충을 겪어왔을까요?
주말에, 그리고 저녁에 갑자기 짜장면이 먹고 싶을 때 우리는 집 어딘가에 있는 전단지를 찾아야 했습니다.
그런데 비슷한 중국집 이름 때문인지 전에 맛이 어땠는지 전혀 기억이 나질 않습니다.
어쨌든 전화를 걸어 음식을 주문하게 되는데, 정말 아이러니하게도 분명 지난주에 “이집 맛없어서 다시는 안시켜야지”했던 집에서 또 배달이 옵니다.
귀식이 곡할 노릇이죠.
어쨌든, 초창기 배달앱 서비스들은 전단지, 소위 찌라시라고 하는 것들을 그대로 모바일 서비스로 옮겨오는 형태였습니다.
저는 이와 같은 형태를 가장 초기단계의 O2O 서비스라고 하는데요, 아시겠지만 O2O 서비스의 개념 정의 자체가 너무 광범위하고 다소 추상적이며, 서비스에 따라서 필수조건이라든지 요구 사항들, 심지어는 정의 자체도 다릅니다. 때문에 저는 O2O라는 광범위한 의미보다는 좀더 다른 용어로 배달앱 서비스의 과거와 현재, 그리고 미래를 얘기해보고자 합니다.
전단지를 모바일에서 제공하는 형태의 서비스를 저는 P2P, Physical to Physical. 오프라인에 존재하는 서비스나 물건, 그 자체를 온라인으로 옮겨오는 형태입니다.
이와 같은 서비스들은 많은 장점이 있습니다.
내가 전단지를 보관할 필요도 없고, 원한다면 언제든지 찾을 수 있으니까요. UI가 엉망이긴 하지만, 그럭저럭 스크롤해서 사용해 볼 수 있습니다.
하지만 이와 같은 P2P는 초기 진입자에게만 선점 효과가 있을 뿐 좀더 다른 시각으로 서비스를 제공하는 후발주자가 나타날 경우 시간이 갈수록 선점 효과가 떨어집니다. 특히 후발주자가 머리가 똑똑하다면요.
어쨌든 P2P 단계에서는 기존의 주문 형태와 거의 다를 바가 없습니다. 그래서 사람들이 쉽다고 생각하죠. 그런데 그와 동시에 기존 시장이 갖고 있던 문제들을 그대로 보유하고 있습니다. 전화를 직접해야 하는 불편함, 메뉴를 선택해야 하는 불편함 등입니다. P2P 서비스를 하나의 단어로 표현하면 “접근성”입니다.
그 다음 단계는 Physical to Digital 입니다. 물리적인 형태를 그대로 옮겨오는 것이 아니라 해당 서비스의 컨텐츠를 디지
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드GangSeok Lee
2012 CodeEngn Conference 07
Secuinside는 코스콤에서 주최, 연합해킹그룹 HARU, 고려대 정보보호대학원에서 주관하는 국제 해킹대회 및 보안컨퍼런스로써 얼마전 개최된 해킹대회 예선전 문제들을 풀기위해 사용한 분석기술과 ASLR과 NX를 우회하는 새로운 익스플로잇 기술에 대해서 소개한다.
http://codeengn.com/conference/07
[2013 CodeEngn Conference 08] manGoo - Windows 8 ExploitGangSeok Lee
2013 CodeEngn Conference 08
Exploit으로 인한 보안 위협은 어제 오늘만의 문제가 아니다. 그에 따라서, Windows Version이 Update 되면서 다양한 Memory Protection 기능으로 Exploiting 으로 인한 공격을 방어하게 되었다. Exploiting Technique에 대한 History를 살펴 보며, Windows 8에서 Memory 관리 하는 방법 및 Memory Protection 방법에 대해서 살펴 볼 것이다. 이러한 변화로 인해 Exploiting 공격에 있어 어떤 방법으로 접근해야 될 지 알아보도록 하자.
http://codeengn.com/conference/08
2. AgendaAgenda
버그 예방책버그 예방책
Native Debugging with VC++ 6Native Debugging with VC++ 6
AssemblyAssembly 코드 보기코드 보기
3. 누구를 위한 웹 캐스트인가누구를 위한 웹 캐스트인가
?? Visual C++ 6.0Visual C++ 6.0 디버거를 제대로 활용하디버거를 제대로 활용하
고 싶은 개발자고 싶은 개발자
버그를 예방하는 방법에 대해서 고민하버그를 예방하는 방법에 대해서 고민하
고 있는 개발자고 있는 개발자
AssemblyAssembly 코드만 보면 디버그 창을 닫코드만 보면 디버그 창을 닫
아버리는 개발자아버리는 개발자
AssemblyAssembly 의 ‘의 ‘ A’A’ 자만 들어도 겁이 나는자만 들어도 겁이 나는
개발자개발자
4. 버그 예방책버그 예방책
디버깅을 잘하는 것보다 미리 예방하는디버깅을 잘하는 것보다 미리 예방하는
것이 더 중요것이 더 중요 !!
소 잃고 외양간 고치기소 잃고 외양간 고치기 ??
버그 예방버그 예방 == 디버깅디버깅
ASSERT!ASSERT!
5. ASSERTASSERT
어설트의 대상이 되는 조건이 참이어야어설트의 대상이 되는 조건이 참이어야
함함
거짓거짓 (FALSE)(FALSE) 이면 오류 발생이면 오류 발생
릴리즈 시에는 포함되지 않기 때문에릴리즈 시에는 포함되지 않기 때문에 ,,
주로 테스트를 위하여 사용주로 테스트를 위하여 사용
문서화 역할도 수행문서화 역할도 수행
6. ASSERTASSERT 할 대상은 무엇할 대상은 무엇 ??
가능한 모든 것가능한 모든 것 !!
프로그램을 작성하면서 가정하고 있는프로그램을 작성하면서 가정하고 있는
사항들사항들
““ 이 변수는 이 값을 가져야 해이 변수는 이 값을 가져야 해 .”.”
““ 이 식의 결과는 이 값을 가져야 해이 식의 결과는 이 값을 가져야 해 .”.”
““ 이 함수로 들어오는 매개 변수는 절대로이 함수로 들어오는 매개 변수는 절대로
이 값을 가져서는 안돼이 값을 가져서는 안돼 .”.”
매개 변수로 들어오는 값매개 변수로 들어오는 값 ,, 리턴 되는 값리턴 되는 값
7. ASSERTASSERT 사용 시 주의 사항사용 시 주의 사항
Be a smart guy!Be a smart guy!
실패할 수 있는 모든 사항에 대하여 어설트실패할 수 있는 모든 사항에 대하여 어설트
를 하지는 않는다를 하지는 않는다 ..
예예 )) 데이터베이스 연결이 실패했을 때마다 어데이터베이스 연결이 실패했을 때마다 어
설트가 실패하면 프로그램이 진행되지 않는다설트가 실패하면 프로그램이 진행되지 않는다 ..
심각한 오류에 대해서만 어설트를 한다심각한 오류에 대해서만 어설트를 한다 ..
논리적인 상황에 대한 어설트는 별도의논리적인 상황에 대한 어설트는 별도의
어설트 함수로 작성한다어설트 함수로 작성한다 ..
예예 ) AssertTableExist) AssertTableExist
8. ASSERTASSERT 사용사용
ManagedManaged 환경환경
Debug.Assert / Debug.TraceDebug.Assert / Debug.Trace
Debug.Assert ( i > 3 )Debug.Assert ( i > 3 )
NativeNative 환경환경
_ASSERTE / TRACE_ASSERTE / TRACE
ASSERT ( i > 3 )ASSERT ( i > 3 )
MFCMFC 환경환경
ASSERT_KINDOFASSERT_KINDOF
Cobject::IsKindOfCobject::IsKindOf 메서드의 래퍼메서드의 래퍼
ASSERT_VALIDASSERT_VALID
포인터가포인터가 CObjectCObject 에서 파생된 클래스인지 검에서 파생된 클래스인지 검
증한다증한다 ..
9. 어설셜을 위한 헬퍼 함수들어설셜을 위한 헬퍼 함수들
IsBadCodePtrIsBadCodePtr
메모리 포인터를 실행할 수 있는지 검사한다메모리 포인터를 실행할 수 있는지 검사한다 ..
IsBadReadPtrIsBadReadPtr
메모리 포인터가 특정한 바이트만큼 읽을 수 있는메모리 포인터가 특정한 바이트만큼 읽을 수 있는
지 검사한다지 검사한다 ..
IsBadStringPtrIsBadStringPtr
문자열 포인터를문자열 포인터를 nullnull 종결자가 나올 때까지 혹은종결자가 나올 때까지 혹은
지정된 문자의 최대 수까지 읽을 수 있는 검사한지정된 문자의 최대 수까지 읽을 수 있는 검사한
다다 ..
IsBadWritePtrIsBadWritePtr
메모리 포인터에 지정된 바이트만큼 쓸 수 있는지메모리 포인터에 지정된 바이트만큼 쓸 수 있는지
검사한다검사한다 ..
IsWindowIsWindow
11. 기본적인 디버깅 설정 방법기본적인 디버깅 설정 방법
중단점중단점 (BreakPoint)(BreakPoint)
프로그램의 실행을 중단시키기 위한 위치프로그램의 실행을 중단시키기 위한 위치
줄 단위로만 설정 가능줄 단위로만 설정 가능
VS .NETVS .NET 에서는 명령 별로 설정 가능에서는 명령 별로 설정 가능
중단점 설정중단점 설정 (F9)(F9)
버그가 발생되었다고 생각되는 부분 혹은버그가 발생되었다고 생각되는 부분 혹은
그 주위에 중단점을 설정한다그 주위에 중단점을 설정한다 ..
중단점을 설정하기 전에 두뇌를 이용하여중단점을 설정하기 전에 두뇌를 이용하여
중단점을 설정해야 하는 위치를 정확하게중단점을 설정해야 하는 위치를 정확하게
파악하도록 한다파악하도록 한다 ..
12. 디버깅 기본 기술디버깅 기본 기술
Step IntoStep Into
다른 루틴 호출 시 해당 루틴을 확인할 것다른 루틴 호출 시 해당 루틴을 확인할 것
인지 결정인지 결정
Step OverStep Over
다른 루틴의 결과만을 확인할 것인지 결정다른 루틴의 결과만을 확인할 것인지 결정
Step OutStep Out
호출 스택에 있는 바로 이전 함수로 넘어감호출 스택에 있는 바로 이전 함수로 넘어감
13. 디버거 관련 창 사용 방법디버거 관련 창 사용 방법 --
11 호출 스택호출 스택 (Call Stack)(Call Stack) 확인확인
문제가 발생한 함수를 호출한 함수 목록 확문제가 발생한 함수를 호출한 함수 목록 확
인인
로컬로컬 (Local)(Local) 과 자동과 자동 (Auto)(Auto) 창 확인창 확인
문제가 발생한 위치에서 사용된 지역 변수문제가 발생한 위치에서 사용된 지역 변수
들들
메모리메모리 (Memory)(Memory)
VC++ 6.0VC++ 6.0 에서는 오직 하나의 메모리 창만에서는 오직 하나의 메모리 창만
지원지원
내가 정확히 알고 싶어하는 값이 무엇이내가 정확히 알고 싶어하는 값이 무엇이
며며 ,, 기대하는 값은 무엇인가를 명확하기대하는 값은 무엇인가를 명확하
14. 디버거 관련 창 사용 방법디버거 관련 창 사용 방법 --
22 조사식 창에서 지원하는 여러가지 형식조사식 창에서 지원하는 여러가지 형식
기호기호
x, X : 16x, X : 16 진수진수
61541,x : 0x0000F06561541,x : 0x0000F065
c :c : 단일 문자단일 문자
0x0065,c : 101 ‘e’0x0065,c : 101 ‘e’
hr : HRESULThr : HRESULT 또는또는 Win32Win32 오류 코드오류 코드
0x00000000,hr : S_OK0x00000000,hr : S_OK
wc : Windowwc : Window 클래스 플래그클래스 플래그
0x00000040,wc : WC_DEFAULTCHAR0x00000040,wc : WC_DEFAULTCHAR
wm : Windowswm : Windows 메시지 번호메시지 번호
16. 디버깅 고급 기술디버깅 고급 기술 - 1- 1
충돌 및 잘못된 연산으로 인한 오류의충돌 및 잘못된 연산으로 인한 오류의
대부분은 ‘포인터’의 사용으로 인한 오대부분은 ‘포인터’의 사용으로 인한 오
류류 !!
메모리의 값이 변경될 때 중단점 활성화메모리의 값이 변경될 때 중단점 활성화
방법방법
BreakpointsBreakpoints 창 실행창 실행
DataData 탭에서 검사하고자 하는 메모리의 주탭에서 검사하고자 하는 메모리의 주
소나 변수 이름 입력소나 변수 이름 입력
필요한 경우필요한 경우 Advanced…Advanced… 에서 소스 코드에서 소스 코드
와 함수 이름 입력와 함수 이름 입력
18. 디버깅 고급 기술디버깅 고급 기술 - 2- 2
조건 중단점조건 중단점
조건이 맞을 때에만 중단점 활성화조건이 맞을 때에만 중단점 활성화
반복문에서 특히 유용반복문에서 특히 유용
내 프로젝트에서 로드하지 않은내 프로젝트에서 로드하지 않은 DLLDLL 에에
대해서도 직접 설정 가능대해서도 직접 설정 가능
{[function],[source file],[binary module]}{[function],[source file],[binary module]}
Test.cppTest.cpp 파일의파일의 2020 번째 줄번째 줄
{,TEST.CPP,},20{,TEST.CPP,},20
참고참고
DLLDLL 이이 exportexport 한 함수 목록 확인하기한 함수 목록 확인하기
Depends.exeDepends.exe
Dumpbin /exportDumpbin /export
20. AssemblyAssembly 코드 보기코드 보기
x86x86 아키텍처가 무엇인가아키텍처가 무엇인가 ??
레지스터와 호출 규약레지스터와 호출 규약
플래그와 조건플래그와 조건 ,, 데이터 형식데이터 형식
x86x86 명령들명령들
x86x86 디스어셈블리 예제디스어셈블리 예제
21. x86x86 아키텍처가 무엇인가아키텍처가 무엇인가 ??
use complex instruction set computeruse complex instruction set computer
(CISC) architecture(CISC) architecture
modest number of special-purposemodest number of special-purpose
registersregisters
Many peculiarities(Many peculiarities( 특성특성 ) in the x86) in the x86
instruction are due to the backwardinstruction are due to the backward
compatibility with that processorcompatibility with that processor
22. 레지스터와 호출 규약레지스터와 호출 규약
32bit registers32bit registers
eax : Accumulatoreax : Accumulator
ebx : Base registerebx : Base register
ecx : Count registerecx : Count register
edx : Double-precision registeredx : Double-precision register
esi : Source index registeresi : Source index register
edi : Destination index registeredi : Destination index register
ebp : Base pointer registerebp : Base pointer register
esp : Stack pointeresp : Stack pointer
Non integer registersNon integer registers
eip : instruction pointereip : instruction pointer
flags : flagsflags : flags
25. 레지스터와 호출 규약레지스터와 호출 규약
Calling conventionCalling convention
The register preservation rule is that functions must preserve all registers,The register preservation rule is that functions must preserve all registers,
except for eax, ecx, and edx, which can be changed across a function call,except for eax, ecx, and edx, which can be changed across a function call,
and esp, which must be updated.and esp, which must be updated.
The function return rule is that the eax register receives function returnThe function return rule is that the eax register receives function return
values if the result is 32 bits or smaller. If the result is 64 bits, then thevalues if the result is 32 bits or smaller. If the result is 64 bits, then the
result is stored in the edx:eax pair.result is stored in the edx:eax pair.
Win32 (Stdcall) : Function parameters are passed on the stack, pushedWin32 (Stdcall) : Function parameters are passed on the stack, pushed
right to left, and the callee cleans the stack.right to left, and the callee cleans the stack.
Native C++ (Thiscall) : Function parameters are passed on the stack,Native C++ (Thiscall) : Function parameters are passed on the stack,
pushed right to left, the "this" pointer is passed in the ecx register, andpushed right to left, the "this" pointer is passed in the ecx register, and
the callee cleans the stack.the callee cleans the stack.
COM(Stdcall for C++) : Function parameters are passed on the stack,COM(Stdcall for C++) : Function parameters are passed on the stack,
pushed right to left, then the "this" pointer is pushed on the stack, andpushed right to left, then the "this" pointer is pushed on the stack, and
then the function is called. The callee cleans the stack.then the function is called. The callee cleans the stack.
Fastcall : The first two DWORD-or-smaller arguments are passed in theFastcall : The first two DWORD-or-smaller arguments are passed in the
ecx and edx registers. The remaining parameters are passed on theecx and edx registers. The remaining parameters are passed on the
stack, pushed right to left. The callee cleans the stack.stack, pushed right to left. The callee cleans the stack.
Cdecl : Function parameters are passed on the stack, pushed right toCdecl : Function parameters are passed on the stack, pushed right to
left, and the caller cleans the stack. The Cdecl calling convention isleft, and the caller cleans the stack. The Cdecl calling convention is
used for all functions with variable-length parameters.used for all functions with variable-length parameters.
26. 플래그와 조건플래그와 조건 ,, 데이터 형데이터 형
식식 E, Z : If zero (or comparison equal)E, Z : If zero (or comparison equal)
NE, NZ : If nonzero (or comparison unequal)NE, NZ : If nonzero (or comparison unequal)
GE : If greater than or equal to zeroGE : If greater than or equal to zero
LT, NGE : If less than zeroLT, NGE : If less than zero
GT : If greater than zeroGT : If greater than zero
LE, NGT : If less than zeroLE, NGT : If less than zero
C : If carryC : If carry
NC : If no carryNC : If no carry
AE, NB : If above or equal (unsigned greater)AE, NB : If above or equal (unsigned greater)
B, NAE : If below (unsigned less than)B, NAE : If below (unsigned less than)
A, NBE : If above (unsigned greater or equal)A, NBE : If above (unsigned greater or equal)
BE, NA : If below or equal (unsigned less thanBE, NA : If below or equal (unsigned less than
or equal)or equal)
27. x86x86 명령들명령들
LEA r, m : Load effective address.LEA r, m : Load effective address.
LEA eax, [esi+4] means eax = esi + 4.LEA eax, [esi+4] means eax = esi + 4.
MOV r1/m, r2/m/#n : r1/m = r/m/#nMOV r1/m, r2/m/#n : r1/m = r/m/#n
PUSH r/m/#n : Push value onto stack.PUSH r/m/#n : Push value onto stack.
POP r/m : Pop value from stack.POP r/m : Pop value from stack.
LEAVE : Tear down stack frameLEAVE : Tear down stack frame
mov esp, ebpmov esp, ebp
pop ebppop ebp
ADD, SUB, NEG, INC, DEC, CMP, MUL, IMUL, DIV,ADD, SUB, NEG, INC, DEC, CMP, MUL, IMUL, DIV,
IDIVIDIV
AND, OR, XOR, NOT, TEST, SHL, SHR, SAR(sign-fill)AND, OR, XOR, NOT, TEST, SHL, SHR, SAR(sign-fill)
JMP, CALL, RETJMP, CALL, RET
NOP (0x90), INT 3 (0xCC)NOP (0x90), INT 3 (0xCC)