Malware/malware analysis

[Emotet ๋ถ„์„ (3)] ํ•ด์‹œ ๋ฆฌ์กธ๋น™ ๋ฐ C2 ์ •๋ณด ๋ณตํ˜ธํ™”

์œค์ •_ 2025. 2. 27. 11:13

๊ณ„์† ์ด์–ด์„œ Emotet ์•…์„ฑ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ํ•ด์‹œ(SHA256)๋Š” ed22dd68fd9923411084acc6dc9a2db1673a2aab14842a78329b4f5bb8453215์ž…๋‹ˆ๋‹ค.

 

 

 

[Hash Resolving]

โ— ๋ฆฌ์กธ๋น™ ์ •๋ณด ์ˆ˜์ง‘

์ง€๋‚œ๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณตํ˜ธํ™”ํ–ˆ๋”๋‹ˆ DLL/API ์ด๋ฆ„๋“ค์„ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ DLL์€ ๋™์ ์œผ๋กœ DLL/API ์ด๋ฆ„๋“ค์„ ๋ฆฌ์กธ๋น™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋“ค์„ ๋”ฐ๋ผ๊ฐ€ ์ƒํ™ฉ์„ ํŒŒ์•…ํ•˜๊ณ  ๊ฐ™์ด ๋ฆฌ์กธ๋น™์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค..

DllRegisterServer๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋กœ ํ˜ธ์ถœ๋˜๋Š” ์„œ๋ธŒ๋ฃจํ‹ด sub_5DF1FD0์œผ๋กœ ์ด๋™ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 1) sub_5DF1FD0 ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€

 

53๋ฒˆ์งธ ์ค„์˜ sub_5DFEBA2 ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ๋“ค์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Figure 2) sub_5DFEBA2 ์„œ๋ธŒ๋ฃจํ‹ด

 

ํŠน๋ณ„ํ•œ ๊ฒƒ์€ ์—†์—ˆ์œผ๋‹ˆ 6๋ฒˆ์งธ ์ค„์˜ sub_5DFEAA3์œผ๋กœ ๋“ค์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Figure 3) sub_5DFEAA3 ์„œ๋ธŒ๋ฃจํ‹ด

sub_5DFEAA3 ์„œ๋ธŒ๋ฃจํ‹ด์—๋Š” ๋‘ ๊ฐœ์˜ ํ˜ธ์ถœ(sub_5DE645E, sub_5DF1B22)๊ณผ ์ˆ˜์ƒํ•œ 16์ง„์ˆ˜ ์ˆซ์ž๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ์ค‘ 5๋ฒˆ์งธ ์ค„์˜ sub_5DE645E ์„œ๋ธŒ๋ฃจํ‹ด์„ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 4) sub_5DE645E ์„œ๋ธŒ๋ฃจํ‹ด

 

  • cdecl ํ˜ธ์ถœ ๊ทœ์•ฝ์ด ์“ฐ์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • 5๋ฒˆ์งธ ์ค„์˜ sub_5DFBFF0์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋Š” ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋ณด์ด๋Š”๋ฐ, ์ด๋Š” ๋ณดํ†ต ๋‚œ๋…ํ™” ๊ธฐ๋ฒ•์ด ์ ์šฉ๋œ ์•…์„ฑ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ๋ถ„์„ํ•  ๋•Œ ๋งŽ์ด ๋ณด์ด๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

  • ๋˜ํ•œ ๊ฐ™์€ ์ค„์—์„œ ๊ฐ’ ๋˜๋Š” ๋ฌธ์ž์—ด์„ ๋กœ์ปฌ ๋ณ€์ˆ˜ v1๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ํ•ด์‹œ ๋ฆฌ์กธ๋น™๊ณผ ๊ด€๋ จ๋œ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.

  • 6๋ฒˆ์งธ ์ค„์—์„œ v1์ด ํ•จ์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. v1์€ API ์ด๋ฆ„์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

  • ์ „์ฒด์ ์ธ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋‹ˆ sub_5DE645E๊ฐ€ ๋ž˜ํผ(wrapper) ํ•จ์ˆ˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด v1 ํ˜ธ์ถœ์— ์ธ์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ธ์ˆ˜๋“ค์ด ๋ชจ๋‘ ๊ฐ€์งœ ์ธ์ˆ˜๋กœ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. 

Figure 5) sub_5DE645E์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ

 

 

sub_5DFBFF0 ์„œ๋ธŒ๋ฃจํ‹ด์˜ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ 109๋ฒˆ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Figure 6) sub_5DFBFF0 ์„œ๋ธŒ๋ฃจํ‹ด ๊ต์ฐจ ์ฐธ์กฐ

๋งค์šฐ ๋งŽ์€ ํšŸ์ˆ˜์ด๋ฏ€๋กœ ๊ฝค๋‚˜ ์˜๋ฏธ์žˆ๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์ผ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ sub_5DFBFF0 ์„œ๋ธŒ๋ฃจํ‹ด์„ ์ž์„ธํžˆ ๋ถ„์„ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

โ— API ๋ฆฌ์กธ๋น™ ๋ฃจํ‹ด : sub_5DFBFF0 (mw_api_resolving)

Figure 7) sub_5DFBFF0 ์„œ๋ธŒ๋ฃจํ‹ด

ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. API ์ด๋ฆ„์„ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” dword ๋ฐฐ์—ด (line 6, 9, 11)
  2. ์Šคํƒ(ecx)์—์„œ ๊ฐ€์ ธ์˜จ v4 ์ธ์ž๋ฅผ ํ†ตํ•ด sub_5E01AE9๋ฅผ ํ˜ธ์ถœ
  3. sub_5DFB558 ํ˜ธ์ถœ ์‹œ์˜ ์ธ์ž ์ค‘ v5๋Š” sub_BA1AE9์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์ด๊ณ , a4๋Š” API ํ•ด์‹œ์ธ ๊ฒƒ์œผ๋กœ ์ถ”์ •๋˜๋Š” 16์ง„์ˆ˜ ํ˜•ํƒœ์˜ ๊ฐ’

 

๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ๋˜๋Š” ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜(sub_5E01AE9, sub_5DFB558)์— ๋Œ€ํ•ด์„œ๋„ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1) sub_5E01AE9 (mw_dll_hashing)

Figure 8) sub_5E01AE9 ์„œ๋ธŒ๋ฃจํ‹ด

ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ DLL ํ•ด์‹ฑ ๋ฆฌ์กธ๋น™์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ DLL ์ด๋ฆ„์„ ์ฐพ์•„ ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

6๋ฒˆ์งธ ์ค„์˜ sub_5DFAA52 ์„œ๋ธŒ๋ฃจํ‹ด์€ ๋‚ด๋ถ€ NtCurrentPeb ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด PEB(Process Environment Block)๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. 

Figure 9) sub_5DFAA52 ์„œ๋ธŒ๋ฃจํ‹ด

๋˜ํ•œ ๊ฐ™์€ ์ค„์—์„œ Ldr ํ•„๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”๋ฐ ์ด๋Š” PEB_LDR_DATA ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. PEB_LDR_DATA ๊ตฌ์กฐ์ฒด๋Š” ํ”„๋กœ์„ธ์Šค์— ๋กœ๋“œ๋œ DLL ๋ชจ๋“ˆ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋˜ํ•œ InLoadOrderModuleList๋Š” _LIST_ENTRY ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ, ์ด๋Š” ๋”๋ธ” ๋งํฌ๋“œ ๋ง์ŠคํŠธ(double linked list)๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ฝ”๋“œ์—์„œ sub_5DF40AF๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ด€๋ จ ํ•ด์‹œ๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„, ํ‚ค 0x23FECA30์œผ๋กœ XOR ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ณ„์‚ฐ๋œ ํ•ด์‹œ์™€ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ํ•ด๋‹น DLL์˜ ๊ธฐ๋ณธ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

์œ„์—์„œ ์–ป์€ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ณ€์ˆ˜์™€ ์„œ๋ธŒ๋ฃจํ‹ด๋ช…์„ ๋ณ€๊ฒฝํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 10) mw_dll_hashing (sub_5E01AE9) ์„œ๋ธŒ๋ฃจํ‹ด

 

 

๊ทธ๋ฆฌ๊ณ  mw_dll_hashing_algo (sub_5DF40AF) ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€๋„ ๋ณ€์ˆ˜๋ช…์„ ์˜ˆ์˜๊ฒŒ ๋ณ€๊ฒฝํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 11) mw_dll_hashing_algo (sub_5DF40AF) ์„œ๋ธŒ๋ฃจํ‹ด

 

mw_dll_hashing_algo ์„œ๋ธŒ๋ฃจํ‹ด์— ๋Œ€ํ•ด ์•Œ๊ฒŒ๋œ ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • DLL ์ด๋ฆ„์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • 7๋ฒˆ์งธ ์ค„์—์„œ ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ์„ธ ๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ํ•ฉ์‚ฐํ•˜์—ฌ ํ•ด์‹œ(hash)๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

  • 10-11๋ฒˆ์งธ ์ค„์—์„œ DLL ์ด๋ฆ„์˜ ๋ฌธ์ž๊ฐ€ ๋Œ€๋ฌธ์ž์ธ์ง€ ํ™•์ธํ•˜์—ฌ ๋Œ€๋ฌธ์ž๋ฉด ์†Œ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • ๋งˆ์ง€๋ง‰์—๋Š” ๊ณ„์‚ฐ๋œ ํ•ด์‹œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

sub_5DFBFF0 ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€ ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ ํ•จ์ˆ˜์ธ sub_5DFB558 ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ์ด๋™ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

2) sub_5DFB558 (mw_api_hash_resolving)

Figure 12) sub_5DFB558 ์„œ๋ธŒ๋ฃจํ‹ด

 

ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋ณผ ๋ถ€๋ถ„์€ 23๋ฒˆ์งธ ์ค„์ž…๋‹ˆ๋‹ค.

  • mw_dll_hashing (sub_5E01AE9) ์„œ๋ธŒ๋ฃจํ‹ด๊ณผ ์œ ์‚ฌํ•œ ํ•ด์‹œ ๊ด€๋ จ ์—ฐ์‚ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. sub_5DEB099 ํ˜ธ์ถœ ๋ฐ ์—ฐ์‚ฐ์„ ํ†ตํ•œ (ํ•ด์‹œ)๊ฐ’์„ a2์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ด ์„œ๋ธŒ๋ฃจํ‹ด์˜ a2๋Š” sub_5DFBFF0 ์„œ๋ธŒ๋ฃจํ‹ด์˜ 4๋ฒˆ์งธ ์ธ์ž์ธ 0x76FC34E6์ž…๋‹ˆ๋‹ค(Figure 20).

  • ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋Š” XOR ํ‚ค๋Š” 0x32C9DB43์œผ๋กœ ์ €๋ฒˆ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

  • ์‹ค์ œ ํ•ด์‹ฑ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์€ ์—ฐ์‚ฐํ•˜๋Š” ๋ถ€๋ถ„์ธ sub_5DEB099์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

 

 

๊ทธ๋Ÿผ ๋Œ€๊ฐ• ํŒŒ์•…์ด ๋์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ์˜ˆ์˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋ณด๊ธฐ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋จผ์ € ํ‘œ์ค€ ๊ตฌ์กฐ์ฒด๋“ค(_IMAGE_DOS_HEADER, _IMAGE_NT_HEADERS, _IMAGE_EXPORT_DIRECTORY)์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 13) ๊ตฌ์กฐ์ฒด ์ถ”๊ฐ€

์ถ”๊ฐ€ํ•œ ์„ธ ๊ฐœ์˜ ๊ตฌ์กฐ์ฒด์— ์˜ํ•ด _IMAGE_FILE_HEADER, _IMAGE_OPTIONAL_HEADERS32, _IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด๋“ค์€ ์ž๋™์œผ๋กœ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. IDA๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๊ทธ์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด๋“ค์„ ํ•จ๊ป˜ ๋กœ๋“œํ•ด์ฃผ๋Š”๋ฐ, ์ด ๊ตฌ์กฐ์ฒด๋“ค ๋ชจ๋‘ Windows PE ํŒŒ์ผ ํฌ๋งท์—์„œ ์„œ๋กœ ์—ฐ๊ฒฐ/์—ฐ๊ด€๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ถ”๊ฐ€ํ•œ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํƒ€์ž…๋„ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ , ๋ณ€์ˆ˜/์„œ๋ธŒ๋ฃจํ‹ด๋ช…๋„ ๋ฐ”๊ฟ”์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 14) ์ˆ˜์ • ํ›„์˜ mw_api_hash_resolving (sub_5DFB558) ์„œ๋ธŒ๋ฃจํ‹ด

 

๋‚ด๋ถ€ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ sub_5DEB099, sub_5DFB384 ์ด๋ฆ„๋„ ๊ฐ๊ฐ mw_api_resolving_algo, mw_w_api_hash_resolving์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

mw_api_resolving_algo (sub_5DEB099) ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€๋„ ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

Figure 15) mw_api_resolving_algo (sub_5DEB099) ์„œ๋ธŒ๋ฃจํ‹ด

 

 

โ— API ๋ฆฌ์กธ๋น™

์ด ์ •๋ณด๋“ค์„ ๊ฐ€์ง€๊ณ  HashDB ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ API ์ด๋ฆ„์„ ๋ฆฌ์กธ๋น™ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋ฐฉ๊ธˆ ์ฐพ์•˜๋˜ XOR ํ‚ค๋ฅผ ์„ธํŒ…ํ•˜๊ณ  emotet์„ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด DLL ์ƒ˜ํ”Œ์ด emotet์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋‹ˆ๊น์š”ใ…Ž 

Figure 16) HashDB XOR ํ‚ค ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ธํŒ…

 

๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์กธ๋น™ํ•˜๋ ค๋Š” ํ•ด์‹œ๊ฐ’์„ ์ฐพ์•„์„œ sub_5DE645E ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ๋Œ์•„๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(DllRegisterServer → sub_5DF1FD0 → sub_5DFEBA2 → sub_5DFEAA3 → sub_5DE645E).

ํ•ด๋‹น ํ•ด์‹œ๊ฐ’์„ ์˜ค๋ฅธ์ชฝ ํด๋ฆญํ•˜์—ฌ HashDB Hunting Algorithm๋ฅผ ์„ ํƒํ•ด emotet์œผ๋กœ ์„ธํŒ…ํ•œ ํ›„, ๋‹ค์‹œ ํ•ด์‹œ๊ฐ’์„ ์˜ค๋ฅธ์ชฝ ํด๋ฆญํ•˜์—ฌ HashDB Lookup์„ ์„ ํƒํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐฝ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. module์€ kernel32๋ฅผ ์„ ํƒํ•ด์ค๋‹ˆ๋‹ค.

Figure 17) HashDB Lookup

 

๊ทธ๋ฆฌ๊ณ  Eums ํƒญ์„ ํ™•์ธํ•ด๋ณด๋ฉด ์ž˜ ์ถ”๊ฐ€๋œ hashdb_strings_emotet์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Figure 18) ์ถ”๊ฐ€๋œ ์—ด๊ฑฐํ˜• hashdb_strings_emotet

 

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด์‹œ๊ฐ’์˜ ํƒ€์ž…์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.  sub_5DFBFF0 ์„œ๋ธŒ๋ฃจํ‹ด์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž์˜€๋˜ ํ•ด์‹œ๊ฐ’์˜ ํƒ€์ž…์„ ์ƒ์„ฑํ•œ hashdb_strings_emotet์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

Figure 19) ๋ฆฌ์กธ๋น™๋œ API ํ•ด์‹œ GetProcessHeap_0

 

์ด๋ ‡๊ฒŒ ์•Œ๊ฒŒ๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ sub_5DE645E (mw_GetProcessHeap) ์„œ๋ธŒ๋ฃจํ‹ด ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ์˜ˆ์˜๊ฒŒ ๋ณ€๊ฒฝํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 20) ์ˆ˜์ • ํ›„์˜ mw_GetProcessHeap (sub_5DE645E) ์„œ๋ธŒ๋ฃจํ‹ด

mw_GetProcessHeap (sub_5DE645E) ์„œ๋ธŒ๋ฃจํ‹ด์€ GetProcessHeap API๋ฅผ ๋ฆฌ์กธ๋น™ํ•˜๊ธฐ ์œ„ํ•œ proxy ํ•จ์ˆ˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Wrapper/Stub/Proxy ํ•จ์ˆ˜ ํŠน์ง•
    • wrapper ํ•จ์ˆ˜
      • ์›๋ณธ ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ๋Š” ํ•จ์ˆ˜
      • ์ฃผ๋กœ ์›๋ณธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ์บก์Аํ™”ํ•˜์—ฌ ํ˜ธ์ถœ ์ „ํ›„์— ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

    • stub ํ•จ์ˆ˜
      • ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ž๋ฆฌ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ž๋ฆฌ ํ‘œ์‹œ์ž ์—ญํ• ์˜ ํ•จ์ˆ˜
      • ์‹ค์ œ๋กœ ์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ ํ˜ธ์ถœ๋˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋™์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
      • ์ฃผ๋กœ ๋™์  ๋งํฌ์—์„œ ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์ „์— ์ผ์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • proxy ํ•จ์ˆ˜
      • ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋Œ€๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ค‘๊ฐ„์—์„œ ์ˆ˜์ •ํ•˜์—ฌ ์ถ”๊ฐ€ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜
      • ์›๋ณธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ ์ „ํ›„์— ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด ์›๋ณธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ์–ด๋–ค ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ์„ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

API ๋ฆฌ์กธ๋น™์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์ด mw_api_resolving์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์œผ๋‹ˆ๊นŒ ๋‹ค๋ฅธ ํ•ด์‹œ๋“ค๋„ ๋ฆฌ์กธ๋น™ํ•ด์ฃผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. mw_api_resolving ์„œ๋ธŒ๋ฃจํ‹ด์˜ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 21) mw_api_resolving ๊ต์ฐจ ์ฐธ์กฐ

์œ„์—์„œ๋„ ๋ดค๊ธด ํ–ˆ์ง€๋งŒ 109๊ฐœ๋กœ ๋„ˆ๋ฌด ๋งŽ๋„ค์—ฌ....;; API ๋ฆฌ์กธ๋น™์„ ๋ชจ๋‘ ์™„๋ฃŒํ•˜๊ณ  ์ฝ”๋“œ๋„ ์˜ˆ์˜๊ฒŒ ๋ณ€๊ฒฝํ•ด๋‘๋ฉด ๋ถ„์„์— ๋„์›€์ด ๋งŽ์ด ๋˜๊ฒ ์ฃ  ใ…Ž ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์ €๋Š” ํŒจ์Šคํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹น ^^

 

 

 

[C2 IP ์ฃผ์†Œ ๋ณตํ˜ธํ™”]

DLL ์ƒ˜ํ”Œ์˜ ์„น์…˜์ด 3๊ฐœ๋ฐ–์— ์—†๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์—ˆ๋Š”๋ฐ์š”.

Figure 22) ์„น์…˜(์„ธ๊ทธ๋จผํŠธ) ๋ชฉ๋ก

 

์ง€๋‚œ๋ฒˆ์— .text ์„น์…˜์„ ๋ถ„์„ํ–ˆ์—ˆ์œผ๋‹ˆ ์ด๋ฒˆ์—๋Š” .data ์„น์…˜์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Figure 23) .data ์„น์…˜

 

๋ฐ์ดํ„ฐ ๋ธ”๋กญ์ด ๋‘ ๋ฒˆ ์—ฐ์†์œผ๋กœ 0(\x00)์œผ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์€ ์ฃผ๋ชฉํ• ๋งŒํ•œ ์ ์ด๋‹ˆ ๊ธฐ์–ตํ•ด๋‘๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

์šฐ์„  .data ์„น์…˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ dword_5E04000์˜ ๊ต์ฐจ ์ฐธ์กฐ(DATA XREF)๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 24) ๋ฐ์ดํ„ฐ dword_5E04000์˜ ๊ต์ฐจ ์ฐธ์กฐ

 

๋”ฐ๋ผ๊ฐ€๋ณด๋ฉด sub_5E0225A ์„œ๋ธŒ๋ฃจํ‹ด์˜ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

Figure 25) .data ์„น์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” sub_5E0225A (1)

 

ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ž๋กœ ํ˜ธ์ถœ๋˜๋Š” sub_5DFACFF ์„œ๋ธŒ๋ฃจํ‹ด์— ๋“ค์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 26) sub_5DFACFF ์„œ๋ธŒ๋ฃจํ‹ด

 

ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€์— XOR, ๋น„ํŠธ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ๋ฌธ์ž์—ด์„ ๋””์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฃจํ‹ด์ด๋ผ๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ ํฌ์ŠคํŒ…์— .text ์„น์…˜ ๋ฌธ์ž์—ด์„ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋ฃจํ‹ด(Emotet ๋ถ„์„(2) ํฌ์ŠคํŒ… - sub_5DE4BB4 ์„œ๋ธŒ๋ฃจํ‹ด)๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ๋‚ด์šฉ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. 

๋‹ค๋ฅธ ์ ์ด๋ผ๋ฉด, sub_5DFACFF ์„œ๋ธŒ๋ฃจํ‹ด์€ .data ์„น์…˜์„ ๋ณตํ˜ธํ™”ํ•˜๊ณ  ์žˆ๊ณ , .data ์„น์…˜์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ํ‰๋ฒ”ํ•œ ๋ฌธ์ž์—ด ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ „์˜ sub_5E0225A  ์„œ๋ธŒ๋ฃจํ‹ด์— ๋“ค์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Figure 27) .data ์„น์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” sub_5E0225A (2)

 

48๋ฒˆ์งธ ์ค„์˜ ๋ฌธ์ž์—ด "%u.%u.%u.%u"์€ ๋”ฑ ๋ด๋„ IP ์ฃผ์†Œ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด .data ์„น์…˜์˜ 0x05E04000๋ถ€ํ„ฐ 0x05E04208๊นŒ์ง€(Figure 23)๋Š” ์•”ํ˜ธํ™”๋œ IP ์ฃผ์†Œ๋“ค์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ณตํ˜ธํ™” ๋ฃจํ‹ด๊ณผ C2 IP ์ฃผ์†Œ ๋ฐ์ดํ„ฐ๋“ค์„ ์–ป์—ˆ์œผ๋‹ˆ IDA Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋ณตํ˜ธํ™”ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. (Alexandre Borges์˜ "Malware Analysis Series(MAS) – Article 3"๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.)

import binascii
import pefile
import struct
import ipaddress

def decrypter(data_key, data_string, stringlength):
	decoded = []
	for i in range(0, stringlength):
		decoded.append((data_string[i]) ^ (data_key[i % len(data_key)]))
	return decoded


def extract_data(filename):
	pe = pefile.PE(filename)
	imagebase = pe.OPTIONAL_HEADER.ImageBase
	for section in pe.sections:
		if '.data' in section.Name.decode(encoding='utf-8').rstrip('x00'):
			return (section.get_data(section.VirtualAddress, section.SizeOfRawData), (section.VirtualAddress + imagebase))


def calc_offsets(x_seg_start, x_start):
	data_offset = hex(int(x_start, 16) - int(x_seg_start, 16))
	return data_offset


def data_decrytper():
	filename = r"C:\Users\asamin\Desktop\new_rundll32_05DE0000.bin"
	data_extracted, virtualaddress = extract_data(filename)

	encrypted_string_addr = hex(virtualaddress)

	encr_data_rel = calc_offsets(encrypted_string_addr, encrypted_string_addr)

	d1_off = 0x0
	if (b'\x00\x00' in data_extracted[int(encr_data_rel, 16):]):
		d1_off = (data_extracted[int(encr_data_rel, 16):]).index(b'\x00\x00')

	bytes_extracted = (data_extracted[int(encr_data_rel, 16):int(encr_data_rel, 16) + d1_off])

	offset = 0
	xorkey = bytes_extracted[offset:(offset+4)]
	xorkey_unpacked = struct.unpack('<I', xorkey)[0]
	xored_length = bytes_extracted[(offset+4):(offset+4+4)]
	xored_length_unpacked = struct.unpack('<I', xored_length)[0]
	string_length = xorkey_unpacked ^ xored_length_unpacked
	encrypted_string = bytes_extracted[8:8+string_length]
	decoded_bytes = bytes(decrypter(xorkey, encrypted_string, string_length))

	print('\nC2 IP ADDRESS LIST: ')
	print(30 * '-')
	k=0
	i=0
	while (k < len(decoded_bytes)):
		ip_item = decoded_bytes[k:k+4]
		ip_port = decoded_bytes[k+4:k+6]
		print("IP[%d]: %s" % (i, ipaddress.IPv4Address(ip_item)), end=':')
		print(int(binascii.hexlify(ip_port), 16))
		k = k+8
		i = i+1


def main():
	data_decrytper()
	return

if __name__ == '__main__':
	main()

 

 

์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Figure 28) C2 IP ์ฃผ์†Œ ๋ณตํ˜ธํ™” ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ

 

C2 IP ์ฃผ์†Œ๋“ค์ด ์ž˜ ๋ณตํ˜ธํ™”๋œ ๊ฑธ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. Emotet ์•…์„ฑ์ฝ”๋“œ ๋ถ„์„์€ ์—ฌ๊ธฐ์„œ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

Ref. "Malware Analysis Series(MAS) – Article 3", Alexandre Borges