WinDbg Preview TTD 사용법

2023. 2. 9. 18:33리버싱

TTD란?

Time Travel Debugging의 약자로, 직역하면 시간여행 디버깅이다. 이렇게 보니까 뭔가 낭만있는 디버깅 같은데 ㅋㅋ 실제로 사용해보면 매우 편리하다. 시간여행 하면 과거나 미래의 시간으로 이동하는 것인데, 말 그대로 프로세스 실행 과정을 모두 기록해놓았다가 특정 시점으로 이동할 수 있는 기능이다.

장점

디버깅을 하다보면 이미 지나왔던 시점으로 돌아가고 싶을 때가 있다. TTD를 이용하지 않고서는 디버깅을 종료하고 처음부터 다시 실행해야 한다. 하지만 TTD를 이용하면 명령어 하나만으로 지나온 브레이크 포인트로 다시 되돌아 갈 수 있다. 😲

TTD 활용 예시

TTD가 어떤 기능인지 살펴보기 위해 간단히 메모장을 이용해 보겠다. 우선 빈 메모장을 하나 열고, 적당히 아무데나 저장해 놓는다.
그다음 WinDbg Preview > File > Attach to process > 우측 하단 Record with.. 체크 > Record

Record를 누른 순간부터 메모장에서 하는 모든 행위가 '녹화' 되며, 녹화를 마친 후엔 마치 동영상을 왔다갔다 하는 것처럼 특정 시점의 프로세스 상태로 왔다 갔다 할 수 있다.
나는 녹화를 누르고 메모장에 aaaa, bbbb, 12345 순으로 썻다 지웠다 하며 저장했다.
분석할 행위를 모두 마쳤다면, Stop and Debugging을 눌러 프로세스를 로드한다.

나는 메모장에 썼던 내용이 어떤 것인지 파악하는 것을 목표로 하겠다.
파일을 쓰는 API 에 BP를 걸고, 인자를 살펴보면 된다. 정확한 API 이름을 알기 위해 x 명령어로 심볼을 검색해 보자.

찾는 API는 WriteFile으로, 여기에 bp를 걸고 잘 걸렸는지 bl 명령어로 bp 목록을 확인한다.
WriteFile의 인자는 다음과 같고, 메모장에 쓴 내용은 lpBuffer를 통해 전달된다. 64비트 환경에서 두 번째 인자는 rdx로 전달되므로 rdx를 살펴보면 되겠다.

g 명령어(go)를 입력하면 bp를 만날 때까지 실행한다.

  BOOL WriteFile(
  [in]                HANDLE       hFile,
  [in]                LPCVOID      lpBuffer,
  [in]                DWORD        nNumberOfBytesToWrite,
  [out, optional]     LPDWORD      lpNumberOfBytesWritten,
  [in, out, optional] LPOVERLAPPED lpOverlapped
);

db 명령어로 rdx를 확인해보니 입력값인 aaaaa가 들어있다.
한 번 더 go 하면 그 다음에 입력했던 bbbbb를 볼 수 있다.

이전 bp가 걸렸던 곳으로 돌아가려면 명령어 뒤에 -를 붙여주면 된다. g- 를 하니 첫번째 bp로 돌아와 rdx에 aaaaa가 저장된 것을 볼 수 있다.

두 번 더 go 하면 맨 마지막에 입력했던 12345가 보인다.

한번 더 go 하면 프로그램 실행이 끝나는데, 다시 g- 를 사용해 프로그램 실행이 끝났어도 앞으로 돌아갈 수 있다!

마치며..

이건 진짜 혁신적인 기능이다. 너무 편하다...! 마소 사랑해요 입사시켜주세요

'리버싱' 카테고리의 다른 글

x64 Calling convention & Registers  (0) 2023.02.15
[DreamHack] rev-basic-3  (0) 2023.02.15