본문 바로가기

공부/콤퓨타

malware(fping.exe)

728x90
반응형

Malware 간단 분석

 

fping.exe (unpacking)

 

사전 준비: IDA, OllyDbg

 

패킹 유/무 확인툴은 PEiD or Stud_PE

* PEiD 는 0.95 버전에서 멈춤 Stud_PE 는 계속 업데이트 중

(최근 악성코드 패킹 여부는 둘다 못잡는건 매한가지;;)

 

프로그램 메인함수:
C, C++, Delphi => WinMain() or main()
Visual Basic => TurnRTMain()

 

IDA 로 메인함수 확인

WinMain() = 00401050

 

 

 

 

OllyDbg 00401050 start

 

 

 

 

 

CALL GetFileAttributesA()

-> 파라미터로 지정한 파일의 속성 정보를 얻어오는 역할 (파일 유/무 체크)
스택 정보: 0012F3B0   0040509C  \FileName = "C:\Windows\System32\fping.exe"

 

CALL GetFileAttributesA() 실행

Registers EAX FFFFFFFF

CMP EAX, -1 (ZF = 1 , 파일이 없으므로)
0040106A JNZ fping.00401161 (ZF = 1 이므로 00401070 이동)

 

* Tip !!
파일 존재 O => EAX 00000020 일 경우 ZF = 0
파일 존재 X => EAX FFFFFFFF 일 경우 ZF = 1

 

 


 

 

CALL GetModuleFileNameA()
-> 파라미터로 지정한 핸들의 파일 경로를 특정 메모리에 저장하는 역할

004010B3 CALL GetModuleFileNameA 실행
   * Follow in Dump 로 메모리 공간 확인 -> C:\fping.exe 문자열 확인 

 

 

 

 

 

CALL fopen()
-> Win32 API CreateFile() 과 비슷한 역할
-> Access 권한으로 생성, 읽기 여부 판별 가능
-> 파일을 읽기/생성에 성공할 경우 해당 파일의 핸들 값을 리턴 값으로 반환
* rb(Read Block): 파일 읽기, wb(Write block): 파일 생성

* tip: CopyFile 이 더 간단

 

004010C6 CALL fopen() 실행
EAX 77C0FCE0 => "C:\fping.exe" 의 핸들값
004010F0 CALL fopen() 실행
EAX 77C0FD00 => "C:\Windows\System32\fping.exe"의 핸들값

 

 

 

 


껍대기 파일 생성 확인

 

 

 

 

CALL fread()
-> 파라미터로 지정한 핸들이 가리키는 파일의 데이터를 읽어와 메모리에 저장하는 함수

 

0040111C  CALL  fread() 실행
파라미터 확인
0012F3A4   0012F424 => 저장할 메모리 주소 (덤프 확인, 시작주소 MZ 확인)
0012F3A8   00000001  => size = 1 Byte
0012F3AC   00000200  => 200(512), 파일을 읽어오는 갯수

0012F3B0   77C0FCE0  => 핸들 값

 

 

 

 

CALL fwrite()
-> 파라미터로 지정한 핸들이 가리키는 파일의 데이터를 삽입하는 함수

 

00401131 CALL fwrite() 실행
파라미터 확인
0012F3A4   0012F424  => 삽입하는 데이터가 저장된 메모리 주소
0012F3A8   00000001  => size = 1 Byte

0012F3AC   00000200  => 200(512), 삽입하는 데이터의 총 갯수
0012F3B0   77C0FD00  => 삽입하는 대상 파일의 핸들 값
* 00401128 ~ 00401150 루프돌며 데이터 삽입

 

 

 

 

 

CALL fclose()
-> 파일의 끝을 알려주는 함수

00401159 CALL fclose 실행

 

 

fping.exe 파일 확인

 

 

 

 

CALL CreateProcessA()
-> 새로운 프로세스를 생성시키는 함수

 

004011D0  CALL CreateProcessA() 실행
파라미터 확인 (CommandLine 중요)
0012F390   0012FB28  ASCII "netsh firewall set portopening TCP 219 \"Multimedia Object Scheduler\""

* TCP/219 port open

 

 

 

 

 

CALL EDI  ADVAPI32.OpenServiceA()

-> 등록된 윈도우 서비스의 핸들(서비스 삭제/수정 등)을 얻어오는 기능의 함수

 

00401209   CALL EDI  ADVAPI32.OpenServiceA() 실행

EAX 00000000 (서비스가 있다면 핸들값을 가져옴, 0으로 보아 서비스가 없음을 추정)


파라미터 확인
C:\Windows\System32\index.exe

 

파일이 있다고 가정하에

0040120D  JE SHORT fping.00401222 -> ZF 0 으로 수정

 

indax.exe 파일과 서비스 삭제 루틴 확인

 

DeleteService()

00401210  |.  FF15 0C404000   CALL DWORD PTR DS:[<&ADVAPI32.DeleteServ>;  ADVAPI32.DeleteService

DeleteFileA()

0040121C  |.  FF15 54404000   CALL DWORD PTR DS:[<&KERNEL32.DeleteFile>; \DeleteFileA

 

그리고 OpenServiceA() 실행
0040122F  CALL EDI  ADVAPI32.OpenServiceA
EAX 00157428 => 서비스가 추정
00401233   JNZ SHORT fping.00401277 -> 이동

 

 

 

 

 

CALL StartServiceCtrlDispatcherA()
-> scvhost 프로세스 호출되어 ServiceMain 함수 실행
-> 서비스로 동작될때 실행되는 메인 함수

004012A2   CALL DWORD PTR DS:[<&ADVAPI32.StartServi>; \StartServiceCtrlDispatcherA 실행


* svchost(윈도우 서비스 프로세스) 서비스 분석을 위해선 다른 디버깅 방식으로 진행
파라미터 확인
0012F3B0   \pServiceTable = 0012F3C0
-> 파일이름과 메모리주소 정보 획득

 

** 004012C0 ServiceMain 주소
004012C0   MOV EAX,DWORD PTR DS:[405078]
-> New Origin here : 지정한 위치로 EIP 강제 변경 기능 (EIP 004012C0)

 

* tip: CALL 함수명, CALL 메모리주소 차이
CALL 함수명 = 일반 API 함수, CALL 메모리주소 = 서브루틴 함수 (ex. 개발자가 직접 정의한 함수)

 

 

 

 

 

 

CALL fping.004013C0
-> IDA 로 흐름 확인 (시간 단축)

00401307   CALL fping.004013C0 실행 (F7)

0040101E  XOR AL,CL -> CL=3F, AL=0D (AL=데이타, CL=XOR KEY)

-> 데이터 암/복호화에 주로 사용


00401020  MOV BYTE PTR DS:[ESI],AL

0040101A ~ 0040102A 루틴
-> 덤프 확인 (222.186.23.11 주소 확인, 데이터 암호화)
00401034 RETN

 

 

 

 

 

CALL WSAStartup()
-> WS2_32.DLL 라이브러리: 네트워크 연결 관련 함수 저장
-> WSAStartup 함수를 통해 WS2_32.DLL 라이브러리를 사용할 수 있도록 초기화 필요
-> 해당 함수가 사용되면 악성코드가 네트워크 연결을 시도하는 것으로 예측 가능

004013EB   CALL WSAStartup() 실행

CALL socket()

-> 네트워크 연결을 맺기 위한 소켓 생성 함수

004013FD  CALL EDI  socket() 실행

 

 

 

 

 

 CALL ntohs()
-> 16진수 빅 엔디언 데이터를 16진수 리틀 엔디언 값으로 변환
-> 세션 연결 및 포트 오픈 시 사용하는 포트 넘버를 16 진수 리틀엔디언 값으로 변환 (0DB = 219)
파라미터 확인 (0DB)

0040144C  CALL DWORD PTR DS:[<&WS2_32.#13>]        ; \listen

 004014A1  CALL DWORD PTR DS:[<&WS2_32.#9>]         ; \ntohs

004014B8  CALL DWORD PTR DS:[<&WS2_32.#11>]             ; \inet_addr
-> IP 주소를 Long 데이터 형 숫자로 변경하는 기능의 함수
-> Connect 함수 사용 시 연결하는 ip 주소를 Long 형 데이터로 파라미터를 전달 받음


* tip: inet_addr 함수는 IP형식일때, gethostbyname 함수는 도메인 형식일때 사용


004014CA  CALL DWORD PTR DS:[<&WS2_32.#4>]             ; \connect
-> connect 는 0 이 성공을 의미, 실패는 -1

 

* tip: 백도어류는 ntohs + bind + listen 까지 실행하면 포트 열림

 

 

 

 

 

 004014E4  CALL DWORD PTR DS:[<&WS2_32.#19>]            ; \send
파라미터 확인
0012FC3C   00000094  |Socket = 94
0012FC40   0012FC5F  |Data = 0012FC5F ** 전송하는 데이터가 저장된 메모리 주소
0012FC44   00000001  |DataSize = 1 * 0012FC5F 부터 1개 보냄, 즉 01 값만 보냄 (01로 감염여부 추정)
0012FC48   00000000  \Flags = 0

 

004014F4  CALL DWORD PTR DS:[<&WS2_32.#16>]            ; \recv
파라미터 확인
0012FC3C   00000094  |Socket = 94
0012FC40   0012FC5F  |Buffer = 0012FC5F * 전달받은 데이터를 저장하는 메모리 주소
0012FC44   00000001  |BufSize = 1
0012FC48   00000000  \Flags = 0

 

* tip: send => 데이터 발송, recv => 데이터 수신

 

 

 

 

004014FA  CMP BYTE PTR SS:[ESP+13],10
01 과 10 값이 같지 않기 때문에 이동 (00401588   PUSH EBP ; /Socket) 클로즈


같다고 가정 ZF = 1 로 조작

 

 

 

 

 

 

CALL  beginthreadex()
-> Win32 API의 CreateThread 함수와 동일한 기능을 지닌 함수
-> 프로세스 쓰레드를 생성하여 특정 코드를 실행
-> 해당 악성코드는 서버와 연결 시 쓰레드를 생성하여 특정 코드를 실행시킴
beginthreadex 를 추가 정보할 필요가 있음 (악성코드 추가 행위, 제작자의 의도 파악 가능)

 

기능 설명:

00401563  CALL <JMP.&MSVCRT._beginthreadex>            ; \_beginthreadex 실행

0040155C  |.  68 A0154000   |PUSH fping.004015A0                          ; |start = fping.004015A0 * 생성된 스레드가 실행되는 주소
00401561  |.  56            |PUSH ESI                                     ; |stksize => 0
00401562  |.  56            |PUSH ESI                                     ; |security => NULL
00401563  |.  E8 40190000   |CALL <JMP.&MSVCRT._beginthreadex>            ; \_beginthreadex

 

 

00401530  CALL DWORD PTR DS:[<&WS2_32.#18>]            ; \select
-> 해당 Listen 한 포트로 연결되었는지 모니터링
EAX 00000000 은 실패, 00000001 은 성공
ZF 조작해서 다음단계로 넘기

0040154E  CALL DWORD PTR DS:[<&WS2_32.#1>]             ; \accept
-> 클라이언트의 접속 요청을 승인하고 통신 전용 소켓을 생성

 

** 악성코드가 서버가 비 정상적으로 동작되어 여기까지 정리 !!

 

 

 

 

- fping.exe 를 보다 -

 

 

 

 

728x90
반응형

'공부 > 콤퓨타' 카테고리의 다른 글

DLL 인젝션 개념  (0) 2015.10.30
Packing and UnPacking  (1) 2015.10.30
악성 도메인 구별법  (0) 2015.10.28
IDA + OllyDbg  (0) 2015.10.27
Cheat Engine  (0) 2015.10.27