Qakbot ์ ์ฑ์ฝ๋๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ํจํน๋์ด ์๋ ํ์ผ์ ์ธํจํนํ๊ณ , ์ธ๋งคํ๋ ํ์๊ณผ ๋งคํ๋ ํ์์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ํ ํด์(SHA256)๋ 73e4969db4253f9aeb2cbc7462376fb7e26cc4bb5bd23b82e2af0eaaf5ae66a8์ ๋๋ค.
[ํ์ผ ์ ๋ณด ๋ถ์ ๋ฐ ์ถ์ถ]
VirusTotal์์ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ์ค๋ฒ๋ ์ด(overlay)๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- Qakbot ์ ์ฑ์ฝ๋์ ๋๋ค.
- ์ด์ํ ์ด๋ฆ์ ์น์
์ด ์์ต๋๋ค.
- ์๋ง ํจํน๋ ๊ฒ ๊ฐ์ต๋๋ค.
DIE๋ก ํ์ธํ๋ฉด ์ด ์ํ์ด Borland Delphi๋ก ์ปดํ์ผ๋์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
PE-bear๋ก ํ์ธํด๋ณด๋ฉด export ํจ์๊ฐ ํ๋(DLLRegistreServer)๋ง ์์ต๋๋ค.
์ ๋ณด๋ค์ ์กฐํฉํด๋ณด๋ ํด๋น ํ์ผ์ด ํจํน๋์๋ค๊ณ ํ๋จ๋ฉ๋๋ค.
์ธํจํน ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด ๋๋ฒ๊น ํด๋ณด๊ฒ ์ต๋๋ค.
rundll32.exe๋ฅผ ํตํด ๋๋ฒ๊น ์ธ์ ์ ์ค์ ํ๊ณ ๋ช ๋ น์ค ๋ฐ๊พธ๊ธฐ๋ฅผ ํตํด ์ ์ฑ์ฝ๋์ export ํจ์(#1)๋ฅผ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
- "C:\Windows\SysWOW64\rundll32.exe" C:\Users\user\Desktop\mas2_sample.bin,#1
๊ทธ๋ฆฌ๊ณ VirtaulAlloc, WriteProcessMemory, NtResumeThread API์ breakpoint๋ฅผ ์ค์ ํ๊ฒ ์ต๋๋ค.
- NtResumeThread
- ํน์ ์ค๋ ๋๋ฅผ ์ฌ๊ฐ์ํค๋ ์ญํ ์ ํ๋ ํจ์์ ๋๋ค.
- ์ค๋ ๋ ํ๋ฆ๊ณผ ์ค๋ ๋๊ฐ ์คํ๋๋ ์์ ์ ์ ์ดํ๋๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
- ๊ฐ์ผ ์ ์ด๋ฅผ ์ ์งํ๊ณ ์ ์ฑ์ฝ๋ ์คํ ์ ์ด๋ฅผ ์์ง ์๊ธฐ ์ํด ํด๋น API์ breakpoint๋ฅผ ์ค์ ํ๊ณ ํ๋ฆ์ ๋ถ์ํฉ๋๋ค.
breakpoint ์ค์ ํ ๊ณ์ ์คํ(F9)ํ๋ฉฐ VirtualAlloc์์ breakpoint๊ฐ ๊ฑธ๋ฆฌ๋ฉด, EAX ๋ ์ง์คํฐ์ ์ ์ฅ๋ ์ฃผ์๋ฅผ ๋คํ์์ ๋ฐ๋ผ๊ฐ๋ฉฐ ํ์ธํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ VirtualAlloc์ breakpoint๊ฐ ์ธ ๋ฒ์งธ๊น์ง๋ ๋ณ๋ก ํ์ ์๋ ์ ๋ณด๋ค์ ๋๋ค. ๊ทธ๋๋ ์คํ์ ๊ณ์ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋๋ฐ ๋๋ฒ๊ฑฐ๋ก ๋๊ธฐ๊ฒ ์ต๋๋ค(Shift+F9, RUN(pass all exceptions)).
๊ทธ๋ฆฌ๊ณ ๊ณ์ ์คํ(F9)ํ๋๋ฐ ๋คํ์ MZ ๋ฐ์ดํฐ๊ฐ ๋์ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ทผ๋ฐ ์ด PE ๋ฐ์ด๋๋ฆฌ์๋ .text, .data, .mrdata, .rsrc, .reloc์ ๊ฐ์ ์น์ ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด ์ค .mrdata ์น์ ์ ๊ธฐ๋ณธ ์น์ ์ด ์๋๋ฏ๋ก ๋ ๋์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ๊ณ์ ์งํํด๋ณด๊ฒ ์ต๋๋ค.
๋ค์ ์งํํ๋ฉด ์๋ก์ด PE ํ์ผ์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ํ์ธํด๋ณด๋ฉด ํค๋๊ฐ ๊นจ๋ํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ๋ ์ ์ฉํ ์ ๋ณด๋ ์๋๋๋ค.
๊ณ์ ์คํ(F9)ํ๋ค ๋ณด๋ฉด ๋๋ฒ๊ฑฐ๋ NtResumeThread์ breakpoint์ ๋์ฐฉํฉ๋๋ค. ์ด๋ ๋ํ๋๋ PE ๋ฐ์ด๋๋ฆฌ๊ฐ ๋๋์ด ์ฌ๋ฐ๋ฅธ ํ์ผ์ ๋๋ค.
ํด๋น ๋คํ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋งต์์ ๋ฐ๋ผ๊ฐ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ์ผ๋ก ์ ์ฅํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด์ ๊ณ์ ์คํํ๊ฒ ์ต๋๋ค.
WriteProcessMemory์ breakpoint์ ๋๋ฌํ ๋๊น์ง ์คํ(F9)ํ์ฌ ๋๋ฌํ๋ฉด ZwUnmapViewOfSection์ breakpoint๋ฅผ ์ค์ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์คํ์ ๊ณ์ํ๋ฉด ๋๋ฒ๊ฑฐ๊ฐ ZwUnmapViewOfSection์ breakpoint์ ๋๋ฌํ๊ฒ ๋ฉ๋๋ค.
์ด ์์ ์์ ZwUnmapViewOfSection API์ ๋ํด ์ ๊น ์ค๋ช ํด๋ณด์๋ฉด,
- ZwUnmapViewOfSection
- Windows ์ด์์ฒด์ ์์ ์ฌ์ฉ๋๋ NT ์์คํ ํธ์ถ(NT syscall) ์ค ํ๋๋ก, ๋ฉ๋ชจ๋ฆฌ ๋งต๋ ํ์ผ ๋๋ ์น์ ์ ์ธ๋งต(unmap)ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ด๋ จ๋ ์์คํ ์์ค์ ์์ ์ ์ํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ํ๋ก์ธ์ค์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์์ ํน์ ์น์ ์ ์ธ๋งต(์ฆ, ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ)ํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์ ์ฑ์ฝ๋์์์ ZwUnmapViewOfSection๋ ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ์ ๋งตํ๋ ํ์ผ์ด๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ฌ ํ์ผ์ ์จ๊ธฐ๊ฑฐ๋, ํ์ผ์ ๋ถ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ฅผ ํผํ๊ฑฐ๋ ๋์์ ์จ๊ธฐ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ZwUnmapViewOfSection ๊ตฌ์กฐ
NTSTATUS ZwUnmapViewOfSection(
HANDLE ProcessHandle, // ํ๋ก์ธ์ค ํธ๋ค
PVOID BaseAddress // ์ธ๋งตํ ์น์
์ ์์ ์ฃผ์
);
์ธ๋งต๋๋ ๋ทฐ์ ์ฃผ์๋ฅผ ํ์ธํ๊ธฐ ์ํด ZwUnmapViewOfSection์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋ผ๊ฐ๋ณด๊ฒ ์ต๋๋ค.
- ๋ทฐ(View): ํ๋ก์ธ์ค์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋งคํ๋ ํน์ ์น์
๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ(0x50E0000)๋ฅผ ๋คํ์์ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด PE ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ผ๋ก ์ ์ฅํ๊ฒ ์ต๋๋ค.
[๋งคํ(Mapping) ๋ฐ ์ธ๋งคํ(Unmapping)]
๋งคํ๊ณผ ์ธ๋งคํ ํ์์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋งคํ(Mapping)
- ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ์ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ธฐ์
- ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ง์ ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐฉ์
- ๋งคํ๋ ์
์ฑ์ฝ๋์ ํน์ง
- ๋ฉ๋ชจ๋ฆฌ ์์ ํ์ผ์ ๋งคํํ์ฌ ๋์คํฌ์์ ์ถ์ ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
- ๋งคํ์ ํตํด API ํธ์ถ์ ์ฐํํ๊ฑฐ๋ ๋๋
ํํ์ฌ ๋ถ์์ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
- ์ธ๋งคํ(Unmapping)
- ์ด๋ฏธ ๋งคํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ํ์ผ ๊ฐ์ ์ฐ๊ฒฐ์ ๋๋ ๊ณผ์
- ํ์ผ์ด๋ ์ฅ์น๊ฐ ๋์ด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ์ ์ฐ๊ฒฐ๋์ง ์๋๋ก ํ๋ ๊ฒ
- ๋งคํ๋ ๋ฉ๋ชจ๋ฆฌ ์์์ ํด์ ํ๊ณ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ค์ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
- ์ธ๋งคํ๋ ์
์ฑ์ฝ๋์ ํน์ง
- ์คํ ํ ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๊ณ ํ์ ์ ์์ ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
์ง๊ธ๊น์ง ๋ ๊ฐ์ ํ์ผ์ ์ถ์ถํ์ต๋๋ค. ๋ ํ์ผ์ ๋ชจ๋ ๋์ผํ ํ์ด๋ก๋๊ณ ํ์ผ๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- rundll32_047A0000_from_VirtualProtect.bin
- rundll32_050E0000_from_UnmapViewOfSection.bin
์ฒซ ๋ฒ์งธ ํ์ผ์ Qakbot์ ์ธ๋งคํ๋ ๋ฒ์ ์ด๊ณ ๋ ๋ฒ์งธ ํ์ผ์ Qakbot์ ๋งคํ๋ ๋ฒ์ ์ ๋๋ค.
์ฒซ ๋ฒ์งธ ํ์ผ rundll32_047A0000_from_VirtualProtect.bin์ .text ์น์ ์ 0x400์์ ์์ํ๋ฉฐ ์ด๋ ์ธ๋งคํ๋ ํ์์ ํน์ง์ ๋๋ค.
๋ ๋ฒ์งธ ํ์ผ rundll32_050E0000_from_UnmapViewOfSection.bin์ .text ์น์ ์ 0x1000์์ ์์ํ๋ฉฐ ๋งคํ๋ ํ์์ ํน์ง์ ๋๋ค.
PE-bear๋ฅผ ํตํด ํ์ธํด๋ณด๋ฉด,
์ฒซ ๋ฒ์งธ ํ์ผ rundll32_047A0000_from_VirtualProtect.bin์ imports ํจ์๊ฐ ๋ชจ๋ ๋์ด๋ฉ๋๋ค.
๋ ๋ฒ์งธ ํ์ผ rundll32_050E0000_from_UnmapViewOfSection.bin์ import table์ด ์๋ง์ ๋๋ค.
์๋ํ๋ฉด raw ์ฃผ์๋ค์ด ์ฌ์ ํ ์ธ๋งคํ๋ ํ์์ ๋์คํฌ ์ฃผ์๋ฅผ ๋ฐ์ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ ๋ฒ์งธ ํ์ผ ๊ฐ์ด ๋งคํ๋ ํ์ผ์ raw ์ฃผ์๋ฅผ ๋ฐ์ํด์ฃผ๋ฉด ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋งคํ๋ ํ์ผ์ ์์ ํด๋ณด๊ฒ ์ต๋๋ค.
1. ๋ชจ๋ virtual ์ฃผ์๋ฅผ raw ์ฃผ์ ์์ ๋ณต์ฌํฉ๋๋ค.
2. ์น์ ์์ ์ฃผ์๋ค ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ raw size์ virtual size๋ก ์ฌ์ฉํฉ๋๋ค.
3. ์ด๋ฏธ์ง ๊ธฐ๋ณธ ์ฃผ์(base address)๋ฅผ ๋ณ๊ฒฝํด์ ๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ๋ณธ ์ฃผ์๋ฅผ ๋ฐ์ํฉ๋๋ค.
image base๋ ๋๋ฒ๊ฑฐ์์ ํ์ผ์ ์ถ์ถํ ๋ ๋ณ๊ฒฝ ์์ด ์ ์ฅํ๋ค๋ฉด ํ์ผ๋ช ์ ์ ํ์ ธ ์์ต๋๋ค.
์ ์ ๊ฒฝ์ฐ image base๊ฐ 0x50E0000์ ๋๋ค.
์ด ๊ณผ์ ์ ๋ง์น๊ณ PE-bear์ imports๋ฅผ ํ์ธํด๋ณด๋ฉด ์์๊ฒ ์ ์ ๋ฆฌ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ๋งคํ ๋ฐ ์ธ๋งคํ๋ ํ์ผ ๋ชจ๋ ์ธํจํน์ด ๋ง๋ฌด๋ฆฌ๋์์ต๋๋ค. ๋ ํ์ผ ๋ฐ์ดํฐ๋ ๋ชจ๋ ๋์ผํ Qakbot ํ์ด๋ก๋์ ๋๋ค.
๋ค์์๋ ์ธํจํนํ Qakbot DLL์ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
Ref. "Malware Analysis Series(MAS) – Article 2", Alexandre Borges