본문 바로가기

reversing/Windows Driver

WinDBG 명령어 [CallStack]

SMALL

콜 스택(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]

windbg>  kc

스택 트레이스에서 사용된 함수와 모듈만 보여준다.

[p option]
windbg>  kp

스택 트레이스에서 각 함수가 사용한 모든 인자를 보여준다. 


[P option]
windbg>  kP

스택 트레이스에서 각 함수가 사용한 모든 인자를 보여준다. 위의 옵션과 같지만 해당 옵션은 개행을 해서 더 보기 좋게 해준다.


[v option]
windbg>  kv

FPO(Frame Pointer Omission) 정보를 보여준다. x86에서는 calling convention도 보여준다.



[f option]
windbg>  kf

인접한 프레임 사이의 거리를 보여준다. 해당 스택 프레임에서 얼만큼 사용하는지 알 수 있다.


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


[~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(102030);
}
void Second(int a, int b, int c)
{
    a = 30; b = 20; a = 10;
    Third(12345);
}
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 명령어]



위에서와 같이 현재 문맥은 MessageBox에 있는데 이제 임의로 Stack의 base 를 예전 main으로 변경하였다.

그 결과 위와 같이 main 의 스택 프레임을 사용해서 MesageBox의 인자로 argc argv가 들어간 것을 볼수 있다 

이렇게 실제 덤프 파일을 분석 할 때는 자신이 스택 프레임을 구성해서 분석하는게 도움이 될때도 있을것 같다.



[출처] https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/k--kb--kc--kd--kp--kp--kv--display-stack-backtrace-

LIST

'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