์ง๋ ํฌ์คํ ์์ ์ธํจํนํ Qakbot ์ ์ฑ์ฝ๋๋ฅผ ์ด์ด์ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ ํฌ์คํ
์์๋ PE ํฌ๋งท๊ณผ API ๋ฆฌ์กธ๋น์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ํ ํด์(SHA256)๋ 73e4969db4253f9aeb2cbc7462376fb7e26cc4bb5bd23b82e2af0eaaf5ae66a8์
๋๋ค.
[ Capa๋ฅผ ํตํด ์ค์บ ]
๋จผ์ ์ธํจํนํ DLL์ Capa๋ก ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
Capa๋ PE, ELF, .NET, shellcode ๊ฐ์ ์คํํ์ผ์ด๋ ์๋๋ฐ์ค ๋ณด๊ณ ์๋ฅผ ์ ๋ ฅํ๋ฉด, ํด๋น ํ์ผ์ ๊ธฐ๋ฅ์ ํ์งํ์ฌ ์ถ๋ ฅํด์ฃผ๋ ๋๊ตฌ์ ๋๋ค. IDA plugin์ผ๋ก ์ฐ๋ํ์ฌ ์ฌ์ฉํ ์๋ ์์ต๋๋ค(Capa Explorer).
์๋๋ Capa๋ฅผ ํตํด ์ธํจํน๋ DLL์ ๊ฒ์ฌํ์ฌ ์ถ๋ ฅํ ๋ด์ฉ์ ๋๋ค.
Capa๋ฅผ ํตํด ์ป์ ์ ์ฑ์ฝ๋ ๋ถ์์ ๋์์ด ๋๋ ์ ๋ณด(์งํ)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- HTTP ์กฐ์(manipulation)
- Adler32 ์ฒดํฌ์ฌ ์๊ณ ๋ฆฌ์ฆ
- CRC32 ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ํด์ ๋ฐ์ดํฐ
- Base64 ์ธ์ฝ๋ฉ ๋ฐ์ดํฐ
- XOR ์ฐ์ฐ์ด ์ฌ์ฉ๋ ์ธ์ฝ๋ฉ ๋ฐ์ดํฐ
- SHA1 ํด์ ์๊ณ ๋ฆฌ์ฆ
- Mersenne Twister
- ํ์ผ ์ด๊ฑฐ(file enumeration) ์์
- Import Table ์ฌ๊ตฌ์ฑ ์์
์ด ์ ๋ณด๋ค์ ์ด์ฉํ์ฌ DllEntryPoint ํจ์๋ฅผ ์์์ผ๋ก ๋ถ์์ ์งํํด๋ณด๊ฒ ์ต๋๋ค.
[ ์์ธ ๋ถ์ ]
DllEntryPoint ํจ์์ 30๋ฒ์งธ ์ค์ ์๋ธ๋ฃจํด sub_10009773๋ฅผ ๋จผ์ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
sub_10009773
์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ํฌ๊ธฐ์ด๊ณ ๋ ๋ฒ์งธ(unk_1001D5A8)์ ์ธ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ(unk_1001E3F8)๋ ์๋์ ๊ฐ์ ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ ๋ธ๋กญ์
๋๋ค. v1๊ณผ v2์ ๋ํ ์ ๋ณด๋ ์์ง ์์ต๋๋ค.
unk_1001E3F8๋ ๊ธธ์ด๋ก ๋ณด์ ํค ๋ฌธ์์ด๋ก ์ถ์ธก๋ฉ๋๋ค.
์ด์ด์ sub_1000865C ์๋ธ๋ฃจํด์ผ๋ก ๋ค์ด๊ฐ๋ณด๊ฒ ์ต๋๋ค.
sub_1000865C ์๋ธ๋ฃจํด ๋ด๋ถ 27๋ฒ์งธ ์ค์์ ํฅ๋ฏธ๋ก์ด ์ฐ์ฐ ๋ฃจํด์ ๋ฐ๊ฒฌํ์ต๋๋ค.
a2, a3, a5๋ ์ ๋ ฅ ํ๋ผ๋ฏธํฐ๋ก a2๋ ๋ฐ์ดํฐ ๋ธ๋กญ1(unk_1001D5A8), a3๋ ๋ฐ์ดํฐ ๋ธ๋กญ2(unk_1001E3F8)์ ๋๋ค.
ํด๋น ์๋ธ๋ฃจํด์์ ๋ฌธ์์ด๋ก ์ถ์ธก๋๋ ๋ฐ์ดํฐ ๋ธ๋กญ1๊ณผ ํค๋ก ์ถ์ธก๋๋ ๋ฐ์ดํฐ ๋ธ๋กญ2, ๊ทธ๋ฆฌ๊ณ XOR ์ฐ์ฐ ๋ฃจํด์ ๋ฐ๊ฒฌํ์์ต๋๋ค. ์ด๋ฅผ ์ข ํฉ์ ์ผ๋ก ์๊ฐํด๋ณด๋ฉด ๋์ฝ๋ฉ์ ์ํ ์๋ธ๋ฃจํด์ผ๋ก ์ถ์ธก๋ฉ๋๋ค.
์๊ณ ์๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ธ๋ฃจํด(sub_10009773 → mw_decode_string_table, sub_1000865C → mw_decode_string_table), ์ธ์, ๋ณ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ฌ ์ ๋ฆฌํ์์ต๋๋ค.
sub_10008773
๋ค์ DllEntryPoint๋ก ๋์์ 32๋ฒ์งธ ์ค์ sub_10008773 ์๋ธ๋ฃจํด์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
sub_10008773๋ mw_ww_string_length๋ก, sub_1000C52C๋ mw_str_length_char๋ก, sub_100087CB๋ mw_str_length_wchar๋ก ๊ฐ๊ฐ ๋ณ๊ฒฝํ์๊ณ , ์ธ์/๋ณ์ ์ด๋ฆ๋ ๋ณ๊ฒฝํ์์ต๋๋ค.
15, 17๋ฒ์งธ ์ค์ ๋ณด๋ฉด ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๊ฐ -1์ธ์ง -2์ธ์ง ํ์ธํ๋ ์ฝ๋๊ฐ ์์ต๋๋ค.
mw_ww_string_length (sub_10008773)์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ธ char_or_wchar๋ ํฌ๊ธฐ๋ฅผ ์ ๋ ฅ๋ฐ๋ ํ๋ผ๋ฏธํฐ์ ๋๋ค. char_or_wchar๊ฐ -1์ธ์ง -2์ธ์ง ํ์ธํฉ๋๋ค.
์ด๋ "-1"์ "char"๋ฅผ ์๋ฏธํ๊ณ "-2"๋ "wchar"๋ฅผ ์๋ฏธํฉ๋๋ค. ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด mw_str_length_char (sub_1000C52C)์ ํ๋ผ๋ฏธํฐ๋ _BYTE์ด๊ณ , mw_str_length_wchar (sub_100087CB)์ ํ๋ผ๋ฏธํฐ๋ _WORD์์ ํ์ธํ ์ ์์ต๋๋ค
- char
- 1๋ฐ์ดํธ ํฌ๊ธฐ์ ๋๋ค.
- _byte๋ 1๋ฐ์ดํธ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ char๋ฅผ ๋ค๋ฃฐ ๋๋ _byte๋ก ํํ๋ฉ๋๋ค.
- wchar
- ๋ณดํต 2๋ฐ์ดํธ(๋๋ 4๋ฐ์ดํธ) ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋๋ค.
- _word๋ 2๋ฐ์ดํธ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ wchar๋ฅผ ์ฒ๋ฆฌํ ๋๋ _word๋ก ๋ค๋ค์ง ์ ์์ต๋๋ค.
์๋ธ๋ฃจํด sub_10008773 (mw_ww_string_length)์ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๊ณ์ฐํ๋ ํจ์์ด๋ฉฐ ์ดํ ์ฝ๋์์๋ ์์ฃผ ์ฐ์ ๋๋ค.
sub_10012C0A
DllEntryPoint ์๋ธ๋ฃจํด 36๋ฒ์งธ ์ค์ sub_10012C0A ํจ์์ ๋๋ค.
ํด๋น ์๋ธ๋ฃจํด์์ 60๊ณผ 128์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ๊ฐ๊ฐ 16์ง์๋ก ๋ณํํ๋ฉด 0x3C, 0x80์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก 0x3C๋ IMAGE_DOS_HEADER ๊ตฌ์กฐ์ฒด์ e_lfanew ํ๋๋ฅผ ๋ํ๋ด๋ฉฐ, 0x80์ IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด ๋ด์ Import Directory(_IMAGE_IMPORT_DESCRIPTOR ๊ตฌ์กฐ์ฒด)๋ฅผ ๋ํ๋ ๋๋ค.
- IMAGE_DOS_HEADER ๊ตฌ์กฐ์ฒด
- DOS ํค๋์ ํด๋นํ๋ ๊ตฌ์กฐ์ฒด๋ก, DOS ์์คํ ์์์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- DOS ํ์ผ ํฌ๋งท์ ํค๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
- ๊ทธ ์ค e_lfanew ํ๋๋ PE ํค๋์ ์คํ์
์ผ๋ก 0x3C ์ฃผ์์ ์์นํด์์ต๋๋ค.
- IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด
- PE ํค๋ ๋ด์ ์กด์ฌํ๋ ๋ฐ์ดํฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ํ๋ ๋๋ค.
- ๋ฐ์ดํฐ ๋๋ ํฐ๋ฆฌ๋ PE ํ์ผ ๋ด์์ ํน์ ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์์ญ์ ์ง์ ํ๊ณ , ์ด๋ฅผ ํตํด ์ด์์ฒด์ ๋ ์คํ ํ์ผ ๋ด์ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฐพ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด ๋ด์์ VirtualAddress ๊ฐ์ด 0x80์ด๋ฉด, Import Directory๋ฅผ ๋ํ๋
๋๋ค.
- Import Directory
- PE ํ์ผ์ import table์ ๋ํ๋ ๋๋ค.
- import table์ _IMAGE_IMPORT_DESCRIPTOR ๊ตฌ์กฐ์ฒด๋ค์ ํฌํจํ๊ณ ์์ต๋๋ค.
- _IMAGE_IMPORT_DESCRIPTOR ๊ตฌ์กฐ์ฒด
- import table์ ํญ๋ชฉ์ ์ค๋ช ํ๋ ๊ตฌ์กฐ์ฒด์ ๋๋ค.
- ๊ฐ _IMAGE_IMPORT_DESCRIPTOR ํญ๋ชฉ์ PE ํ์ผ์ import๋๋ ํจ์๋ DLL์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
์ด ์ ๋ณด๋ค์ ํตํด ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ๊ฐํ์ฌ PE ํฌ๋งท์ ์กฐ์(PE format manipulation) ํด๋ณด๊ฒ ์ต๋๋ค.
Structures ํญ์์ ํ์ค ๊ตฌ์กฐ์ฒด _IMAGE_DOS_HEADER์ _IMAGE_IMPORT_DESCRIPTOR๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ค์ ์์ฌ ์ฝ๋๋ก ๋์์์ ๋ค์ ์์ ์ ์ํํฉ๋๋ค.
- ๊ตฌ์กฐ์ฒด ์ ํ
- e_lfanew ํํ ๋ฐ๊พธ๊ธฐ
- ์คํ์
60(0x3C)์ ๋ํด Select a structure(๋จ์ถํค T)์ผ๋ก _IMAGE_DOS_HEADER๋ฅผ ์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์
๋ฐ์ดํธ(๋จ์ถํค F5)ํฉ๋๋ค.
- ์คํ์
60(0x3C)์ ๋ํด Select a structure(๋จ์ถํค T)์ผ๋ก _IMAGE_DOS_HEADER๋ฅผ ์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์
๋ฐ์ดํธ(๋จ์ถํค F5)ํฉ๋๋ค.
- ์ซ์ ํํ ๋ฐ๊พธ๊ธฐ
- ์ซ์ "20"์ ํด๋ฆญํ๊ณ Select a structure(๋จ์ถํค T)์ ๋๋ฅธ ํ _IMAGE_IMPORT_DESCRIPTOR๋ฅผ ์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ F5๋ฅผ ๋๋ฌ ๋์ปดํ์ผ๋ฌ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
- ์ซ์ "20"์ ํด๋ฆญํ๊ณ Select a structure(๋จ์ถํค T)์ ๋๋ฅธ ํ _IMAGE_IMPORT_DESCRIPTOR๋ฅผ ์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ F5๋ฅผ ๋๋ฌ ๋์ปดํ์ผ๋ฌ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
- e_lfanew ํํ ๋ฐ๊พธ๊ธฐ
- ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ ํ์
๋ฐ๊พธ๊ธฐ
- ๋ณ์ v3
- v3๋ฅผ Set type(๋จ์ถํค Y)๋ฅผ "int v3"์์ "_IMAGE_IMPORT_DESCRIPTOR *v3"๋ก ๋ณ๊ฒฝํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ดํธ(๋จ์ถํค F5)ํฉ๋๋ค.
- ์คํ์
128(0x80)์ 0x3C์ผ๋ก๋ถํฐ 0x80์ ์๋ฏธํ๋ฉฐ _IMAGE_IMPORT_DESCRIPTOR ๊ตฌ์กฐ์ฒด(ImportDirectory)๋ฅผ ๋ํ๋๋ ๊ฒ์ผ๋ก ์ถ์ธก๋ฉ๋๋ค. ์ด๋ PE ํ์์ ์ฐธ๊ณ ํ๋ฉด _IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด์ ์ํฉ๋๋ค.
- ๋ณ์ dword_1001E664
- ๋ณ์ dword_1001E664์ ๋ํด์๋ ๋์ผํ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ์ฌ ํ์ ์ "int"์ "_IMAGE_IMPORT_DESCRIPTOR *"๋ก ๋ณ๊ฒฝํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ดํธ(๋จ์ถํค F5)ํฉ๋๋ค.
- ๋ณ์ v3
์ ์์ ์ ์ํํ๊ณ ์๋ธ๋ฃจํด ๋ฐ ๋ณ์ ์ด๋ฆ์ ๋ฐ๊พผ ํ์ ์ฝ๋์ ๋๋ค.
๋ํ mw_w_construct_import_structures (sub_1000881A) ์๋ธ๋ฃจํด๋ ์์ ํด์ฃผ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ mw_HeapAlloc (sub_100087B5) ํจ์์ ๋ค์ด๊ฐ์ HeapAlloc API์ ํ๋ผ๋ฏธํฐ๋ฅผ ์์ ํฉ๋๋ค. ์ ๋ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ Enum member(๋จ์ถํค M)๋ฅผ ๋๋ฌ HEAP_ZERO_MEMORY๋ฅผ ์ ํํ์์ต๋๋ค.
์๋ธ๋ฃจํด mw_construct_import_structures (sub_10008892)๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ณ์์ ์ธ์ ์ด๋ฆ์ ๋ฐ๊ฟ์ฃผ์์ต๋๋ค.
sub_10012C0A (mw_prepare_Import_Structures) ์๋ธ๋ฃจํด๊ณผ ๊ทธ ๋ฃจํด ์ ํจ์๋ค(sub_1000881A(mw_w_construct_import_structures), sub_10008892(mw_construct_import_structures))์ ๊ตฌ์กฐ์ฒด๋ฅผ ํตํด ํ ๊ด๋ จ ์์ ์ ํ๋ ํจ์์ ๋๋ค.
sub_1000E369
๋ค์์ผ๋ก๋ DllEntryPoint ํจ์์ 37๋ฒ์งธ ์ค์ sub_1000E369 ์๋ธ๋ฃจํด์ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
sub_1000E369 ์๋ธ๋ฃจํด ๋ด๋ถ์๋ sub_1000E31E์ sub_10008773์ด ์์ต๋๋ค.
๋ํ sub_1000E369 ์๋ธ๋ฃจํด์ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ์ธํ๋ฉด 13๋ฒ ํธ์ถ๋๊ณ ,
์ด์ ์ ๋ถ์ํ๋ mw_w_decode_string_table (sub_10009773) ํจ์๋ ๋ณด์ด๋๋ฐ, ์ด ํจ์์ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ์ธํ๋ฉด 23๋ฒ ํธ์ถ๋ฉ๋๋ค.
12๋ฒ์งธ ์ค์๋ ํ์์ ์ธ ์ด๋ฆ์ด ์๋ dword_1001E684๋ผ๋ ์ด๋ฆ์ผ๋ก ํธ์ถ๋๋ API๊ฐ ์์ต๋๋ค. ์ด๋ .data ์น์ ์์ 0์ผ๋ก ์ด๊ธฐํ๋ ๋ฐ์ดํฐ์ ๋๋ค.
์ด ์ ๋ณด๋ค์ API ๋ฆฌ์กธ๋น์ ํฐ ์งํ์ ๋๋ค.
- API Resloving
- ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(DLL)์์ ํจ์๋ ๊ธฐํธ(symbol)๋ฅผ ํธ์ถํ ๋ ํด๋น ํจ์์ ์ฃผ์๋ฅผ ์ฐพ๋ ๊ณผ์ ์
๋๋ค.
- ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ํ์ํ ์ธ๋ถ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด ํด๋น ํจ์์ ์ฃผ์๋ฅผ ๋์ ์ผ๋ก ์ฐพ๊ณ ์ฐ๊ฒฐํ๋ ์์
์
๋๋ค.
- API ๋ฆฌ์กธ๋น์ ํฌ๊ฒ ์ ์ ๋ฆฌ์กธ๋น๊ณผ ๋์ ๋ฆฌ์กธ๋น์ผ๋ก ๋๋ฉ๋๋ค.
- ์ ์ ๋ฆฌ์กธ๋น: ์ปดํ์ผ ํ์์ API ์ฃผ์๊ฐ ์ด๋ฏธ ๊ฒฐ์ ๋์ด ์๋ ๊ฒฝ์ฐ๋ก ์ฃผ๋ก ๋ง์ปค๊ฐ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋์ ๋ฆฌ์กธ๋น: ํ๋ก๊ทธ๋จ์ด ์คํ ์ค์ผ ๋ ๋ฐํ์์ API ์ฃผ์๋ฅผ ์ฐพ์ ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ, ์ฃผ๋ก LoadLibrary์ GetProcAddress์ ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(DLL)์์ ํจ์๋ ๊ธฐํธ(symbol)๋ฅผ ํธ์ถํ ๋ ํด๋น ํจ์์ ์ฃผ์๋ฅผ ์ฐพ๋ ๊ณผ์ ์
๋๋ค.
์ด์ด์ sub_1000E369 ์๋ธ๋ฃจํด 14๋ฒ์งธ ์ค์ sub_1000E31E์ ๋ค์ด๊ฐ์ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
sub_1000E31E๋ก ๋ค์ด์๋ณด๋ ์ด์ ์ ๋ดค๋ HeapAlloc์ ๋ํผ(wrapper) ํจ์์ธ mw_HeapAlloc๋ ์๊ณ , ์ฒ์ ๋ณด๋ ์๋ธ๋ฃจํด์ธ sub_1000E15A๋ ์์ต๋๋ค.
sub_1000E15A์๋ ๋ค์ด๊ฐ๋ณด๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ค์ ์ป์ ์ ์์์ต๋๋ค.
- ์ ์๋ ค์ง 10์ง์๋ค(60, 120, 124 ๋ฑ)์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ ๊ฐ์ ์๋ธ๋ฃจํด sub_1000C52C์ sub_1000D5AA๋ฅผ ํธ์ถํฉ๋๋ค.
- XOR ์ฐ์ฐ์ ์ํํฉ๋๋ค.
- 16์ง์ 0x6C6C642E๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- LoadLibrary()์ GetProcAddress()๋ฅผ ํธ์ถํฉ๋๋ค.
์ด ์ ๋ณด๋ค์ ํตํด ๋์ API ๋ฆฌ์กธ๋น ๊ณผ์ ์ด๋ผ๋ ๊ฒ์ ํ์คํ๊ฒ ์ ์ ์์ต๋๋ค.
์์ผ๋ก ๋ฆฌ๋ฒ์ฑ ๊ณผ์ ์ด ๋ณต์กํด์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ณ sub_1000E15A์ ์๋ธ๋ฃจํด/๋ณ์ ์ด๋ฆ๋ค์ ์ ๋ฆฌํด์ฃผ๊ฒ ์ต๋๋ค.
1) 60(0x3C)์ e_lfanew ํ๋๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
- Select a structure(๋จ์ถํค T)์ผ๋ก _IMAGE_DOS_HEADER๋ฅผ ์ ํํฉ๋๋ค.
2) v3๋ฅผ Set type(๋จ์ถํค Y)๋ฅผ "int v3"์์ " _IMAGE_NT_HEADERS* v3"๋ก ๋ณ๊ฒฝํฉ๋๋ค.
3) Structures ํญ์์ ํ์ค ๊ตฌ์กฐ์ฒด _IMAGE_EXPORT_DESCRIPTOR๋ฅผ ์ถ๊ฐํฉ๋๋ค.
4) 120(0x78)์ Export Directory ํ๋๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
- Select a structure(๋จ์ถํค T)์ผ๋ก _IMAGE_EXPORT_DESCRIPTOR๋ฅผ ์ ํํฉ๋๋ค.
5) v4๋ฅผ Set type(๋จ์ถํค Y)๋ฅผ "int v4"์์ "_IMAGE_EXPORT_DIRECTORY* v4"๋ก ๋ณ๊ฒฝํฉ๋๋ค.
6) ApplyCalleeType ํ๋ฌ๊ทธ์ธ์ ์ด์ฉํ์ฌ LoadLibraryA()์ GetProcAddress() ํธ์ถ์ ๋ ๋ณด๊ธฐ ์ข๊ฒ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ApplyCalleeType ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋๊ณ ์ฌ์ฉ๋๋์ง ์ ์ ์๊ณ , ํ๋ผ๋ฏธํฐ/๋ฐํ๊ฐ ํ์ ์ ์ถ์ ํ์ฌ ์ ๋ฆฌํด์ค๋๋ค.
API์ ์ปค์๋ฅผ ์ฌ๋ฆฌ๊ณ Edit → Plugins → ApplyCalleeType → Use Standard Type๋ฅผ ํด๋ฆญํ์ฌ ํด๋น API ์ด๋ฆ์ ๊ฒ์ํ๊ณ ์ ํํฉ๋๋ค.
7) ์๋ธ๋ฃจํด ๋ฐ ๋ณ์๋ช ์ ๋ฐ๊ฟ์ค๋๋ค.
์ด ๊ณผ์ ์ ์๋ฃํ๋ฉด ์๋์ ๊ฐ์ด ์์๊ฒ ์ ๋ฆฌ๋ mw_hashing_api (sub_1000E15A) ์ฝ๋๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๊ทผ๋ฐ 49๋ฒ ์ค์ XOR ์ฐ์ฐ์์ 0x218FE95B๋ผ๋ ์์๊ฐ ๊ณ ์ ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ ์ด๋ XOR ํค์ ๋๋ค.
mw_hashing_api (sub_1000E15A) ์๋ธ๋ฃจํด ๋ถ์์ด ์์ง ๋๋ ๊ฒ์ ์๋๋๋ค. ํด๋น ์๋ธ๋ฃจํด 49๋ฒ์งธ ์ค์ sub_1000D5AA์ ๋ค์ด๊ฐ๋ณด๊ฒ ์ต๋๋ค.
ํด๋น ์๋ธ๋ฃจํด์๋ ๋ฐ์ดํฐ๋ฅผ XOR ์ฐ์ฐ๊ณผ ๋นํธ ์ํํธ ์ฐ์ฐ์ด ๊ฒฐํฉ๋ ์ฐ์ฐ ๊ณผ์ ์ด ์์ต๋๋ค. ์ด๋ CRC ๊ณ์ฐ์์ ์์ฃผ ์ฌ์ฉ๋๋ ํจํด์ ๋๋ค. ๋งจ ์ฒ์ capa๋ก ๋ถ์ํ ๊ฒฐ๊ณผ๋ฅผ ํตํด์๋ CRC32 ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ํด์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒ์ ์๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ด๋ CRC32 ์๊ณ ๋ฆฌ์ฆ ๊ณ์ฐ์ ํ๋ ์๋ธ๋ฃจํด์์ ์ ์ ์์ต๋๋ค.
CRC32 ๊ณ์ฐ ์๋ธ๋ฃจํด์ ๋ง๊ฒ ์๋ธ๋ฃจํด/๋ณ์ ์ด๋ฆ์ ์์๊ฒ ์ ๋ฆฌํด์ฃผ์์ต๋๋ค. ( sub_1000D5AA ์๋ธ๋ฃจํด๋ช : mw_crc32)
๋ค์ sub_1000E369 (mw_w_function_api_resolving) ์๋ธ๋ฃจํด์ผ๋ก ๋์๊ฐ๊ฒ ์ต๋๋ค.
mw_w_function_api_resolving (sub_1000E369)์ ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ํ์ธํด๋ณด๋ฉด 13๋ฒ ํธ์ถ๋๊ณ ์๋๋ฐ, ๊ทธ ์ค sub_1000606C ์๋ธ๋ฃจํด์์ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋ ๊ฒ์ ๋ฐ๊ฒฌํ์์ต๋๋ค.
sub_1000606C ์๋ธ๋ฃจํด์ ๋ค์ด๊ฐ์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
sub_1000606C ์๋ธ๋ฃจํด์ ๋ค์ด์๋ณด๋ ํ์๋์ง ์์ ๋ฐ์ดํธ ์ฐธ์กฐ(unk_)๋ฅผ ํ์ธํด๋ณด๋ฉด ์ํธํ๋ ๋ฐ์ดํธ๊ฐ ๋ง์ด ์์ต๋๋ค. ๊ทธ์ค ์ผ๋ถ๋ฅผ ๋๋ธ ์๋๋ก ๋ณํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด dword๋ค์ด CRC32 ํด์์ผ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
ํด์ ๋ฐ์ดํฐ๋ค์ด ์์ผ๋ HashDB ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค. HashDB๋ฅผ ํตํด ํน์ ํด์๊ฐ์ ์์ฑํ๋๋ฐ ์ฌ์ฉ๋ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์๋ณํ ์ ์์ต๋๋ค.
๋จผ์ XOR ํค๋ฅผ ์ค์ ํฉ๋๋ค. Edit → Plugins → HashDB๋ก ์ด๋ํ์ฌ XOR ํค๋ฅผ ์ค์ ํฉ๋๋ค.
Enable XOR๋ฅผ ํด๋ฆญํ์ฌ 218FE95B (mw_hashing_api ์๋ธ๋ฃจํด์์ ๋ณธ xor ํค)๋ฅผ ์ ๋ ฅํ๊ณ Refresh Algorithms๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ํด์(1E4E54D6h)๋ฅผ ์ค๋ฅธ์ชฝ ํด๋ฆญํด์ HashDB Hunt Algorithm์ ์ ํํฉ๋๋ค.
์๊ฐํ๋๋ก crc32 ์๊ณ ๋ฆฌ์ฆ์ด ํ์ง๋์์ต๋๋ค. crc32๋ฅผ ํด๋ฆญํ์ฌ OK๋ฅผ ๋๋ฆ ๋๋ค.
์ด์ ๋ฌธ์์ด ํด์๋ฅผ ์กฐํํ๊ธฐ ์ํด์ ์ฒซ ๋ฒ์งธ ํด์๋ฅผ ๋ค์ ์ค๋ฅธ์ชฝ ํด๋ฆญํ์ฌ HashDB Lookup์ ํด๋ฆญํ๋ฉด
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
์ด๋ ํด๋น ํด์๊ฐ kernel32.dll์ LoadLibraryA ํจ์๋ฅผ ๋ํ๋ธ๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
์ด ๋ชจ๋ ํด์๋ ๋์ผํ ๋ชจ๋์ CRC32 ํด์์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํด์(dword_1001BA30 ๋ฐ์ดํฐ)๋ฅผ IDA ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๊ฐ์ ธ์ค๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด ๋ชจ๋ ํด์๋ฅผ ์ ํํ์ฌ HashDB Scan IAT๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ค์บ์ด ์๋ฃ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ฐ ์์ผ๋ก ๋ชจ๋ ํด์ ๊ทธ๋ฆฌ๊ณ ํด๋น ํจ์์ ์ด๋ฆ์ .rdata ์น์ ์ ์์ต๋๋ค. ๋ฐฉ๊ธ ์ค์บํ ์ฃผ์๋ก๋ถํฐ ์๋๋ก ๊ฒ์ํ๋ฉด ๋ค๋ฅธ ํจ์๋ค์ API ์ด๋ฆ์ ๋ํ๋ด๋ ๋ฐ์ดํธ ์ํ์ค๊ฐ ๋ง์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ์ฐพ์์ ๋ชจ๋ ๋ฐ์ดํธ ๋ธ๋ก์ ์ ํํ๊ณ (์ ๋ก ๋ฐ์ดํธ ์ํ์ค๊น์ง) ์ค๋ฅธ์ชฝ ํด๋ฆญํ ํ HuntDB Scan IAT๋ฅผ ์ ํํ์ฌ ์ค์บ ์์ ์ ๋ฐ๋ณตํด์ผ ํฉ๋๋ค. ๊ท์ฐฎ์ง๋ง∼
์๋๋ HuntDB Scan IAT๊ฐ ๋ชจ๋ ์๋ฃ๋ (์ผ๋ถ) ํ๋ฉด์ ๋๋ค.
๋ชจ๋ API ์ด๋ฆ์ ๋ณตํธํํ์์ผ๋ ์ด์ ๊ฐ DLL์์ API ๋ธ๋ก์ ์ ์ฅํ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ก ๋ณตํธํํ API๋ค์ ๋ชจ๋ kernel32.dll์์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ฏ๋ก ํด๋น API๋ค์ ๋ชจ๋ ์ ํํ์ฌ ์ค๋ฅธ์ชฝ ํด๋ฆญํ ํ Create struct from select๋ฅผ ์ ํํ์ฌ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ฃผ๊ฒ ์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ฐ API๋ค์ ๋ํด ๋์ผํ๊ฒ ์์ ํด์ค๋๋ค.
๊ทธ๋ฐ ๋ค์ Strucrtures ํญ์์ ํ์ธํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
๋ค์ sub_1000606C ์๋ธ๋ฃจํด์ผ๋ก ๋์์ค๋ฉด ํด์ ๋ฐ์ดํฐ(dword) ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก sub_1000606C ์๋ธ๋ฃจํด๋ช ์ mw_iat_construction์ผ๋ก ๋ฐ๊พธ๊ณ , ๋ณ์๋ช ๋ค๋ ์์ ํด์ฃผ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด ์์ ์ฝ๋๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ PE ํฌ๋งท์ ์ถ๊ฐํ๊ณ API๋ฅผ ๋ชจ๋ ์ถ์ถ์ ์๋ฃํ์์ต๋๋ค.
๋๋จธ์ง๋ ๋ค์๋ฒ์ ์ด์ด์ ์งํํด๋ณด๊ฒ ์ต๋๋ค.
Ref. "Malware Analysis Series(MAS) – Article 2", Alexandre Borges