Best of Best

윈도우 커널 디버깅을 통해 메모장을 해킹 해보자! with WinDbg

pental 2024. 7. 11. 23:27

준비물

VMware Workstation 17 Player + Windows 10 iso
WinDbg + VirutalKD-Redux-2024.3
끈기 + 열정

 

윈 10 부팅후, VirutalKD-Redux-2024.3 을 통해서 Guest에 붙여준다.

해당 압축을 풀고 target64폴더를 Guest환경으로 옮겨준다. (VMware Tools 가 설치되어 있어야, Drag & Drop이 가능)

Guest 환경에 target64.exe 을 실행시킨다.

실행 후 게스트를 재시작 하라는 메시지를 통해서 재시작을 진행할때, F8을 통해서 "드라이버 서명 적용 사용 안 함"으로 부팅을 해야 커널 디버깅이 가능하다.

Host 환경

Host환경에 WinDbg에서는 자동으로 붙는것을 확인 할 수 있다. int 3이 나온다면 드라이버가 붙은것이다.

이상태에서는 Guest 환경에서 사진은 다음과 같다.

드라이버가 붙고 나서의 게스트 화면 (멈춰있는게 정상)

부팅을 정상적으로 진행시키기 위해서 host환경의 Windbg에서 g를 통해 계속 진행시킨다.

목적은 메모장에 띄워져 있는 메시지를 바꾸는거기 떄문에 메모장을 실행시키고, "michingamza"를 입력해두었다.

게스트 환경에서의 메모장

이제 Guest환경에서 Windbg를 실행시켜 메모장의 메모리를 확인 해 본다.

Guest환경에서 WinDbg - File - Attach to process 를 통해서 notepad.exe 를 불러온다.

불러와서 심볼을 설정하기 위해서 다음과 같이 명령어를 작성한다.

.symfix c:\websym
.reload

그리고 WinDbg Command Line에 다음과 같이 입력한다.

heap 영역이 위 사진과 같이 나타나는것을 확인 할 수 있고, 첫번째 힙영역을 먼저 확인하기 위해서 다음과 같이 입력한다.

s -u Start_Address End_Address String

그럼 위 사진의 2번째 줄과 같이 문자열 탐색이 된것을 확인 할 수 있다. 그리고 이제 바이너리를 확인하기 위해서 해당 영역의 address의 값을 확인하기 위해서 formats 함수를 사용한다.

여기서 중요하게 봐야하는 것은 Binary의 값이다. 이 영역만 따로 알아둔다.

힙영역(? / 사실 잘모르겠다.)의 구조는 위 사진과 같다고 한다. 그럼 이 바이너리를 적절하게 분배한다.

00000000 00000000
000000100
111000001
101010000
001111001
000110100000

이제 이 이진수들이 어떤 값을 가지는 지 확인하기 위해서 각 이진수 앞에 '? 0y' 를 붙인다.

? 0y000000100
? 0y111000001
? 0y101010000
? 0y001111001
? 0y000110100000

Guest 환경의 Windbg에서 찍어보면 아래 그림과 같다.

이제 Host환경의 Windbg를 통해서 process를 검색한다.

Host 환경에서 process 명령을 입력 한 후

여기서 중요하게 봐야 할 내용은 DirBase이다. 이 값이 메모장의 CR3 값이다.

이제 본격적으로 해킹?을 시작한다. 중간에 한번 날려먹어서 주소값이 다르다. 참고 부탁드립니다.

DirBase의 값이 변경되어서 4d7590002 로 다시 진행하며, 이진수 값을 ? 을 통해서 나타낸 값은 위와 같다.

첫번째 줄의 2번 열의 앞 5자리만 따와서 아래처럼 뒤에 000을 붙이고 + value * 8 을 반복해서 진행한다.

마지막에서는 !db 를 통해서 해당 영역만큼 읽으면 된다. 그럼 아까 메모장에 적은 micingamza 가 나타나는 것을 확인 할 수 있다.

이제 값 조작을 진행한다.

fp [address] L1 'M' 을 통해서 첫번째 문자인 'm' 을 'M' 으로 변경했다.

그리고, 해당 메모장의 CR3 의 값은 아래와 같이 구할수 있다!

이제 호스트의 Windbg도 Go 시키고, Guest 환경의 WinDbg도 Go 시키면!!

이런식으로 변경되는것을 확인할 수 있다.

커널 디버깅은 참 재미있는것 같다.