최근 악성코드 실행 압축 사례 및 분석기법

Download Report

Transcript 최근 악성코드 실행 압축 사례 및 분석기법

최근 악성코드의 실행 압축 사례
및 분석 기법
ESTsoft
DB분석팀
최근 실행 압축 동향
•
•
•
UPX (주로 중국발 대량 배포)
Custom Packing (최근일수록 높은 난이도)
do nothing
•
Code Inject이 대다수
•
자신이 할당 받은 ImageBase가 아닌 곳을 할당하여 실제 악성코드, 실제 사용하
는 데이터를 복사
•
사용하는 함수를 보여주지 않게 하고 크기를 줄이기 위해 실행 압축에서는
LoadLibrary -> GetProcAddress를 사용하여 실행압축 해제 중 실제 사용되는
API를 재 구성
따라서 kernel32.GetProcAddress에 Break를 걸고 디버깅 중 Break가 걸리면 암
호화 된 코드 복호화 후 API 재 구성 중으로 판단
•
OllyDbg와 같은 가장 많이 쓰이는 분석툴에서 디버깅을 어렵게
Injection Flow
•
•
•
•
•
•
•
•
•
•
API 흐름의 예
1. CreateProcessA (중지된 상태로 실행)
2. GetThreadContext (실행된 프로세스의 메인 스레드 정보를 읽어옴)
3. ReadProcessMemory (실행된 프로세스의 내용을 읽어옴)
4. ZwUnmapViewOfSection (읽어온 내용 지우기)
5. VirtualAllocEx (실행한 프로세스에 메모리 할당)
6. WriteProcessMemory (할당한 메모리에 새로운 악성코드, 데이터 주
입)
7. SetThreadContext (새 메인 스레드 정보 설정)
8. ResumeThread (중지된 프로세스 시작)
힌트!
암호화가 되어 있다면 결과적으로 ResumeThread API이전에 복호화가
끝나야 함
사례 1
V.WOM.Conficker
• 타사명 (Downadup, Kido)
• 막강한 전파력 (MS취약점, 공유폴더, USB)
• A,B,C,D의 다수 버전이 존재
Packed Image flow chart
VS
Unpacked Image flow chart
V.WOM.Conficker’s API (Packed)
악성으로 사용 할 수 있는 API는 거의 없음!
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
msvcrt._adjust_fdiv
user32.BlockInput
msvcrt.ceil
msvcrt._CIacos
msvcrt._CIasin
msvcrt._CIcosh
msvcrt._CIsinh
ole32.CoFileTimeNow
ole32.CoRevertToSelf
msvcrt.div
msvcrt.div
msvcrt.__doserrno
shell32.DriveType
msvcrt.floor
msvcrt.free
gdi32.GetBkMode
user32.GetClientRect
user32.GetDesktopWindow
user32.GetGUIThreadInfo
user32.GetIconInfo
user32.GetLastActivePopup
kernel32.GetLastError
user32.GetMenuContextHelpId
gdi32.GetPixel
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
kernel32.GetProcAddress
kernel32.GetProcessHeap
kernel32.GetStartupInfoA
kernel32.GetSystemTimeAsFileTime
user32.GetTitleBarInfo
user32.GetTopWindow
user32.GetWindowContextHelpId
user32.GetWindowDC
user32.GetWindowInfo
user32.GetWindowRect
user32.GetWindowRgn
user32.GetWindowTextLengthA
advapi32.InitializeSecurityDescriptor
msvcrt._initterm
kernel32.InterlockedDecrement
kernel32.IsBadCodePtr
kernel32.IsBadStringPtrA
kernel32.IsBadWritePtr
user32.IsCharAlphaA
user32.IsCharAlphaNumericA
user32.IsCharLowerA
user32.IsCharUpperA
msvcrt._isctype
kernel32.IsDBCSLeadByte
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
user32.IsIconic
user32.IsMenu
advapi32.IsValidSecurityDescriptor
advapi32.IsValidSid
user32.IsWindowUnicode
user32.IsZoomed
msvcrt._itoa
kernel32.LoadLibraryA
msvcrt._ltoa
msvcrt.malloc
msvcrt.__mb_cur_max
msvcrt._pctype
kernel32.QueryPerformanceCounter
kernel32.QueryPerformanceFrequency
msvcrt.rand
shell32.RealDriveType
kernel32.SetLastError
kernel32.Sleep
msvcrt._swab
msvcrt.time
kernel32.VirtualAlloc
kernel32.VirtualProtect
user32.BlocInput?
• The BlockInput function blocks keyboard and mouse
input events from reaching applications.
• 키보드와 마우스의 입력을 막을 때 사용
(Ctrl + Alt + Delete를 입력하면 풀림)
• 실행압축에서는 분석가의 입력을 막아서 디버깅 방지
• 해결 = OllyAdvanced와 같은 Plug-in이나
user32.BlockInput 코드 패치
Packer의 특징#1
• 난해하고 지루한 코드가 뒤섞인 Decrypt 루틴
• 실행 압축의 원리 및 경험 필요
Packer의 특징#2
PUSH, POP으로 레지스터에 데이터 복사
Packer의 특징#3
의미없는 API 사용
• 항상 같은 결과가 나오게 API를 사용
Packer의 특징#4
• 참조하는 데이터를 하나 찾기 위해 엄청난 수고를 들여
야함
• 실제 악성코드는 덤프를 떠도 PE헤더가 없음!
사례 2
V.TRJ.LdPinch
• FTP서버를 타겟으로 서버 주소와 계정을 공격자에게 전
송하는 악성코드
• 주로 해킹된 웹사이트에서 유포
Packer의 특징#1
• 자신을 자식 프로세스로
한번 더 실행하고 메인
스레드의 내용을 실제
악성 행위의 코드, 데이
터로 Inject
• 복호화 루틴과 복호화
할 시작위치를 찾자!
Packer의 특징#1-a
Packer의 특징#2 (Dropped Dll)
•
복호화하면 일반적인 PE파일로 바로 분석가능
•
PECompack으로 Packing되어 있음
(PECompack의 특징은 section이름을 PEC로 생성하고
Exception Handler사용으로 복호화, 난이도는 낮음)
Packer의 특징#2-a (Dropped Dll)
감사합니다.