콜 스택(call stack) 이란 컴퓨터 과학에서 실행할 컴퓨터 프로그램 코드 정보를 저장하는 스택 자료구조 라고 설명한다.
Windbg에서 많이 사용되는 명령어가 call stack 과 관련된 명령어라고한다.
개인의 실력차에 따라서, stack frame을 변경하여서 디버깅이 가능하지만, 간단하게 사용법을 정리하려 한다.
블루 스크린이 났을때 많이 사용하지만, 동일한 원리에서 시작하기 때문에 ...
The k*\** commands display the stack frame of the given thread, together with related information..
위와 같이 설명되어 있다. k command 는 주어진 스택 프레임을 관련 정보와 함께 보여준다.
즉 현재 문맥의 스레드의 스택 정보를 관련 정보와 보여준다는 의미이다.
먼저 옵션에 관해서 정리하고, 그 다음 쉬운 예제를 통해서 사용해 보려 한다.
[b option]
windbg> kb
각 함수의 처음 3개의 인자를 보여준다.
[c option]
----------------------------------------------------------------------------------------------------------------------
[~Thread] k[b|p|P|v] [c] [n] [f] [L] [M] [FrameCount]
[~Thread] k[b|p|P|v] [c] [n] [f] [L] [M] = BasePtr [FrameCount]
[~Thread] k[b|p|P|v] [c] [n] [f] [L] [M] = BasePtr StackPtr InstructionPtr
[~Thread] kd [WordCount]
[FrameCount option]
windbg> kc 3
몇개의 스택만 보여줄지 선택하는 옵션
[StackPtr option]
windbg> kc = aaaa00 aaaa11
stack pointer를 설정하는 옵션 [ebp]
[BasePtr option]
windbg>kc = bbbb00
base pointer를 설정하는 옵션[esp]
유저모드에서의 간단한 예제를 가지고 실습 해본다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void First(int a){ a = 10; Second(10, 20, 30); } void Second(int a, int b, int c) { a = 30; b = 20; a = 10; Third(1, 2, 3, 4, 5); } void Third(int a, int b, int c, int d, int e){ MessageBoxA(NULL, "1234", "test", MB_OK); } int main(void) { int n, a; First(40); } | cs |
windbg로 MessageBox함수 까지 들어온다. 그러면 이제 앞에서 First, SEcond, Third 함수가 모두 호출된 상태일 것이다.
[현재 위치]
[kb 명령어]
위와 같이 3개의 인자를 보여주고 차례로 스택 프레임, 리턴주소, 인자 값, 함수와 모듈 이렇게 보여준다.
차례대로 아래에서 부터 mainCRT --> main --> First --> Second --> Third --> MessageBox 이렇게 호출 된 것을 알 수 있다.
[kc 명령어]
[kp 명령어]
[kP 명령어]
[kf 명령어]
[Frame 명령어]
[출처] https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/k--kb--kc--kd--kp--kp--kv--display-stack-backtrace-
'reversing > Windows Driver' 카테고리의 다른 글
I/O Control Codes [IOCTL] 정리 (0) | 2017.08.09 |
---|---|
MDL(Memory Descriptor List)[1] (1) | 2017.08.08 |
IRP, I/O Stack 관련 내용 정리 [3] (0) | 2017.08.04 |
IRP, I/O Stack 관련 내용 정리 [2] (0) | 2017.08.04 |
Security Descriptors (0) | 2017.08.04 |