-->

[reversing.kr] WindowsKernel 풀이

반응형

드라이버 파일이 같이 주어진 만큼, 이번 기회에 Windbg로 커널 디버깅 하는 연습을 해보려고 했는데 결국 제대로 실행시키는데 실패해서 IDA로 겨우겨우 풀었다. 

 

 

 

reversing.kr WindowsKernel 풀이

관리자 권한으로 실행시키면, StartService 관련 에러가 발생한다.

 

 

 

StartService에 대한 에러코드를 보기위해 간단히 코드를 짠 후 어떤 에러인지 봤는데, 에러코드 0x4fb (1275)로 ERROR_DRIVER_BLOCKED 에러이다. 

#include <stdio.h>
#include <windows.h>

int main()
{
	SC_HANDLE schSCManager = NULL;
	SC_HANDLE schService = NULL;
	char* Filename = "C:\\Users\\leefo\\Desktop\\files\\research\\wargame\\reversing.kr\\WindowKernel\\WinKer.sys";

	schSCManager = OpenSCManager(NULL, NULL, 0x0F003F);
    
    // 코드...
    
	BOOL bStart = StartService(schService, NULL, NULL);
	if (bStart == FALSE)
	{
		printf("StartService ErrorCode: %x\n", GetLastError());
	}

	return 0;
}

 

 

구글링해보니, 윈도우10의 드라이버 서명 문제인 것 같았다. 서명값이 없는 드라이버를 블락하는...? 그래서 윈도우7에서 실행시켜보았는데.......... 윈도우10 환경에서 실행시키느게 빠를 것 같다 ^^;

 

 

 

드라이버 서명값 없이도 드라이버를 설치 혹은 로드시킬 수 있는 방법을 구글링해서 찾으니 아래 명령어를 사용한 후 재부팅하면 된다고 해서, 해보았는데 그래도 되지 않았다.

 

 

 

더이상 시간을 지체시키기는 단순 삽질이 될 것 같아서 IDA로 정적분석 먼저 진행하기로 했다. "Correct!" 문자열을 기반으로 아래 함수를 보면, Correct 문자열이 있는 분기로 가기 위해선, sub_611280의 리턴값이 1이어야 함을 알 수 있다. Check 루틴으로 들어왔을 경우 sub_611280 함수내에서 드라이버와 통신을 시작하게 된다. 그리고 그 결과값이 1이면 Correct이고 아니면 Wrong으로 분기한다.

 

 

 

WindowsKernel 프로그램은 드라이버와 통신하기 위해 CreatFile로 심볼릭 링크의 핸들값을 얻어오고 이 핸들값을 첫번째 인자로 DeviceIoControl이라는 함수를 사용해 통신하게 된다. 여기서 OutBuffer은 디바이스가 쓰게 될 버퍼를 지정하는 인자이므로 드라이버가 쓰는 버퍼인 OutBuffer에 1을 써야한다. 결국 Correct/Wrong 분기와 직접적으로 연관된 값 검증은 exe가 아닌 드라이버에서 한다는 것을 알 수 있다.

 

 

 

그럼 여기서 드라이버 WinKer.sys의 DriverEntry부터 따라가보자. sub_11466에 중요 코드들이 들어있다.

 

 

 

exe에 전송할 값을 어디서 쓰는지, 혹은 입력해준 값을 어디서 받아오는지 0,1 세팅을 해주는 부분이 있는지를 중점적으로 보다보면, sub_11266에 키보드 입력값을 받는 부분이 있다는 것을 알 수 있다. 여기 따로 캡쳐 이미지를 넣치는 않았지만 hint로 Keyboard가 주어졌던 것과도 상황이 일치한다.

 

 

그리고 이 함수는 KeInitalizeDpc 함수의 2번째 인자로 전달되는데 KeInitalizeDpc는 dpc가 정확히 뭔지는 모르겠지만 dpc 객체를 초기화하는 함수로 2번째 인자는 KeSetTimer 함수가 호출되면 주기적으로 호출되는 함수 포인터이다. 

 

 

 

키보드 입력값 a1이 전달된 함수 sub_111DC부터 함수 3개를 분석하면 복잡한 연산 없이 정답값을 쉽게 구할 수 있다. 다만 여기서 삽질했던 포인트가 있는데 1.dword_13034의 초기값이 뭔지, ++된다는 것 2.아스키코드가 아닌 키보드코드를 구해야 한다는 것이다. 내 경우는 이 2개 삽질?이 끝나니 정답값을 빠르게 구할 수 있었다.

 

 

'리버싱 > reversing.kr' 카테고리의 다른 글

[reversing.kr] CSHOP 풀이  (0) 2020.03.19
[reversing.kr] AutoHotkey1 풀이  (2) 2020.03.17
[reversing.kr] Easy ELF 풀이  (0) 2020.03.15
[reversing.kr] Twist1 풀이  (0) 2020.03.13
[reversing.kr] ransomware 풀이  (0) 2020.03.12

댓글

Designed by JB FACTORY