๊ณ์ ์ด์ด์ Emotet ์ ์ฑ์ฝ๋๋ฅผ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
์ํ ํด์(SHA256)๋ ed22dd68fd9923411084acc6dc9a2db1673a2aab14842a78329b4f5bb8453215์ ๋๋ค.
[Hash Resolving]
โ ๋ฆฌ์กธ๋น ์ ๋ณด ์์ง
์ง๋๋ฒ ํฌ์คํ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณตํธํํ๋๋ DLL/API ์ด๋ฆ๋ค์ ๋ง์ด ๋ณผ ์ ์์์ต๋๋ค. ์ํ DLL์ ๋์ ์ผ๋ก DLL/API ์ด๋ฆ๋ค์ ๋ฆฌ์กธ๋นํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํธ์ถ๋๋ ํจ์๋ค์ ๋ฐ๋ผ๊ฐ ์ํฉ์ ํ์ ํ๊ณ ๊ฐ์ด ๋ฆฌ์กธ๋น์ ์ํํ์ฌ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค..
DllRegisterServer๋ถํฐ ์์ํด๋ณด๊ฒ ์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ก ํธ์ถ๋๋ ์๋ธ๋ฃจํด sub_5DF1FD0์ผ๋ก ์ด๋ํด๋ณด๊ฒ ์ต๋๋ค.
53๋ฒ์งธ ์ค์ sub_5DFEBA2 ์๋ธ๋ฃจํด์ผ๋ก ๋ค์ด๊ฐ๋ณด๊ฒ ์ต๋๋ค.
ํน๋ณํ ๊ฒ์ ์์์ผ๋ 6๋ฒ์งธ ์ค์ sub_5DFEAA3์ผ๋ก ๋ค์ด๊ฐ๋ณด๊ฒ ์ต๋๋ค.
sub_5DFEAA3 ์๋ธ๋ฃจํด์๋ ๋ ๊ฐ์ ํธ์ถ(sub_5DE645E, sub_5DF1B22)๊ณผ ์์ํ 16์ง์ ์ซ์๋ค์ด ์์ต๋๋ค.
๊ทธ์ค 5๋ฒ์งธ ์ค์ sub_5DE645E ์๋ธ๋ฃจํด์ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
- cdecl ํธ์ถ ๊ท์ฝ์ด ์ฐ์ด๊ณ ์์ต๋๋ค.
- 5๋ฒ์งธ ์ค์ sub_5DFBFF0์ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ์ค ๋ง์ง๋ง ์ธ์๋ ํด์๊ฐ์ผ๋ก ๋ณด์ด๋๋ฐ, ์ด๋ ๋ณดํต ๋๋
ํ ๊ธฐ๋ฒ์ด ์ ์ฉ๋ ์
์ฑ์ฝ๋ ์ํ์ ๋ถ์ํ ๋ ๋ง์ด ๋ณด์ด๋ ํจํด์
๋๋ค.
- ๋ํ ๊ฐ์ ์ค์์ ๊ฐ ๋๋ ๋ฌธ์์ด์ ๋ก์ปฌ ๋ณ์ v1๋ก ๋ฐํํ๋ ๊ฒ์ ํด์ ๋ฆฌ์กธ๋น๊ณผ ๊ด๋ จ๋ ๋ฌด์ธ๊ฐ๊ฐ ์กด์ฌํ๋ค๋ ์งํ์
๋๋ค.
- 6๋ฒ์งธ ์ค์์ v1์ด ํจ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ๋๊ณ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. v1์ API ์ด๋ฆ์ผ๋ก ๋ณด์
๋๋ค.
- ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ sub_5DE645E๊ฐ ๋ํผ(wrapper) ํจ์์ธ ๊ฒ ๊ฐ์ต๋๋ค.
- ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ํตํด v1 ํธ์ถ์ ์ธ์๊ฐ ์๋ค๋ ๊ฒ์ ํ์ธํ์๊ธฐ ๋๋ฌธ์ ํด๋น ์ธ์๋ค์ด ๋ชจ๋ ๊ฐ์ง ์ธ์๋ก ์๊ฐ๋ฉ๋๋ค.
sub_5DFBFF0 ์๋ธ๋ฃจํด์ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ์ธํด๋ณด๋ 109๋ฒ ํธ์ถ๋๊ณ ์์ต๋๋ค.
๋งค์ฐ ๋ง์ ํ์์ด๋ฏ๋ก ๊ฝค๋ ์๋ฏธ์๋ ์๋ธ๋ฃจํด์ผ ๊ฒ ๊ฐ์ผ๋ sub_5DFBFF0 ์๋ธ๋ฃจํด์ ์์ธํ ๋ถ์ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
โ API ๋ฆฌ์กธ๋น ๋ฃจํด : sub_5DFBFF0 (mw_api_resolving)
ํด๋น ์๋ธ๋ฃจํด์์ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ค์ ์ ์ ์์ต๋๋ค.
- API ์ด๋ฆ์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ dword ๋ฐฐ์ด (line 6, 9, 11)
- ์คํ(ecx)์์ ๊ฐ์ ธ์จ v4 ์ธ์๋ฅผ ํตํด sub_5E01AE9๋ฅผ ํธ์ถ
- sub_5DFB558 ํธ์ถ ์์ ์ธ์ ์ค v5๋ sub_BA1AE9์์ ๋ฐํ๋ ๊ฐ์ด๊ณ , a4๋ API ํด์์ธ ๊ฒ์ผ๋ก ์ถ์ ๋๋ 16์ง์ ํํ์ ๊ฐ
๋ด๋ถ์์ ํธ์ถ๋๋ ๋ ๊ฐ์ ํจ์(sub_5E01AE9, sub_5DFB558)์ ๋ํด์๋ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
1) sub_5E01AE9 (mw_dll_hashing)
ํด๋น ์๋ธ๋ฃจํด์์ DLL ํด์ฑ ๋ฆฌ์กธ๋น์ ๋ด๋นํ๊ณ ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ DLL ์ด๋ฆ์ ์ฐพ์ ํด๋น ์ฃผ์๋ฅผ ๋ฐํํด์ค๋๋ค.
6๋ฒ์งธ ์ค์ sub_5DFAA52 ์๋ธ๋ฃจํด์ ๋ด๋ถ NtCurrentPeb ํจ์๋ฅผ ํตํด PEB(Process Environment Block)๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋ํ ๊ฐ์ ์ค์์ Ldr ํ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋๋ฐ ์ด๋ PEB_LDR_DATA ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ ๋๋ค. PEB_LDR_DATA ๊ตฌ์กฐ์ฒด๋ ํ๋ก์ธ์ค์ ๋ก๋๋ DLL ๋ชจ๋์ ๋ํ๋ ๋๋ค.
๋ํ InLoadOrderModuleList๋ _LIST_ENTRY ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋๋ฐ, ์ด๋ ๋๋ธ ๋งํฌ๋ ๋ง์คํธ(double linked list)๋ฅผ ๋ํ๋ ๋๋ค.
์ฝ๋์์ sub_5DF40AF๋ฅผ ํธ์ถํ์ฌ ๊ด๋ จ ํด์๋ฅผ ๊ณ์ฐํ ํ, ํค 0x23FECA30์ผ๋ก XOR ์ฐ์ฐ์ ์ํํ๊ณ ๊ณ์ฐ๋ ํด์์ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํฉ๋๋ค. ๊ฒฐ๊ณผ๊ฐ ์ผ์นํ๋ฉด ํด๋น DLL์ ๊ธฐ๋ณธ ์ฃผ์๋ฅผ ๋ฐํํฉ๋๋ค.
์์์ ์ป์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ณ , ๋ณ์์ ์๋ธ๋ฃจํด๋ช ์ ๋ณ๊ฒฝํด์ฃผ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ 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)
ํด๋น ์๋ธ๋ฃจํด์์ ์ฃผ์ ๊น๊ฒ ๋ณผ ๋ถ๋ถ์ 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)์ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
์ถ๊ฐํ ์ธ ๊ฐ์ ๊ตฌ์กฐ์ฒด์ ์ํด _IMAGE_FILE_HEADER, _IMAGE_OPTIONAL_HEADERS32, _IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด๋ค์ ์๋์ผ๋ก ๋ก๋๋ฉ๋๋ค. IDA๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ก๋ํ ๋ ๊ทธ์ ๊ด๋ จ๋ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด๋ค์ ํจ๊ป ๋ก๋ํด์ฃผ๋๋ฐ, ์ด ๊ตฌ์กฐ์ฒด๋ค ๋ชจ๋ Windows PE ํ์ผ ํฌ๋งท์์ ์๋ก ์ฐ๊ฒฐ/์ฐ๊ด๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ถ๊ฐํ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐํ์ผ๋ก ํ์ ๋ ๋ณ๊ฒฝํด์ฃผ๊ณ , ๋ณ์/์๋ธ๋ฃจํด๋ช ๋ ๋ฐ๊ฟ์ฃผ๊ฒ ์ต๋๋ค.
๋ด๋ถ ํธ์ถ๋๋ ํจ์ sub_5DEB099, sub_5DFB384 ์ด๋ฆ๋ ๊ฐ๊ฐ mw_api_resolving_algo, mw_w_api_hash_resolving์ผ๋ก ๋ฐ๊ฟ์ฃผ์์ต๋๋ค.
mw_api_resolving_algo (sub_5DEB099) ์๋ธ๋ฃจํด ๋ด๋ถ๋ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋ณ๊ฒฝํด์ฃผ์์ต๋๋ค.
โ API ๋ฆฌ์กธ๋น
์ด ์ ๋ณด๋ค์ ๊ฐ์ง๊ณ HashDB ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ API ์ด๋ฆ์ ๋ฆฌ์กธ๋นํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ๋ฐฉ๊ธ ์ฐพ์๋ XOR ํค๋ฅผ ์ธํ ํ๊ณ emotet์ ์ ํํ๊ฒ ์ต๋๋ค. ์ด DLL ์ํ์ด emotet์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ผ๋๊น์ใ
๊ทธ๋ฆฌ๊ณ ๋ฆฌ์กธ๋นํ๋ ค๋ ํด์๊ฐ์ ์ฐพ์์ sub_5DE645E ์๋ธ๋ฃจํด์ผ๋ก ๋์๊ฐ๋ณด๊ฒ ์ต๋๋ค(DllRegisterServer → sub_5DF1FD0 → sub_5DFEBA2 → sub_5DFEAA3 → sub_5DE645E).
ํด๋น ํด์๊ฐ์ ์ค๋ฅธ์ชฝ ํด๋ฆญํ์ฌ HashDB Hunting Algorithm๋ฅผ ์ ํํด emotet์ผ๋ก ์ธํ ํ ํ, ๋ค์ ํด์๊ฐ์ ์ค๋ฅธ์ชฝ ํด๋ฆญํ์ฌ HashDB Lookup์ ์ ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฐฝ์ด ์ถ๋ ฅ๋ฉ๋๋ค. module์ kernel32๋ฅผ ์ ํํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ Eums ํญ์ ํ์ธํด๋ณด๋ฉด ์ ์ถ๊ฐ๋ hashdb_strings_emotet์ ๋ณผ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ํด์๊ฐ์ ํ์ ์ ๋ฐ๊ฟ์ฃผ๋ฉด ๋๊ฒ ์ต๋๋ค. sub_5DFBFF0 ์๋ธ๋ฃจํด์ ๋ง์ง๋ง ์ธ์์๋ ํด์๊ฐ์ ํ์ ์ ์์ฑํ hashdb_strings_emotet์ผ๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
์ด๋ ๊ฒ ์๊ฒ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก sub_5DE645E (mw_GetProcessHeap) ์๋ธ๋ฃจํด ์ฝ๋๋ฅผ ์ข ๋ ์์๊ฒ ๋ณ๊ฒฝํด์ฃผ๊ฒ ์ต๋๋ค.
mw_GetProcessHeap (sub_5DE645E) ์๋ธ๋ฃจํด์ GetProcessHeap API๋ฅผ ๋ฆฌ์กธ๋นํ๊ธฐ ์ํ proxy ํจ์๋ผ๊ณ ํ ์ ์์ต๋๋ค.
- Wrapper/Stub/Proxy ํจ์ ํน์ง
- wrapper ํจ์
- ์๋ณธ ํจ์๋ฅผ ๊ฐ์ธ๋ ํจ์
- ์ฃผ๋ก ์๋ณธ ํจ์์ ํธ์ถ์ ์บก์ํํ์ฌ ํธ์ถ ์ ํ์ ์ถ๊ฐ์ ์ธ ์์
์ ์ํํ๊ฑฐ๋ ํจ์ ํธ์ถ์ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
- stub ํจ์
- ํจ์ ํธ์ถ์ ์๋ฆฌ๋ฅผ ๋์ฒดํ๋ ์๋ฆฌ ํ์์ ์ญํ ์ ํจ์
- ์ค์ ๋ก ์๋ฌด ์์ ๋ ํ์ง ์๊ฑฐ๋ ๋จ์ํ ํธ์ถ๋๋ ๋ค๋ฅธ ํจ์์ ์ฃผ์๋ฅผ ๋์ ์ผ๋ก ํด๊ฒฐํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฃผ๋ก ๋์ ๋งํฌ์์ ํจ์ ์ฃผ์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ ์ ์ผ์์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- proxy ํจ์
- ํจ์ ํธ์ถ์ ๋๋ฆฌํ๊ฑฐ๋ ์ค๊ฐ์์ ์์ ํ์ฌ ์ถ๊ฐ ๋ก์ง์ ์ํํ๋ ํจ์
- ์๋ณธ ํจ์์ ํธ์ถ์ ๋์ ์ผ๋ก ์กฐ์ ํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ผ๋ก ํธ์ถ ์ ํ์ ์ถ๊ฐ์ ์ธ ์์ ์ ์ํํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด ์๋ณธ ํจ์๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ์ด๋ค ๊ฒ์ฌ๋ฅผ ํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํธ์ถ์ ๋ณ๊ฒฝํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค.
- wrapper ํจ์
API ๋ฆฌ์กธ๋น์ ์ํํ๋ ์๋ธ๋ฃจํด์ด mw_api_resolving์ด๋ผ๋ ๊ฒ์ ์์์ผ๋๊น ๋ค๋ฅธ ํด์๋ค๋ ๋ฆฌ์กธ๋นํด์ฃผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. mw_api_resolving ์๋ธ๋ฃจํด์ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
์์์๋ ๋ดค๊ธด ํ์ง๋ง 109๊ฐ๋ก ๋๋ฌด ๋ง๋ค์ฌ....;; API ๋ฆฌ์กธ๋น์ ๋ชจ๋ ์๋ฃํ๊ณ ์ฝ๋๋ ์์๊ฒ ๋ณ๊ฒฝํด๋๋ฉด ๋ถ์์ ๋์์ด ๋ง์ด ๋๊ฒ ์ฃ ใ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ๊ฒ ๊ฐ์ผ๋ ์ ๋ ํจ์คํ๊ณ ๋์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋น ^^
[C2 IP ์ฃผ์ ๋ณตํธํ]
DLL ์ํ์ ์น์ ์ด 3๊ฐ๋ฐ์ ์๋ค๋ ๊ฒ์ ํ์ธํ์๋๋ฐ์.
์ง๋๋ฒ์ .text ์น์ ์ ๋ถ์ํ์์ผ๋ ์ด๋ฒ์๋ .data ์น์ ์ ๋ํด ์ดํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋ฐ์ดํฐ ๋ธ๋กญ์ด ๋ ๋ฒ ์ฐ์์ผ๋ก 0(\x00)์ผ๋ก ๋๋๋ ๊ฒ์ ์ฃผ๋ชฉํ ๋งํ ์ ์ด๋ ๊ธฐ์ตํด๋๋ฉด ์ข์ต๋๋ค.
์ฐ์ .data ์น์ ์์ ๋ถ๋ถ์ ์๋ ๋ฐ์ดํฐ dword_5E04000์ ๊ต์ฐจ ์ฐธ์กฐ(DATA XREF)๋ฅผ ๋ฐ๋ผ๊ฐ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ๋ผ๊ฐ๋ณด๋ฉด sub_5E0225A ์๋ธ๋ฃจํด์ ์ฝ๋๊ฐ ๋์ต๋๋ค.
ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ํธ์ถ๋๋ sub_5DFACFF ์๋ธ๋ฃจํด์ ๋ค์ด๊ฐ๋ณด๊ฒ ์ต๋๋ค.
ํด๋น ์๋ธ๋ฃจํด ๋ด๋ถ์ XOR, ๋นํธ ์ํํธ ์ฐ์ฐ์ด ์กด์ฌํ๋ ๊ฒ์ ๋ณด๋ ๋ฌธ์์ด์ ๋์ฝ๋ฉํ๊ธฐ ์ํ ๋ฃจํด์ด๋ผ๋ ๊ฒ์ ํ์ ํ ์ ์์ต๋๋ค. ์ง๋ ํฌ์คํ ์ .text ์น์ ๋ฌธ์์ด์ ๋ณตํธํํ๋ ๋ฃจํด(Emotet ๋ถ์(2) ํฌ์คํ - sub_5DE4BB4 ์๋ธ๋ฃจํด)๊ณผ ๊ฑฐ์ ๋์ผํ ๋ด์ฉ์ ์ฝ๋์ ๋๋ค.
๋ค๋ฅธ ์ ์ด๋ผ๋ฉด, sub_5DFACFF ์๋ธ๋ฃจํด์ .data ์น์ ์ ๋ณตํธํํ๊ณ ์๊ณ , .data ์น์ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ํ๋ฒํ ๋ฌธ์์ด ํํ๊ฐ ์๋๋ผ๋ ์ ์ ๋๋ค. ๋ฐ๋ก ์ ์ sub_5E0225A ์๋ธ๋ฃจํด์ ๋ค์ด๊ฐ๋ณด๊ฒ ์ต๋๋ค.
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()
์คํฌ๋ฆฝํธ ์คํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
C2 IP ์ฃผ์๋ค์ด ์ ๋ณตํธํ๋ ๊ฑธ ํ์ธํ์ต๋๋ค. Emotet ์ ์ฑ์ฝ๋ ๋ถ์์ ์ฌ๊ธฐ์ ๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค.
Ref. "Malware Analysis Series(MAS) – Article 3", Alexandre Borges