Driver파일을 분석하는 문제이다.
문제파일에는 file,Screw_Driver.sys라는 파일이 주어진다.
Screw_Driver를 분석해보면, 처음에 DriverEntry라는 함수가 있다.
DriverEntry는 직관적으로 처음에 시작되는 함수인 것을 알 수 있다.
그 흐름을 따라가보면, sub_140002BF8이라는 함수가 실행된다.
RtlInitUnicodeString 함수는 두번째 파라미터의 문자열을 첫번째 파라미터에 Unicode형태로 저장하는 함수이다.
IoCreateDevice 함수는 드라이버에 쓰이는 DeviceObject를 만든다.
중요한 부분은 빨간박스 부분이다. MajorFunction의 14번째에 해당하는 내용은 IRP_MJ_SYSTEM_CONTROL을 호출한다.
이 내용은 뒷부분에서 다시 다뤄보자.
저 important로 정해놓은 함수를 분석해보자.
우선 CAMSchedule::GetEvent를 통해서 이벤트핸들을 받아온다.
이벤트핸들러의 6번째 인덱스(v4)를 통해, 아래의 조건분기문을 통제하는것을 알 수 있다.
여기서 v4는 DeviceIoControl이라는 함수의 두번째 인자로 커널디버깅시 유저가 입력해주는 파라미터로 활용될 수 있어보인다.
(박승현 정보제공)
어쨌든 계속 분석을 해보면, 드라이버에서 파일을 열고 읽을 수 있는 Zw-File함수를 활용해 제공받은 file을 열고 읽어서 buf에 저장한다.
buf[29]를 통해 플래그가 29글자인가? 라고 의심해볼 수 있다. (사실 아마 file의 글자수도 29자인것으로 알고있다.)
이후 func_copy()함수로 분기한다. 방금 v4==0x222004를 했는데, 어떻게 v4==0x222008로 분기하는지 의문이었는데,
디버깅을 하고있는 조건이라면 important를 아예 한번 다시 실행하면된다.
그럼 func_copy()함수로 진입하면,
do_copy함수는 첫번째 파라미터에 두번째 파라미터를 세번째 파라미터 크기만큼 복사하는 함수이다.
do_copy의 내용은 뭐 길어보이지만, 실제로는 세번째 파라미터가 8미만만 쓰이기때문에 저 부분만 보면 된다.
즉, cp_buf에 buf[4]~buf[28]만큼 복사하고, file의 내용이 있는 buf에는 XMAS(네글자)를 복사한다.
sub_14000341C함수를 통해 플래그가 나온다. 이 함수를 분석해보자!
byte_140005008의 문자들과 앞서 작업한 buf랑 xor연산하여 str1에 저장한다.
그 후에 strcmp 함수를 거친다. str1과 str2가 같으면 다음으로 진행된다.
그 후, do_copy를 통해 buf에 4글자를 str2에 저장한다. (XMAS가 되겠지?)
그런다음 아래의 반복문을 거친 후, str2를 출력해보면, 플래그가 나온다.
buf = [0x58,0x4d,0x41,0x53,0x29,0x37,0x5B,0x1C,0x3F,0x79,0x24,0x20,0x16,0x64,0x41,0x15,0x01,0x60,0x0D,0x3B,0x68,0x51,0x27,0x62,0x06,0x47,0x4C,0x34,0x33]
buf_5008 = [0x73,0x6B,0x0C,0x6A,0x54,0x0D,0x52,0x3F,0x0C,0x64,0x6C,0x2E,0x65,0x4A,0x33,0x0B,0x43,0x4E,0x40,0x26,0x7F,0x72,0x1F,0x68,0x5B,0x63,0x34,0x03,0x3C]
cp_buf =[0 for i in range(30)]
str1 = []
for i in range(4,29):
cp_buf[i-4]=buf[i]
for i in range(29):
str1.append(buf_5008[i]^buf[28-i])
str2=str1
for i in range(4):
str2[i]=buf[i]
v6=0
v10=-1
v13=1
v7=4
v9=5
v8=0
while(True):
for i in range(v9):
v10=v10+v13
str2[v7]=v8+(cp_buf[5*v6+v10]^str2[v7])
v7=v7+1
v8=v8+1
v9-=1
if v9<=0:
break
for k in range(v9):
v6=v6+v13
str2[v7]=v8+(cp_buf[5*v6+v10]^str2[v7])
v7=v7+1
v8=v8+1
v13=-1*v13
'Rev > Write-up' 카테고리의 다른 글
HTB - BombsLanded (0) | 2021.01.07 |
---|---|
Christmas CTF 2020 - angrforge (0) | 2021.01.04 |
Christmas CTF 2020 - lock (0) | 2020.12.28 |
b01lers - chuggachugga (0) | 2020.03.18 |
Rice Tea Cat Panda - Notice Me Senpai (0) | 2020.02.05 |