블로그로 돌아가기
research

실전 악성코드와 Malware 분석v1

악성코드 분석 기법 입문 — 정적/동적 분석, 악성코드 유형, Windows DLL 임포트 분석

··4분 읽기
malwarereversingwindowsstatic-analysisdynamic-analysis

악성 코드 분석 기법

기초 정적 분석 - 실행 코드를 보지 않고.. 해쉬값이 다르다거나, 데이터 크기가 다르다거나 그런 정보를 얻어내는 과정

고급 정적 분석 - 디스 어셈블링, ex) IDA

기초 동적 분석 - 악성코드 실행 후 감염 흔적 제거, 시그니처 제작

쉽게 예를 들면 가상 환경에서 바이너리 실행

고급 동적 분석 - 디버거로 분석

악성 코드 유형

백도어 - 최초 공격시 백도어를 남기고 지속적으로 타겟 PC에 접속하기 위한 목적으로 남기는 바이러스다.

봇넷 - 쉽게 설명하지만 타겟PC에 잠복해 있고, 공격자의 명령을 받고 실행하는 목적으로 제작되는 바이러스다. 공격자의 명령은 C2서버로부터 명령을 수신한다.

다운로더 - 공격자가 타겟PC에 전송 후 "접근권한을 얻으면" 2차적인 공격을 위해 프로그램을 다운 받게 하는 악성 바이너리이다.

정보 유출 악성코드 - 타겟PC에서 정보를 유출하기 위한 악성코드이다. 스니퍼, 패스워드 해시 수집, 키로거가 그 예이다.

///실행기(Launcher)?? - 다른 악성 프로그램을 실행할 때 사용하는 악성 프로그램이다. 일반적으로 시스템의 상위권한이나 은폐를 위해 다른 악성 프로그램을 실행할 때 이전 기법과 다른 기법을 사용한다??????????????

루트킷 - 백도어 + 다운로더

스케어웨어 - 무서운거

웜/바이러스 - 자기 자신을 복제해 추가로 감염시키는 악성코드

초반 탐색

바이너리 검색 : 이미 알려진 바이러스일 수도 있다. 그렇기에 바이러스 토탈 같은 것으로 먼저 스캐닝을 해본다. 그리고 어떤 문제에서는 포렌식 문제 풀이중 메일에서 바이너리를 찾는 도중 백신 격리공간에 바이너리가 있던 경우도 있다.

해쉬비교 : 일반 프로그램과 악성 코드를 구별하기 위해 해쉬를 비교해본다. 값이 다르면 변조되었을 가능성이 높다.

문자열 검색 : 프로그램 내에서 URL같은 것들은 모두 String으로 저장되어 있다. Strings 프로그램을 이용해 아스키나 유니코드 포맷으로 저장된 문자열을 검색 할 수 있다.

(MS는 유니코드를 Wide Character String이라는 용어를 사용한다.)

ASCII : ex) BAD(\x42\x41\x44\x00)

UNICODE : ex) BAD(\x42\x00\x41\x00\x44\x00\x00\x00)

종종 의미 있는 정보를 얻을 수가 있는데 하나는, 에러 메시지를 통해 시스템을 유추 할 수 있다.

패킹 : 패킹되고 난독화된 코드는 적어도 LoadLibrary와 GetProcAddress 함수를 포함하는데, 추가 함수를 로딩에 접근하는 데 사용한다.

패킹된 프로그램을 실행하면 작은 래퍼프로그램이 패킹된 파일의 압축을 해제한 후 언패킹된 파일을 실행한다. 패킹된 프로그램을 정적으로 분석할 때는 작은 래퍼 프로그램만 분석 할 수 있다.

분석시 보여지는 공통적인 몇가지 DLL

Kernel32.dll - 커널정보(메모리, 파일, 하드웨어 접근/조작)같은 핵심 정보를 담은 DLL이다.

Advapi32.dll - 이 DLL을 사용하면 서비스 관리자나 레지스트리 같은 추가 핵심 윈도우 컴포넌트에 접근할 수 있다.

User32.dll - 버튼, 스크롤바, 사용자 행위 제어와 반응 컴포넌트 등 모든 사용자의 인터페이스 컴포넌트를 담고 있다.

Gdi32.dll - 그래픽에 대한 관련 함수 들을 담고 있다.

Ntdll.dll - 윈도우 커널 인터페이스이다. 항상 간접적으로 Kernel32.dll을 통해 임포트 하지만, 실행파일은 일반적으로 이 파일을 직접 임포트 할 수 없다.

실행 파일이 이 파일을 임포트하면 이는 작성자가 윈도우 프로그램에 일반적으로 허용된 기능으로 사용하지 않는다는 의미이다. 기능을 숨기거나 프로세스를 조작하 는 등의 특정 작업에 이 인터페이스를 이용한다.

WSock32.dll - 네트워킹 관련 DLL이다.

Wininet.dll - FTP, HTTP, NTP같은 어플 계층단의 네트워크 함수를 담고 있다.

*** 함수명 관례 ***

윈도우에서는 CreateWindowEx와 같이 Ex로 끝나는 함수 명을 볼 수가 있는데 이는 MS가 업데이트한 신규 함수와 기존함수의 호환성 해결을 위해 만든것으로 새로운 함수가 기존함수와 같은 이름일 경우 Ex를 붙인다. 매우 중요하게 두 번 업데이트 된 함수의 경우 Ex접미사가 두번 붙는다.

그리고 또한 CreateMessageBoxA나 W같은 함수의 경우 함수가 문자열 인자를 가지는 버전에 대한 접미사를 붙이는데

A는 Ascii문자열이며 W는 Wide Character Strings(UNICODE) 문자열이다.

PotentialKeylogger.exe

바이너리를 分석할 순 없었다. 왜냐하면 바이너리가 없기 때문이다. 딥빡

PotentialKeylogger.exe 의 내용을 요약하자면 악성코드 분석 관점에서 가장 흥미 있는 함수에 초점을 맞춰본다.\

Kernel32.dll의 함수는 프로세스 생성/조작함수(OpenProcess, GetCurrentProcess, GetProcessHeap)와 FindFirstFile, FindNextFile 함수는 디렉토리를 통해 검색할때 사용된다.

User32.dll의 함수는 좀 많다 수많은 GUI 조작함수(RegisterClassEx, SetWindowText, ShowWindow)가 프로그램이 GUI를 갖고 있을 가능성이 높음을 암시한다.(GUI가 사용자에게 꼭 필요하지 않더라도).

SetWindowsHookEx는 일반적으로 스파이웨어에서 사용되고 키로거가 키보드 입력을 받기 위해 사용하는 가장 대중적인 방식이다. 이 함수는 악성코드의 경우에선 키로깅이 존재한 다고 의심할 수 있다.

RegisterHotKey 함수도 유의해야 한다. 사용자가 단축키 조합을 누를 때마다 어플에 전달될 수 있게 단축키(HotKey)를 등록한다. 어떤 어플이 현재 동작중인 단축키를 통해 사용자가 이 어플을 동작하게 할수 있다.

GDI32.dll 은 위에서도 말했듯이 그래픽관련 dll이며 프로그램이 GUI를 갖고 있음을 확신할 수 있다. Shell32.dll 은 이 프로그램일 다른 프로그램을 실행할 수 있다는 사실을 의미하 는데, 이 기능은 악성코드와 정상적인 프로그램에 모두 일반적이다.

Advapi32.dll은 프로그램이 레지스트리를 사용함을 알려주는데, 레지스트리 키와 같은 문자열을 검색해야 함을 의미한다. 이 경우 Software\Microsoft\Windows\CurrentVersion\Run 문자열을 발견 할 수 있는데, 이는 윈도우가 부팅시 자동으로 실행되게 제어하는 레지키이다.

실행파일의 익스포트가 있을 수도 있는데 예를 들어 LowLevel(Keyboard/Mouse)Proc 같은 함수들은 SetWindowsHookEx의 콜백함수로 정의되어있다. 이 익스포트 함수의 경우 MSDN 문서와 같은 이름으로 지정했기에 정보를 얻을 수 있었다. Import와 Export함수의 정적分석을 통해 중요한 결론이나 가설을 세워 볼 수 있었다.

하나는 SetWindowsHookEx함수를 이용해 Keystrokes를 기록하는 로컬 키로거일 가능성이 있고 특정(?) 사용자에게만 보이는 GUI를 이용한다는 사실과 RegisterHotKey로

단축키를등록하고 공격자가 키로거 GUI에 접근해 기록된 키 값을 보는행위를 유추해볼 수 있다.

나아가 레지스트리 함수와 Software\Microsoft\Windows\CurrentVersion\Run가 있다는 사실을 통해 스스로 자동 시작에 등록한다고 추측 할 수 있다.