μ§λλ² λΆμνλ .NET μ μ±μ½λλ₯Ό μ΄μ΄μ λΆμν΄λ³΄κ² μ΅λλ€.
μν ν΄μ(SHA256)λ ed22dd68fd9923411084acc6dc9a2db1673a2aab14842a78329b4f5bb8453215μ λλ€.
β (stage 3) DotNetZipAdditionalPlatforms λͺ¨λ λΆμ
ν΄λΉ λ°μ΄ν°λ λλ ν ν΄μ λ λ°μ΄ν°λ‘ λ©λͺ¨λ¦¬μ λ‘λν΄μ£Όκ² μ΅λλ€.
- λλ ν ν΄μ νμ¬ λ‘λνκΈ°
μκΉμ²λΌ de4dot λλ
ν ν΄μ ν΄μ£Όλ €κ³ ν©λλ€. μ΄λ²μλ λλ
ν μ΅μ
(Deobfuscator option)μ μ§μ ν΄μ,
de4dot <target_file> -p dr3 -o <renamed_file>μ μ¬μ©νμμ΅λλ€. .NET Reactor 3.xμΌλ‘ λλ
νλμ΄ μμΌλ dr3 μ΅μ
μΌλ‘ μ§μ ν΄μ£Όκ² μ΅λλ€.
κΉλνκ²λ μλμ§λ§ μ΄μ λλ©΄ μΈλ§ν©λλ€.
μκΉλ λκ°μ΄ λ°μ΄ν°κ° μ μ₯λ λ³μ byte_μ memoryμ λΆμ¬λ£κ³ μ€ννκ² μ΅λλ€.
λͺ¨λ DotNetZipAdditionalPlatformsμ΄ μΆκ°μ μΌλ‘ μ λ‘λλ κ²μ νμΈνμ΅λλ€.
λ€μ μ½λλ‘ λμμ€λ λ‘λλλ λͺ¨λμμ Class12 ν΄λμ€μ smethod_10 λ©μλλ₯Ό μ¬μ©νλ €λ κ² κ°μ΅λλ€.
ν΄λΉ λ©μλμ .cctorμ breakpointλ₯Ό κ±Έκ³ μ€νν΄λ³΄κ² μ΅λλ€.
.cctor()μμ ννΈλμ΄ λ©μ·μ΅λλ€.
ν΄λΉ ν΄λμ€λ₯Ό μμΈν λΆμν΄λ³΄κ² μ΅λλ€.
- DotNetZipAdditionalPlatforms(stage 3) λΆμνκΈ°: β .cctor()
[line 6]
리μμ€λ₯Ό 리쑸λΉνκΈ° μν΄ Class48.smethod_2 λ©μλλ₯Ό μ΄λ²€νΈ νΈλ€λ¬λ‘ λ±λ‘ν©λλ€.
ResourceResolve μ΄λ²€νΈκ° λ°μν λλ§λ€ Class48.smethod_2 λ©μλκ° νΈμΆλλλ°, smethod_2 λ©μλλ 리μμ€λ₯Ό μ°Ύμ μ μμ λ ν΄λΉ 리μμ€λ₯Ό 리쑸λΉν λ°©λ²μ΄ μ μλ λ©μλμΈ κ² κ°μ΅λλ€.
- AppDomain.CurrentDomain.ResourceResolve
- νΉμ 리μμ€λ₯Ό λμ μΌλ‘ 리쑸λΉνλλ° μ¬μ©λλ μ΄λ²€νΈ
- μ£Όλ‘ μ΄μ λΈλ¦¬ λ΄ λ¦¬μμ€λ μΈλΆ 리μμ€κ° λ‘λλμ§ μκ±°λ μ°Ύμ μ μμ λ λ°μ
[line 8]
Class44.smethod_11λ₯Ό νΈμΆνμ¬ Class12.string_0 κ°(deJGfXGlPZoPd)μ κ°μ Έμ΅λλ€.
smethod_11λ AES 볡νΈν 루ν΄μΌλ‘ μΆμΈ‘λ©λλ€.
[line 72-77]
smethod_8κ³Ό smethod_11 λ©μλλ₯Ό μ΄μ©ν΄μ 볡νΈνλ λ¬Έμμ΄μ λ°νν©λλ€.
smethod_8 λ©μλλ GetDelegateForFunctionPointer()λ₯Ό ν΅ν΄ λ€μ΄ν°λΈ ν¨μμ λν ν¬μΈν°λ₯Ό .NET μ½λ λ΄μμ νΈμΆν μ μλλ‘ λΈλ¦¬κ²μ΄νΈ νμ μΌλ‘ λ³νν©λλ€.
- λΈλ¦¬κ²μ΄νΈ(delegate)
- μ μ
- νΉμ μκ·Έλμ²λ₯Ό κ°μ§ λ©μλλ₯Ό κ°λ¦¬ν€λ νμ μΌλ‘ νΉμ νμμ λ©μλ μ°Έμ‘°λ₯Ό μ μ₯ν μ μλ λ³μ
- μΈμ λ μ§ νΈμΆν μ μλ λ©μλ λλ λ©μλ λͺ©λ‘μ λν μ°Έμ‘°(ν¬μΈν°)λ₯Ό μ 곡νλ κ°μ²΄(λ°μ΄ν° ꡬ쑰체/ν΄λμ€)
- νΉμ§
- λ©μλμ ν¬μΈν°λΌκ³ μκ°ν μ μμ΅λλ€.
- λ§€κ°λ³μμ λ°νκ°μ μκ·Έλμ²κ° μΌμΉνλ λ©μλλ§ μ°Έμ‘°ν μ μμ΅λλ€.
- λΈλ¦¬κ²μ΄νΈ νμ μ λ©μλμ μ£Όμ(ν¨μ ν¬μΈν°μ μ μ¬), ν΄λΉ νλΌλ―Έν°, λ°ν νμ μ 보μ νκΈ° λλ¬Έμ κ΅¬μ‘°μ²΄λ‘ ν΄μν μ μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ λͺλͺ κ°μ λ¬Έμμ΄μ μΈμλ‘ λ°κ³ , λ€λ₯Έ λ¬Έμμ΄μ λ°ννλ ν¨μμ λν λΈλ¦¬κ²μ΄νΈ νμ λ λ§λ€ μ μμλλ€.
- λΈλ¦¬κ²μ΄νΈ ν€μλλ₯Ό μ¬μ©νμ¬ λΈλ¦¬κ²μ΄νΈ νμ μ μ μνλ©΄ λΈλ¦¬κ²μ΄νΈμ νμν λͺ¨λ μ 보λ₯Ό 곡μ νλ ν΄λμ€(λ°μ΄ν° ꡬ쑰체)κ° μμ±λ©λλ€.
- μ μ
- GetDelegateForFunctionPointer
- .NETμμ λ€μ΄ν°λΈ μ½λ(ex, C, C++)μ ν¨μ ν¬μΈν°λ₯Ό λΈλ¦¬κ²μ΄νΈλ‘ λ³ννλ λ©μλ
Class12λ λ§μ λΈλ¦¬κ²μ΄νΈλ₯Ό μ¬μ©νκ³ μκ³ λͺ¨λ λ€μ΄ν°λΈ ν¨μλ₯Ό λ°ννκ³ μμ΅λλ€.
λ°νλ APIλ₯Ό 보λ code injectionμ μ¬μ©λλ VirtualAllocEx, WriteProcessMemory, SetThreadContext, ResumeThreadκ° μμ΅λλ€.
μ΅μ’ μ μΌλ‘ .cctor()λ λ€μ΄ν°λΈ ν¨μμ λν λΈλ¦¬κ²μ΄νΈ(μ°Έμ‘°)λ₯Ό μμ±νλλ° μ¬μ©λκ³ μμ΅λλ€.
λΈλ¦¬κ²μ΄νΈμ λ°νλ APIλ₯Ό μ 리νμλ©΄ λ€μκ³Ό κ°μ΅λλ€.
- Class12.delegate0_0 → "ResumeThread"
- Class12.delegate1_0 → "Wow64SetThreadContext"
- Class12.delegate2_0 → "SetThreadContext"
- Class12.delegate3_0 → "Wow64GetThreadContext"
- Class12.delegate4_0 → "GetThreadContext"
- Class12.delegate5_0 → "VirtualAllocEx"
- Class12.delegate6_0 → “WriteProcessMemory"
- Class12.delegate7_0 → "ReadProcessMemory"
- Class12.delegate8_0 → "ZwUnmapViewOfSection"
- Class12.delegate9_0 → "CreateProcessA"
.cctor()κ° μ’ λ£λλ©΄ smethod_10 λ©μλκ° νΈμΆλ©λλ€.
- DotNetZipAdditionalPlatforms(stage 3) λΆμνκΈ°: β‘ smethod_10()
smethod_10 λ©μλμμλ λ§μ λ©μλκ° νΈμΆλκ³ μμ΅λλ€.
μ΄ μ€μμ μ΄λ€ λ©μλκ° μλ―Έκ° μμμ§ μμλ΄κ³ μΆμλ°!!
μκΉ .cctorμμμ λΈλ¦¬κ²μ΄νΈ μ 보λ₯Ό μ΄ν΄λ³΄λ©΄ λͺ¨λ λΈλ¦¬κ²μ΄νΈκ° smethod_9μμ μ¬μ©λκ³ μλ€λ κ²μ μμλμ΅λλ€.
Analyze - Read By - Used Byμμ νΈμΆ μμλ₯Ό μ΄ν΄λ³΄λ smethod_10 → smethod_12 → smethod_9 μμλ‘ νΈμΆλλ κ²μ μκ² λμμ΅λλ€.
λ€μ μμλ‘ smethod_9λ₯Ό λΆμν΄λ³΄λ©΄ μ’μ κ² κ°μ΅λλ€.
- DotNetZipAdditionalPlatforms(stage 3) λΆμνκΈ°: β’ smethod_9()
smethod_9λ‘ κ°μ, μ¬μ©λλ λΈλ¦¬κ²μ΄νΈμ breakpointλ₯Ό μ€μ νκ³ λλ²κΉ ν΄λ³΄κ² μ΅λλ€.
κ·Έλ¦¬κ³ smethod_9 μ λ¨κ³λ‘ μ€νλλ smethod_10μλ breakpointλ₯Ό μ€μ νλ €κ³ νμΌλ, λ무 κΈΈμ΄μ μ΄ν΄νκΈ° νλ€ κ² κ°μ΅λλ€. κ·Έλμ λ€λ₯Έ smethod_#λ€μ μν λΆν° λΉ λ₯΄κ² μ΄ν΄λ΄μΌκ² μ΅λλ€.
smethod_# λΆμ
smethod_0
μ μ±μ½λκ° λΆμ μ€μ μ¬μ©λλ λꡬλ₯Ό νμ§νκΈ° μν΄ λ§μ΄ μ¬μ©νλ FindWindow()κ° μ‘΄μ¬ν©λλ€.
smethod_1
smethod_1λ mutex κ΄λ ¨ ν¨μλ₯Ό νΈμΆνμ¬ μ€λ³΅ μ€νμ νμ§ν©λλ€.
smethod_2
smethod_2λ smethod_3μμ μ 곡λ μ€λ λλ₯Ό μμνλ μν μ wrapperμ λλ€.
smethod_3
smethod_3μ νλ‘μΈμ€λ μ€λ λλ₯Ό κ΄λ¦¬νκΈ° μν ν¨μλ€μ νΈμΆνκ³ μμ΅λλ€.
smethod_4, smethod_5
smethod_4μ smethod_5μμλ DirectorySecurity, SetAccessControl, SetAccessRuleProtection, FileSystemAccessRule, AddAccessRule APIκ° μ¬μ©λλ κ²μ λ³Ό μ μμ΅λλ€. μ΄ APIλ€μ Windows νμΌ μμ€ν μμ νμΌμ΄λ λλ ν°λ¦¬μ λν μ κ·Ό κΆνμ κ΄λ¦¬νκΈ° μν΄ μ¬μ©νλ©°, ACL(Access Contorl List)λ₯Ό κ΄λ¦¬νκΈ° μν κ²μ λλ€.
- DirectorySecurity: ACLλ₯Ό κ΄λ¦¬νλλ° μ¬μ©λ©λλ€. λλ ν°λ¦¬μ 보μ μ 보μ μ κ·Όνκ³ μμ νλ κΈ°λ₯μ μ 곡ν©λλ€.
- SetAccessControl: νμΌμ΄λ λλ ν°λ¦¬μ ACLμ μ€μ νλλ° μ¬μ©λ©λλ€.
- SetAccessRuleProtection: νΉμ νμΌμ΄λ λλ ν°λ¦¬μ λν μμμ μ μ΄νλλ° μ¬μ©λ©λλ€. ACL μμ μ¬λΆλ₯Ό μ€μ ν μ μμ΅λλ€.
- FileSystemAccessRule: νΉμ νμΌ λλ λλ ν°λ¦¬μ λν μ κ·Ό κΆνμ μ μν©λλ€.
- AddAccessRule: μλ‘μ΄ μ κ·Ό κ·μΉμ μΆκ°νλλ° μ¬μ©λ©λλ€.
smethod_6
smethod_6λ μ¬λ¬ APIλ₯Ό νΈμΆνμ¬ νλ‘μΈμ€λ₯Ό μ€ν/κ΄λ¦¬νκ±°λ, νμΌμ μ²λ¦¬νλ κ² κ°μ μμ μ νκ³ μμ΅λλ€.
smethod_7
smethod_7μλ μΈν°λ·μμ λ€μ΄λ‘λ νλ κ³Όμ μ΄ μμ΅λλ€.
smethod_8
smethod_8μ .cctor()μ μν΄ νΈμΆλ©λλ€. κ·Έλ¦¬κ³ LoadLibraryAμ GetProcAddressλ₯Ό μ¬μ©ν©λλ€. μ΄λ λΈλ¦¬κ²μ΄νΈλ₯Ό ν΅ν΄ μ¬μ©λ λ€μ΄ν°λΈ API μ£Όμλ₯Ό μ°Ύλ κ² κ°μ΅λλ€.
smethod_9
smethod_9λ Invoke ν¨μλ₯Ό νΈμΆν©λλ€. μ΄λ―Έ μΈκΈλ λ€μ΄ν°λΈ APIλ€μ λΈλ¦¬κ²μ΄νΈλ₯Ό μ¬μ©νμ¬ νΈμΆνκ³ μμ΅λλ€.
smethod_11
smethod_11μ μ¬λ¬ APIλ₯Ό νΈμΆνμ§λ§ Assembly.Load()κ° κ°μ₯ λμ¬κ²¨ λ³Ό λμμ λλ€. ν΄λΉ μ€μ breakpointλ₯Ό μ€μ νκ³ μ§νν΄λ³΄λ©΄ μ’μ κ² κ°μ΅λλ€. μ΄ μλ‘μ΄ λͺ¨λμ΄ λ€μ λ¨κ³μ΄κ±°λ μ§μ λͺ¨λ(리μμ€)μΌ μλ μκΈ° λλ¬Έμ λλ€.
smethod_12, smethod_13
smethod_12λ smethod_13μ νλ‘μ λ©μλμ λλ€.
smethod_13μ GetEntryAssembly, get_Location, GetTypeFromHandle, InvokeMember λ©μλλ₯Ό νΈμΆνκ³ μλ κ²μΌλ‘ 보μ λ©μλ νΈμΆκ³Ό κ΄λ ¨λ μμ μ ν©λλ€.
κΈμ΄ κΈΈμ΄μ Έμ λ€μ ν¬μ€ν μμ μ΄μ΄μ λΆμν΄λ³΄κ² μ΅λλ€.
Ref. "Malware Analysis Series(MAS) – Article 4", Alexandre Borges