IDAPython

1. はじめに

 IDAPythonに触れてみたので覚書として.

 

2. コードサンプル

 IDAPython, IDA SDK: Welcome で調べることができる. 後はひたすら調べる.

 

 2.1 色をつける

  個人的に解析を行う際に未定義の関数 (sub_***) がそのままでは他の命令と混じってしまい, 判別がしにくいため, 色をつけてみる. 

 

 2.2 デバッガとして用いる. 

  StartDebugger(path, args, sdir) : デバッガを実行する.

  add_bpt(ea, size, type) : ブレークポイントを設定する.

  enable_bpt(ea, bool) : ブレークポイントのEnable/Disable

 

 2.3  擬似コード(pseudocode)を生成する.

 

3. 実行

  File(Alt+F7) -> Script file... -> ファイル選択

 

4. 参考文献

https://www.hex-rays.com/products/ida/support/idapython_docs/

https://www.hex-rays.com/products/ida/support/sdkdoc/index.html

 

shellcode(3) 構造体編

1. はじめに

 shellcodeの解析の際に必要となった構造体情報を残しておく.

 

2. 構造体

・_TEB

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
+0x034 LastErrorValue : Uint4B
+0x038 CountOfOwnedCriticalSections : Uint4B
+0x03c CsrClientThread : Ptr32 Void
+0x040 Win32ThreadInfo : Ptr32 Void
+0x044 User32Reserved : [26] Uint4B
+0x0ac UserReserved : [5] Uint4B
+0x0c0 WOW32Reserved : Ptr32 Void
+0x0c4 CurrentLocale : Uint4B
+0x0c8 FpSoftwareStatusRegister : Uint4B
+0x0cc ReservedForDebuggerInstrumentation : [16] Ptr32 Void
+0x10c SystemReserved1 : [38] Ptr32 Void
+0x1a4 ExceptionCode : Int4B
+0x1a8 ActivationContextStackPointer : Ptr32 _ACTIVATION_CONTEXT_STACK
+0x1ac InstrumentationCallbackSp : Uint4B
+0x1b0 InstrumentationCallbackPreviousPc : Uint4B
+0x1b4 InstrumentationCallbackPreviousSp : Uint4B
+0x1b8 InstrumentationCallbackDisabled : UChar
+0x1b9 SpareBytes : [23] UChar
+0x1d0 TxFsContext : Uint4B
+0x1d4 GdiTebBatch : _GDI_TEB_BATCH
+0x6b4 RealClientId : _CLIENT_ID
+0x6bc GdiCachedProcessHandle : Ptr32 Void
+0x6c0 GdiClientPID : Uint4B
+0x6c4 GdiClientTID : Uint4B
+0x6c8 GdiThreadLocalInfo : Ptr32 Void
+0x6cc Win32ClientInfo : [62] Uint4B
+0x7c4 glDispatchTable : [233] Ptr32 Void
+0xb68 glReserved1 : [29] Uint4B
+0xbdc glReserved2 : Ptr32 Void
+0xbe0 glSectionInfo : Ptr32 Void
+0xbe4 glSection : Ptr32 Void
+0xbe8 glTable : Ptr32 Void
+0xbec glCurrentRC : Ptr32 Void
+0xbf0 glContext : Ptr32 Void
+0xbf4 LastStatusValue : Uint4B
+0xbf8 StaticUnicodeString : _UNICODE_STRING
+0xc00 StaticUnicodeBuffer : [261] Wchar
+0xe0c DeallocationStack : Ptr32 Void
+0xe10 TlsSlots : [64] Ptr32 Void
+0xf10 TlsLinks : _LIST_ENTRY
+0xf18 Vdm : Ptr32 Void
+0xf1c ReservedForNtRpc : Ptr32 Void
+0xf20 DbgSsReserved : [2] Ptr32 Void
+0xf28 HardErrorMode : Uint4B
+0xf2c Instrumentation : [9] Ptr32 Void
+0xf50 ActivityId : _GUID
+0xf60 SubProcessTag : Ptr32 Void
+0xf64 PerflibData : Ptr32 Void
+0xf68 EtwTraceData : Ptr32 Void
+0xf6c WinSockData : Ptr32 Void
+0xf70 GdiBatchCount : Uint4B
+0xf74 CurrentIdealProcessor : _PROCESSOR_NUMBER
+0xf74 IdealProcessorValue : Uint4B
+0xf74 ReservedPad0 : UChar
+0xf75 ReservedPad1 : UChar
+0xf76 ReservedPad2 : UChar
+0xf77 IdealProcessor : UChar
+0xf78 GuaranteedStackBytes : Uint4B
+0xf7c ReservedForPerf : Ptr32 Void
+0xf80 ReservedForOle : Ptr32 Void
+0xf84 WaitingOnLoaderLock : Uint4B
+0xf88 SavedPriorityState : Ptr32 Void
+0xf8c ReservedForCodeCoverage : Uint4B
+0xf90 ThreadPoolData : Ptr32 Void
+0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void
+0xf98 MuiGeneration : Uint4B
+0xf9c IsImpersonating : Uint4B
+0xfa0 NlsCache : Ptr32 Void
+0xfa4 pShimData : Ptr32 Void
+0xfa8 HeapVirtualAffinity : Uint2B
+0xfaa LowFragHeapDataSlot : Uint2B
+0xfac CurrentTransactionHandle : Ptr32 Void
+0xfb0 ActiveFrame : Ptr32 _TEB_ACTIVE_FRAME
+0xfb4 FlsData : Ptr32 Void
+0xfb8 PreferredLanguages : Ptr32 Void
+0xfbc UserPrefLanguages : Ptr32 Void
+0xfc0 MergedPrefLanguages : Ptr32 Void
+0xfc4 MuiImpersonation : Uint4B
+0xfc8 CrossTebFlags : Uint2B
+0xfc8 SpareCrossTebBits : Pos 0, 16 Bits
+0xfca SameTebFlags : Uint2B
+0xfca SafeThunkCall : Pos 0, 1 Bit
+0xfca InDebugPrint : Pos 1, 1 Bit
+0xfca HasFiberData : Pos 2, 1 Bit
+0xfca SkipThreadAttach : Pos 3, 1 Bit
+0xfca WerInShipAssertCode : Pos 4, 1 Bit
+0xfca RanProcessInit : Pos 5, 1 Bit
+0xfca ClonedThread : Pos 6, 1 Bit
+0xfca SuppressDebugMsg : Pos 7, 1 Bit
+0xfca DisableUserStackWalk : Pos 8, 1 Bit
+0xfca RtlExceptionAttached : Pos 9, 1 Bit
+0xfca InitialThread : Pos 10, 1 Bit
+0xfca SessionAware : Pos 11, 1 Bit
+0xfca LoadOwner : Pos 12, 1 Bit
+0xfca LoaderWorker : Pos 13, 1 Bit
+0xfca SpareSameTebBits : Pos 14, 2 Bits
+0xfcc TxnScopeEnterCallback : Ptr32 Void
+0xfd0 TxnScopeExitCallback : Ptr32 Void
+0xfd4 TxnScopeContext : Ptr32 Void
+0xfd8 LockCount : Uint4B
+0xfdc WowTebOffset : Int4B
+0xfe0 ResourceRetValue : Ptr32 Void
+0xfe4 ReservedForWdf : Ptr32 Void
+0xfe8 ReservedForCrt : Uint8B
+0xff0 EffectiveContainerId : _GUID

  

・_PEB

0:000> dt _PEB
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
+0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
+0x014 SubSystemData : Ptr32 Void
+0x018 ProcessHeap : Ptr32 Void
+0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION
+0x020 AtlThunkSListPtr : Ptr32 Void
+0x024 IFEOKey : Ptr32 Void
+0x028 CrossProcessFlags : Uint4B
+0x028 ProcessInJob : Pos 0, 1 Bit
+0x028 ProcessInitializing : Pos 1, 1 Bit
+0x028 ProcessUsingVEH : Pos 2, 1 Bit
+0x028 ProcessUsingVCH : Pos 3, 1 Bit
+0x028 ProcessUsingFTH : Pos 4, 1 Bit
+0x028 ReservedBits0 : Pos 5, 27 Bits
+0x02c KernelCallbackTable : Ptr32 Void
+0x02c UserSharedInfoPtr : Ptr32 Void
+0x030 SystemReserved : [1] Uint4B
+0x034 AtlThunkSListPtr32 : Uint4B
+0x038 ApiSetMap : Ptr32 Void
+0x03c TlsExpansionCounter : Uint4B
+0x040 TlsBitmap : Ptr32 Void
+0x044 TlsBitmapBits : [2] Uint4B
+0x04c ReadOnlySharedMemoryBase : Ptr32 Void
+0x050 SparePvoid0 : Ptr32 Void
+0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void
+0x058 AnsiCodePageData : Ptr32 Void
+0x05c OemCodePageData : Ptr32 Void
+0x060 UnicodeCaseTableData : Ptr32 Void
+0x064 NumberOfProcessors : Uint4B
+0x068 NtGlobalFlag : Uint4B
+0x070 CriticalSectionTimeout : _LARGE_INTEGER
+0x078 HeapSegmentReserve : Uint4B
+0x07c HeapSegmentCommit : Uint4B
+0x080 HeapDeCommitTotalFreeThreshold : Uint4B
+0x084 HeapDeCommitFreeBlockThreshold : Uint4B
+0x088 NumberOfHeaps : Uint4B
+0x08c MaximumNumberOfHeaps : Uint4B
+0x090 ProcessHeaps : Ptr32 Ptr32 Void
+0x094 GdiSharedHandleTable : Ptr32 Void
+0x098 ProcessStarterHelper : Ptr32 Void
+0x09c GdiDCAttributeList : Uint4B
+0x0a0 LoaderLock : Ptr32 _RTL_CRITICAL_SECTION
+0x0a4 OSMajorVersion : Uint4B
+0x0a8 OSMinorVersion : Uint4B
+0x0ac OSBuildNumber : Uint2B
+0x0ae OSCSDVersion : Uint2B
+0x0b0 OSPlatformId : Uint4B
+0x0b4 ImageSubsystem : Uint4B
+0x0b8 ImageSubsystemMajorVersion : Uint4B
+0x0bc ImageSubsystemMinorVersion : Uint4B
+0x0c0 ActiveProcessAffinityMask : Uint4B
+0x0c4 GdiHandleBuffer : [34] Uint4B
+0x14c PostProcessInitRoutine : Ptr32 void
+0x150 TlsExpansionBitmap : Ptr32 Void
+0x154 TlsExpansionBitmapBits : [32] Uint4B
+0x1d4 SessionId : Uint4B
+0x1d8 AppCompatFlags : _ULARGE_INTEGER
+0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER
+0x1e8 pShimData : Ptr32 Void
+0x1ec AppCompatInfo : Ptr32 Void
+0x1f0 CSDVersion : _UNICODE_STRING
+0x1f8 ActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA
+0x1fc ProcessAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP
+0x200 SystemDefaultActivationContextData : Ptr32 _ACTIVATION_CONTEXT_DATA
+0x204 SystemAssemblyStorageMap : Ptr32 _ASSEMBLY_STORAGE_MAP
+0x208 MinimumStackCommit : Uint4B
+0x20c FlsCallback : Ptr32 _FLS_CALLBACK_INFO
+0x210 FlsListHead : _LIST_ENTRY
+0x218 FlsBitmap : Ptr32 Void
+0x21c FlsBitmapBits : [4] Uint4B
+0x22c FlsHighIndex : Uint4B
+0x230 WerRegistrationData : Ptr32 Void
+0x234 WerShipAssertPtr : Ptr32 Void
+0x238 pUnused : Ptr32 Void
+0x23c pImageHeaderHash : Ptr32 Void
+0x240 TracingFlags : Uint4B
+0x240 HeapTracingEnabled : Pos 0, 1 Bit
+0x240 CritSecTracingEnabled : Pos 1, 1 Bit
+0x240 LibLoaderTracingEnabled : Pos 2, 1 Bit
+0x240 SpareTracingBits : Pos 3, 29 Bits
+0x248 CsrServerReadOnlySharedMemoryBase : Uint8B
+0x250 TppWorkerpListLock : Uint4B
+0x254 TppWorkerpList : _LIST_ENTRY
+0x25c WaitOnAddressHashTable : [128] Ptr32 Void

 

・_PEB_LDR_DATA

0:000> dt _PEB_LDR_DATA
ntdll!_PEB_LDR_DATA
+0x000 Length : Uint4B
+0x004 Initialized : UChar
+0x008 SsHandle : Ptr32 Void
+0x00c InLoadOrderModuleList : _LIST_ENTRY
+0x014 InMemoryOrderModuleList : _LIST_ENTRY
+0x01c InInitializationOrderModuleList : _LIST_ENTRY
+0x024 EntryInProgress : Ptr32 Void
+0x028 ShutdownInProgress : UChar
+0x02c ShutdownThreadId : Ptr32 Void

 

・_LIST_ENTRY

0:000> dt _LIST_ENTRY
ntdll!_LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY

 

・_LDR_DATA_TABLE_ENTRY

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
+0x024 FullDllName : _UNICODE_STRING
+0x02c BaseDllName : _UNICODE_STRING
+0x034 FlagGroup : [4] UChar
+0x034 Flags : Uint4B
+0x034 PackagedBinary : Pos 0, 1 Bit
+0x034 MarkedForRemoval : Pos 1, 1 Bit
+0x034 ImageDll : Pos 2, 1 Bit
+0x034 LoadNotificationsSent : Pos 3, 1 Bit
+0x034 TelemetryEntryProcessed : Pos 4, 1 Bit
+0x034 ProcessStaticImport : Pos 5, 1 Bit
+0x034 InLegacyLists : Pos 6, 1 Bit
+0x034 InIndexes : Pos 7, 1 Bit
+0x034 ShimDll : Pos 8, 1 Bit
+0x034 InExceptionTable : Pos 9, 1 Bit
+0x034 ReservedFlags1 : Pos 10, 2 Bits
+0x034 LoadInProgress : Pos 12, 1 Bit
+0x034 LoadConfigProcessed : Pos 13, 1 Bit
+0x034 EntryProcessed : Pos 14, 1 Bit
+0x034 ProtectDelayLoad : Pos 15, 1 Bit
+0x034 ReservedFlags3 : Pos 16, 2 Bits
+0x034 DontCallForThreads : Pos 18, 1 Bit
+0x034 ProcessAttachCalled : Pos 19, 1 Bit
+0x034 ProcessAttachFailed : Pos 20, 1 Bit
+0x034 CorDeferredValidate : Pos 21, 1 Bit
+0x034 CorImage : Pos 22, 1 Bit
+0x034 DontRelocate : Pos 23, 1 Bit
+0x034 CorILOnly : Pos 24, 1 Bit
+0x034 ReservedFlags5 : Pos 25, 3 Bits
+0x034 Redirected : Pos 28, 1 Bit
+0x034 ReservedFlags6 : Pos 29, 2 Bits
+0x034 CompatDatabaseProcessed : Pos 31, 1 Bit
+0x038 ObsoleteLoadCount : Uint2B
+0x03a TlsIndex : Uint2B
+0x03c HashLinks : _LIST_ENTRY
+0x044 TimeDateStamp : Uint4B
+0x048 EntryPointActivationContext : Ptr32 _ACTIVATION_CONTEXT
+0x04c Lock : Ptr32 Void
+0x050 DdagNode : Ptr32 _LDR_DDAG_NODE
+0x054 NodeModuleLink : _LIST_ENTRY
+0x05c LoadContext : Ptr32 _LDRP_LOAD_CONTEXT
+0x060 ParentDllBase : Ptr32 Void
+0x064 SwitchBackContext : Ptr32 Void
+0x068 BaseAddressIndexNode : _RTL_BALANCED_NODE
+0x074 MappingInfoIndexNode : _RTL_BALANCED_NODE
+0x080 OriginalBase : Uint4B
+0x088 LoadTime : _LARGE_INTEGER
+0x090 BaseNameHashValue : Uint4B
+0x094 LoadReason : _LDR_DLL_LOAD_REASON
+0x098 ImplicitPathOptions : Uint4B
+0x09c ReferenceCount : Uint4B

 

// 二階層

0:000> dt _LDR_DATA_TABLE_ENTRY -r2
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x008 InMemoryOrderLinks : _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x010 InInitializationOrderLinks : _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x018 DllBase : Ptr32 Void
+0x01c EntryPoint : Ptr32 Void
+0x020 SizeOfImage : Uint4B
+0x024 FullDllName : _UNICODE_STRING
+0x000 Length : Uint2B
+0x002 MaximumLength : Uint2B
+0x004 Buffer : Ptr32 Uint2B
+0x02c BaseDllName : _UNICODE_STRING
+0x000 Length : Uint2B
+0x002 MaximumLength : Uint2B
+0x004 Buffer : Ptr32 Uint2B
+0x034 FlagGroup : [4] UChar
+0x034 Flags : Uint4B
 (省略...)

 

・_IMAGE_DATA_DIRECTORY

0:000> dt _IMAGE_DATA_DIRECTORY
ntdll!_IMAGE_DATA_DIRECTORY
+0x000 VirtualAddress : Uint4B
+0x004 Size : Uint4B

 

・_IMAGE_EXPORT_DIRECTORY

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

/* ~ */は筆者注 

 

 

 

 

shellcode(2)

1. はじめに

 前回に引き続きshellcodeを生成して読んでみる.

 

 

2. shellcodeの生成

 Kali Linux内のmetasploitを利用してshellcodeを生成する.

 

root@kali:~# uname -a
Linux kali 4.5.0-kali1-amd64 #1 SMP Debian 4.5.3-2kali1 (2016-05-09) x86_64 GNU/Linux

 

root@kali:~# msfconsole

msf > use payload/windows/exec

msf payload(exec) > show options

Module options (payload/windows/exec):

Name Current Setting Required Description
---- --------------- -------- -----------
CMD yes The command string to execute
EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none)

msf payload(exec) > set CMD calc

msf payload(exec) > generate -h
Usage: generate [options]

Generates a payload.

OPTIONS:

-E Force encoding.
-b <opt> The list of characters to avoid: '\x00\xff'
-e <opt> The name of the encoder module to use.
-f <opt> The output file name (otherwise stdout)
-h Help banner.
-i <opt> the number of encoding iterations.
-k Keep the template executable functional
-o <opt> A comma separated list of options in VAR=VAL format.
-p <opt> The Platform for output.
-s <opt> NOP sled length.
-t <opt> The output format: bash,c,csharp,dw,dword,hex,java,js_be,js_le,num,perl,pl,powershell,ps1,py,python,raw,rb,ruby,sh,vbapplication,vbscript,asp,aspx,aspx-exe,dll,elf,elf-so,exe,exe-only,exe-service,exe-small,hta-psh,loop-vbs,macho,msi,msi-nouac,osx-app,psh,psh-net,psh-reflection,psh-cmd,vba,vba-exe,vba-psh,vbs,war
-x <opt> The executable template to use

 

msf payload(exec) > generate -f calc.bin -t raw

 

 

f:id:kmdnet:20160913131943p:plain

  はじめのブロックから読んでいく. call命令でEIPを積んでいる.

f:id:kmdnet:20160913132150p:plain

  pop ebpで先ほど積んだEIPをEBPに渡している. lea命令でebp+0xB2, つまり先ほどのEIPの0x6と0xB2を足した0xB8の値をeaxに渡している.

 

f:id:kmdnet:20160913132715p:plain

 0xB8を見てみると以上のようになっているが,以下のように解釈をさせる.

f:id:kmdnet:20160913132913p:plain

 つまりeaxに渡しているのは'calc'のアドレスである. call ebpでは先ほど積んだEIPつまり0x6に飛ぶことになる.

f:id:kmdnet:20160913133410p:plain

 fs:[eax+30h]はeaxが0であるため, fs:[30h]となりPEB(Process Environment Block)を指すことになる.そこからはshellcode(1)で書いたことと同じである.

なお[edx+28h]はモジュール名(BaseDLLName), [edx+26h]モジュール名長となる. (∵ +0x8)

 

0:000> dt _LDR_DATA_TABLE_ENTRY -r2
ntdll!_LDR_DATA_TABLE_ENTRY
   +0x000 InLoadOrderLinks : _LIST_ENTRY
      +0x000 Flink            : Ptr32 _LIST_ENTRY
         +0x000 Flink            : Ptr32 _LIST_ENTRY
         +0x004 Blink            : Ptr32 _LIST_ENTRY
      +0x004 Blink            : Ptr32 _LIST_ENTRY
         +0x000 Flink            : Ptr32 _LIST_ENTRY
         +0x004 Blink            : Ptr32 _LIST_ENTRY
   +0x008 InMemoryOrderLinks : _LIST_ENTRY
      +0x000 Flink            : Ptr32 _LIST_ENTRY
         +0x000 Flink            : Ptr32 _LIST_ENTRY
         +0x004 Blink            : Ptr32 _LIST_ENTRY
      +0x004 Blink            : Ptr32 _LIST_ENTRY
         +0x000 Flink            : Ptr32 _LIST_ENTRY
         +0x004 Blink            : Ptr32 _LIST_ENTRY
   +0x010 InInitializationOrderLinks : _LIST_ENTRY
      +0x000 Flink            : Ptr32 _LIST_ENTRY
         +0x000 Flink            : Ptr32 _LIST_ENTRY
         +0x004 Blink            : Ptr32 _LIST_ENTRY
      +0x004 Blink            : Ptr32 _LIST_ENTRY
         +0x000 Flink            : Ptr32 _LIST_ENTRY
         +0x004 Blink            : Ptr32 _LIST_ENTRY
   +0x018 DllBase          : Ptr32 Void
   +0x01c EntryPoint       : Ptr32 Void
   +0x020 SizeOfImage      : Uint4B
   +0x024 FullDllName      : _UNICODE_STRING
      +0x000 Length           : Uint2B
      +0x002 MaximumLength    : Uint2B
      +0x004 Buffer           : Ptr32 Uint2B
   +0x02c BaseDllName      : _UNICODE_STRING
      +0x000 Length           : Uint2B
      +0x002 MaximumLength    : Uint2B
      +0x004 Buffer           : Ptr32 Uint2B
   +0x034 FlagGroup        : [4] UChar

 

 

f:id:kmdnet:20161108135820p:plain

 

 edxがLdr->InMemoryOrderModuleListを指すため, [edx+10h]はDLLBaseを, [edx+3Ch]はe_lfanewを[ecx+edx+78h]はIMAGE_DATA_DIRECTORYである.

 次に[ecx+20h]はAddressOfNamesを[ecx+18h]はNumberOfNamesを示す.

typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;                /*+0x14*/
DWORD NumberOfNames;                 /*+0x18*/
DWORD AddressOfFunctions; // RVA from base of image    /*+0x1C*/
DWORD AddressOfNames; // RVA from base of image     /*+0x20*/
DWORD AddressOfNameOrdinals; // RVA from base of image /*0x24*/
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
/* ~ */は筆者注 

 

 IMAGE_EXPORT_DIRECTORY

・ AddressOfFunctions : Export Address Table (EAT) 

・ AddressOfNames : 関数名のRVA

・ AddressOfNameOrdinals : EATのn番目の要素

 

 仮にN番目の時に関数のハッシュと一致したとする. そのN番目の値をAddressOfNameOrdinalsの配列の要素として取り出し, それを序数 (ordinal) としてAddressOfFunctions (EAT) の配列の要素とする. そうして取り出した値が目的関数のRVAとなる.

つまり

 AddressOfNameOrdinals[AddressOfNameOrdinals[N]]

として関数のアドレスを導出する.

なおそれぞれの要素数は, 以下のようになる.

 AddressOfFunctions[NumberofFunctions]

 AddressOfNames[NumberOfNames]

 AddressOfNameOrdinals[NumberOfNames]

 

 loc_4Fはshellcode(1)と同じくハッシュの生成を行なっている.

f:id:kmdnet:20161108142740p:plain

 

 eaxはスタックからIMAGE_EXPORT_DIRECTORYを戻しているため, [eax+24h]はAddressOfNameOrdinalsであり[ebx+ecx*2]は序数(ordinals)である. ここでecxはecx番目に目的関数を一致した値であり, 上記のNに当たる. また[eax+1Ch]はAddressOfFunctionsであり, [ebx+ecx*4]は目的関数のRVAである. 

 ここでecxを2倍, 4倍しているのはAddressOfNameOrdinalsの要素のサイズが2バイト,EAT)の要素のサイズは4バイトであるからである.

 

 前回と同様にAPIハッシュを計算するプログラムを作成した. 前回との変更点は, 最終的にモジュールのハッシュをAPIのハッシュに加算する箇所である. 同様にIDAに読み込ませるとWinExecとExitProcessが呼ばれていることがわかる.

 

 

f:id:kmdnet:20161109194759p:plain

 

 

3.  おまけ

 shellcodeを実際に実行してみる. 引数にPIDを与えてやるとコードインジェクションを行い, 実際に電卓が起動することが確認できる. 

 

 

4 . 参考

http://www.openrce.org/reference_library/files/reference/PE%20Format.pdf

リバースエンジニアリング入門(5):PEフォーマットを解釈せよ! (1/3) - @IT

Yara

1. はじめに

YARAについての覚書として.

YARAとはマルウェア等を識別するツールである. いわゆるシグネチャマッチングができる. 

 

YARA is nutshell

 

 

2.  rule

今回テストとしてEICARテストファイルを使用する. 

テンプレートを示しておく. conditionに判定を記述する.

なおコメントアウトは/* ~ */ or // で記述する.

インデント等は自由に記述できる

・strings

 文字列を特定する. stringsでは16進数, 文字列, 正規表現を利用できる.

 文字列 "EICAR-STANDARD-ANTIVIRUS-TEST-FILE" かつ16進数として 0x58 0x35 0x4f 0x21 を含む, もしくは 0x58 0x35 0x4f 0x21 0x50 0x25 or 0x58 0x35 0x11 0x11 0x50 0x25 のファイルを検知する.

# yara EICAR_string_rule.yara eicar.com

Eicar_rule eicar.com

 

 

・hash

 各種hashが利用できる. 今回はmd5, sha1, sha256を使用した. 

 hashモジュールをimportする. import hashではなくimport "hash"とすることに注意.

 なお md5(offset,size)である.

 

 

 ImportHashも利用できる.

 peモジュールをimportする.

 

・その他

 様々なモジュールが利用できる. Cuckooとも連携したり, エントロピーで判定できたりする.

 詳しくは参考文献参考.

 

3. 参考文献

YARA - The pattern matching swiss knife for malware researchers

Writing YARA rules — yara 3.5.0 documentation

Modules — yara 3.5.0 documentation

 

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("R0lGODlh2AEoA+f/ABQPDQ8RDxITGyASFBQVHBQWExcVGBsUGBkVFB8TGRwWEB4UHhEYHhQYGhgYEBYYFhgYHxgaFxcbHRwaHSAZHB4aGSYYHhocGh0dFiEcFiAbJScbFx0eHBcgHhweJhsgFxYgJyQhISEiICMiGychGyggIikoJykpIi0oIiwpLiYsJiMsMCgqOCwsIDQpJzgpITspGjIrITItGzAvLTIvKTs0MTU2MU4xIFUxFEo1Hjk3Pkg1JjA6Pzo5LUI3LkA5J0I7Nzw9Nz5FPkZDPl0/LGU/KUJGTU9GL0hHOlhELlREPE5GO01HNlJFQldFOGJEI0ZNRU5LRYFBI3ZJJ1VSTXdMM2hRPHJQKnBQMGxRNVBXUGVSRFpVSVBWXVxVRGBVO2BTT2NTSlxZU5BTO4RaRIhaOnhfSnxfQ3RgUn9fPoJfOG9hXXBjSXNhWGtkUmdkX2pkWF9nX6BaOV5semZrb5VkO6FhO6FiSpdoSYBuZY1tS5BtRIhuWH9xVoxuUXpyYIRvYXlyZn5wbHRzbbJyVql3VqF7Tat4Tpt7YZR8cp98Wo9/b6B9VX+DgIyAeHSFjpGAa5WAYYSDd4iBgbqHYbCMY66MbKCOhqKPebONXaWRY5OSkKSQcpqSgJeSiaqRa4iWoZKirLudd8yZccKccbCelbagcLiegaaimLKgiqOjobOigKujkMqefsujbNGrf8uujcGvpMOxjruyn8KxmbezqciygbiysrG4tbrCvcS/vrjExea8j+C8odXBpNPAtsjEuczEsNvCmc3Fpea/muDElMLLxszIzr/MzcnKx8fMzs3SzsHV3snU1ejSqPPOsOPRxufStt7Vtd7Uy9bXy9nV2N7WwdHc3tjb2OPj4eTk19/k5/fittnm5/vgxOrm0fHlx/Pk0fDm3fDq6unt6eLv8Ozu4ufu9Oj19uv0/P7y5On46/D1+PD37Pj17P322O748/X28+v5+fv66P/3/fb7/vX98f/6+fD+/vr8+fX/+v799P/8//n+//3//P///yH+CEVudHJldnVlACH5BAEKAP8ALAAAAADYASgDAAj+AM21G0hQIMGDCBMqHGivob2DDiNKnMhw4kOCESs2HKjPosePICfqG0mypMmTJv35I7mvpct9Kv29VImypr58OHPijMmzp8+f+3TeG3ov38t57ty1pMnypbt8MfvFtDevasuh/vLFg5o1a75+/OrVk/qzrNmzaNOqXctWrc23cOPKLck0n9i7dw0e1Luw78KMGENSbOcRokONFwUrXtxwblym+l66jDlzpWOdOtuaDeqVKFeX9iTvK2nU5VOu/cg2tLpvaE6VXFH3G6u5tu3buGs73s0bbl28eP0KH274IuLFxS0mBMy4OcjeckXDlCnZ8lzMr3PHhHrPn2vK0rv++osHL17S81uhpla5j+q8fe6GjotNfzs/rtrz69+fFrp/m9hltp1dwIlF3IHCbZScYgh9tNxhxzkn4X9vSWfhaJcFmN9rOBXVk2g9xSOiiOe5s5U//JDVnlXxjUNOPF5lJeJOWfHD34044kjhjiQFKGBOBRqI4JDEQdiXkQsqmFySEjLmGDxQRhnlSfBcKN1uPuq3E1T4wQafUtPlc5M+UZKIHlQpsudeUuOMI855MMVDzosn5mjnnbnxuBs8VPoYYJBi8TWQoEQiqGSCf0n04KFNNrmnlJCWBKWVX7qEpYZ45mQemDmVB08+ULpDjjmkmhPfPTaqWRVS4rRqzpv+SWmDzZx14mnrrf3pOReUkn7qJ2aA1kPqXgYRWuixyCKm7HERNirSk5BK2SulSVmaIXZlZcmWTiOWaKKJ5YlITjbalGtqUfzwU1RLq6rT6jTaiOOuNtRQY86LXeKqr1o08tSvW7qeFGB63I5o8IzAAjpsQQKVmuzDCh2aKGDNJubsR3xCGy2vJE16YYktXYrtT9r6lNNI2JFoHqkliktOufXWq825KK676jzquAuNNTmLAwwwyZj61L5Ep5XdgH6WFbBJPhKs6cEGYxfswoOWarWxEGd9rKKLftSxtNGSqfHGvW6cMYW/jmwyfVyRCY9SWsFX7jTU6FJLJ6jUAoz+OeoI7Q699QJTi73uiEPUPqt+o7g41gTD8zfBsPJLvEl1uF++/xa94dEDLk1a2joVyA479YzOTmqlK8zX1VZr7frDXDcY0khh184xXGbf7rbZPIIuoMmw6SSaO+pQI3gsqCTfySLMQ9LJ4DjPY069jQcTzDc5w5n4N+GEY0004Hg/i+TZK/WUh9phnq/muf3eueco+46T6KSPPtZsU6/OOtWv93/gYLKTGEF4Zzvd1SR3Z9sd2XYkv8ytbSdgQpw2BNeJTpQiFrX4xS9ikQpasAISf/jDImZhDe55zxrW8MUwpBGOnLmwKu8AB/ii4YsZ0qKDJSwf3DDVFvWx73L+nAse/FAWLPoBinSoy1+x9sc//znRL7FjkkQQSEXcIZB2V2RgA82CGfZUZYKsYEUnUjGLXwQDGmiMBS184QtaYAISkBihL7oXjTr6QhY17J44uhcOcIBDGtKwoy8AuQpO0AKFruJUydbiwx8ajYdecSBOeGRAfcSjiMCxX7CSqDomXu2JoIQixXiHEg==");

  このように入力を受け入れ一致すれば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