UBoatRAT(解析)

はじめに

元ネタはこれ.

researchcenter.paloaltonetworks.com

今更だけどちょっと興味のある箇所があったので実際に解析してみた.

検体

・ドロッパー : f4c659238ffab95e87894d2c556f887774dce2431e8cb87f881df4e4d26253a3

・UBoatRAT : 460328fe57110fc01837d80c0519fb99ea4a35ea5b890785d1e88c91bea9ade5

ドロッパー

・UPXでパックされているためアンパックしてやると読めるようになる.

解析環境の検知として2種類の方法を取っている. 詳細はソースコード参照.

  • AntiVM(qemu, virtual, vmware)
  • ※VirutalBoxだと"vbox harddisk"となるので検知不可:(
  • ネットワークのドメイン
f:id:kmdnet:20180213143308p:plain

以下ソースコード

UboatRAT

必要なところだけ

アンチデバッグ機構がDropperと全く同じなので, ドメイン名を適当に埋めてやり, VirtualBox上で解析を行うと, とりあえず動くようになる.

  • ShellExecuteW(NULL,L"open",L"cmd.exe" ,L"/c c:\\programdata\\init.bat", NULL,SW_HIDE);
  • ShellExecuteW(NULL,L"open", L"(同一のパス&ファイル名).xlsx", NULL, NULL, SW_SHOW);

%programdata%\\init.bat

f:id:kmdnet:20180216221843p:plain

%programdata%\\init.batの中身

f:id:kmdnet:20180216221917p:plain

 

ちょっとした補足

uninstall?

"unst"という引数で以下の処理を行うように作られていた

f:id:kmdnet:20180216222656p:plain

デバッグ

デバッグする際にShellExecuteW, GetNetworkParamsあたりを見ておくと幸せになれるかも.

所感

cmd /c...

svchost・servicesについてのメモ

メモ1(関連するプロセス)

  • services.exe ("C:\Windows\System32\services.exe")
  • サービスコトロールマネージャ(Service Control Manager : SCM)
  • svchost.exe ("C:\Windows\System32\svchost.exe")
  • サービスホスト(Service Host)

メモ2 (プロセスと関連しているサービスを調べる)

例) tasklist(一部抜粋)


PS C:\Users\IEUser> tasklist.exe /svc

Image Name                     PID Services
========================= ======== ============================================
System Idle Process              0 N/A
System                           4 N/A
smss.exe                       216 N/A
csrss.exe                      292 N/A
csrss.exe                      328 N/A
wininit.exe                    336 N/A
winlogon.exe                   364 N/A
services.exe                   424 N/A
lsass.exe                      432 SamSs
lsm.exe                        440 N/A
svchost.exe                    548 DcomLaunch, PlugPlay, Power
svchost.exe                    664 RpcEptMapper, RpcSs
svchost.exe                    756 Audiosrv, Dhcp, eventlog, lmhosts, wscsvc
svchost.exe                    816 AudioEndpointBuilder, CscService, Netman,
                                   PcaSvc, TrkWks, UmRdpService, UxSms
svchost.exe                    848 EventSystem, FontCache, netprofm, nsi,
                                   sppuinotify, WdiServiceHost,
                                   WinHttpAutoProxySvc
svchost.exe                    872 AeLookupSvc, BITS, CertPropSvc, gpsvc,
                                   iphlpsvc, LanmanServer, MMCSS, ProfSvc,
                                   Schedule, SENS, SessionEnv,
                                   ShellHWDetection, Themes, Winmgmt, wuauserv
svchost.exe                   1132 CryptSvc, Dnscache, LanmanWorkstation,
                                   NlaSvc, TermService
svchost.exe                   1260 BFE, DPS, MpsSvc
svchost.exe                   2944 WinDefend
svchost.exe                   4020 SSDPSRV



BITS(Background Intelligent Transfer Service)はPID:872のsvchostを調べてみるとサービスとして登録されていることがわかる.

f:id:kmdnet:20170912173020p:plain

 

メモ3(Serviceの調査)

scというSCMとサービスと通信するためのコマンドラインプログラムがある(注: PowerShellではscはSet-Contentが割り当てられている).scを用いてサービスについて調査を行う.

例2) scを用いたサービスの列挙(PowerShellでSelect-Stringで抜粋)


PS C:\Users\IEUser> C:\Windows\System32\sc.exe query | Select-String BITS -Context 0,8

> SERVICE_NAME: BITS
  DISPLAY_NAME: Background Intelligent Transfer Service
          TYPE               : 20  WIN32_SHARE_PROCESS
          STATE              : 4  RUNNING
                                  (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
          WIN32_EXIT_CODE    : 0  (0x0)
          SERVICE_EXIT_CODE  : 0  (0x0)
          CHECKPOINT         : 0x0
          WAIT_HINT          : 0x0



例3) サービスの照会


 PS C:\Users\IEUser> C:\Windows\System32\sc.exe qc BITS
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: BITS
        TYPE               : 20  WIN32_SHARE_PROCESS
        START_TYPE         : 2   AUTO_START  (DELAYED)
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\Windows\System32\svchost.exe -k netsvcs
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Background Intelligent Transfer Service
        DEPENDENCIES       : RpcSs
                           : EventSystem
        SERVICE_START_NAME : LocalSystem   
  



おまけ

  • winlogon.exe("C:\Windows\System32\winlogon.exe")
  • ログオンプロセス.
  • csrss.exe("C:\Windows\System32\csrss.exe")
  • Windowsサブシステム
  • explorer.exe("C:\Windows\explorer.exe")
  • explorer.exeの親プロセスはUserinitプロセス

参考文献

インサイド MS WINDOWS 第4版 上

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