본문 바로가기
Rev/Write-up

Christmas CTF 2020 - Screw_Driver

by zooonique 2020. 12. 30.
반응형

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