오늘의 분석 파일

기초 정적 분석

VirusTotal

대부분이 이를 악성코드라고 판단하고 있다.

 

PEiD

이는 UPX로 패킹되어 있음을 알 수 있다.

 

복제 후 exe 파일로 확장자 변경
upx.exe -d -o unpacked_malware.exe malware.exe 

upx -d 옵션을 사용해 언패킹해준다

 

pestudio 실행

pestudio는 정적 분석 도구로, 각 세션에서 blacklist에 등록된 기능, 문자열, API 등 모든게 파악 가능하다.

 

특히 IAT 부분을 살펴보면 절반이 blacklist에 등록되어 있다

[+]ADVAPI32.dll 레지스트리 RegDeleteKeyA
RegCloseKey
RegQueryValueEx
RegSetValueEx
RegDeleteValueA
RegCreateKeyExA
RegOpenKeyExA
  서비스 CreateServiceA
OpenServiceA
QueryServiceConfigA
CloseServiceHandle
ChangeServiceConfigA
ControlService
StartServiceA
OpenSCManagerA
[+]KERNEL32.dll 일반 GetLastError
GlobalFree
WaitForSingleObject
GetTickCount
GetModuleFileNameA
LoadLibraryA  : 라이브러리 강제 불러오기
GetShortPathNameA
GetStartupInfoA
LocalAlloc
lstrcatA
DeleteFileA
CreateThread
GetModuleHandleA
FindFirstFileA
CloseHandle
GetEnvironmentVariableA
GlobalAlloc
GetCurrentThreadId
SetLastError
  리소스 FindResourceA
SizeofResource
LoadResource
LockResource
CreateFileA
WriteFile
  패킹 LoadLibraryExA
GetProcAddress : 불러온 라이브러리로부터 API를 강제로 소환
  파일 관리 MoveFileExA
GetFileSize
SetFileAttributesA
GetSystemDirectoryA
FindNextFileA
FindClose
GetTempPathA
CreateFileA
WriteFile
CreateFileMappingA
UnmapViewOfFile
MapViewOfFile
CopyFileA
  디바이스 DeviceIoControl
GetLogicalDriveStringsA
GetDriveTypeA
  스트링 lstrlenA
lstrcmpA
lstrcpyA
[+]SHELL32.dll ShellExecuteA 지정된 파일에 대해 작업을 수행
[+]USER32.dll wsprintfA 형식화 된 데이터를 지정된 버퍼에 씀

 

IAT를 보면 레지스트리 조작, 서비스 조작 등을 수행한다는 사실을 쉽게 파악할 수 있다.
또한 디바이스 드라이버, 디렉터리 관련 API를 많이 사용하는 것으로 보아 디렉터리 조작 등의 추가적인 수행이 있을 것으로 보이며, 리소스로부터 exe 파일을 드로핑하여 실행할 것으로도 추측할 수 있다.
파일 내부에는 CreateProcessA는 보이지 않는데 이런 추가적인 실행은 ShellExecureA를 통해서 할 것으로 추측된다.

 


 

기초 동적 분석

 

SysAnalysis 에 파일을 올리고 Start

 

 

현재 실행중인 프로세스는 단 한개.

PPID 720 -> Hex 값으로 2D0

 

Logging을 살펴보면 기존 PID(2D0)와 hex 값(1CC)이 다른 것을 확인할 수 있고

svchost는 여기서 실행된 것이 아님을 알 수 있다.

 

Open Ports를 보면 해당 프로세스가 4개의 포트를 열고 있다

 

Process DLLs : dll이 실행될 때 scvhost.exe도 실행이 된다

 

Reg Monitor : 레지스트리 값이 변경됐음

 

 

Directory Watch data : 레지스트리 값을 생성/변경함을 확인할 수 있음(용량이 크므로 dll이 아닐까 추정)

 

Mutex : PID에 해당하는 뮤텍스가 몇개 있지만 악성코드 인지 파악 불가

 

Pipes : 파이프 등록(net?뭐시기니까 인터넷 사용하는 것이 아닐지 추측)

 

 

SYSTEM 디렉토리에 64to32.dll을 만들어 서비스에 등록하고(scvhost.exe) 이 dll이 네트워크 파이프를 통해 통신을 한다.

 

 

 

 

문제

(이전 문제와 이어지는 것 같다)

Betty가 Gregory를 만나면서 그녀의 행적을 감추려고 한다고?!

이들이 어느 도시에서 만날지 알아야 한다.

 

round2.pcap에서 [Statics]-[Conversations]에서 통계 확인

1024 포트를 사용해서 많은 양의 데이터가 오고 간 것을 확인할 수 있었고 

이를 TCP Stream을 통해 따라 들어가보면

 

알 수 없는 글자들 뿐

패킷이 암호화 or 난독화 되어 읽을 수 없다.

 

이때, NetworkMiner 도구를 사용하면 유용하다고 한다.

 

NetworkMiner

: Windows 용 Network Forensic Analysis Tool(NFAT)
: 운영체제, 세션, 호스트 이름, 열린 포트 등을 검색하기 위해 수동 네트워크 스니퍼/패킷 캡처 도구로 사용
: PCAP 파일에서 전송 된 파일 및 인증서를 다시 생성/재구성 함
: 고급 네트워크 트래픽 분석을 쉽게 수행해줌
: 웹 사이트에서 네트워크를 통해 스트리밍이 되는 미디어 파일을 추출하고 저장하는데 사용되기도 함

 

NetworkMiner

NetworkMiner를 사용하니 많은 파일들이 복구된다. 여기서 Message 탭을 들어가보겠다.

 

이들의 대화 내용이 보이고, 비밀번호(S3cr3tVV34p0n)가 나와있다. 

뭐에 대한 비밀번호지?

 

마지막 메세지

마지막 메세지를 살펴보면 DCC SEND 프로토콜을 이용하여 소통한 것임을 알 수 있다.

 

DCC(Direct Client-to-Clinet)
: IRC와 관련된 하위 프로토콜파일을 교환할 때 사용(단말기-단말기 통신을 위해 사용)

DCC CHAT <protocol> <ip> <port>
: ip와 port는 발신자의 것이며 정수로 표시

DCC SEND <filename> <ip> <port> <file size>

 

 

결국,  819,200 byte 크기의 '3nd3zv0us;라는 파일을 1024번 포트를 통해 보냈다는 것을 알 수 있다.

비밀번호는 이 파일에 대한 것이겠지?

TCP Stream

TCP Stream에서 819KB 크기를 가지는 패킷만 선택하여 파일을 저장해준다.(복구)

※ 저장 시 주의!! Show data as 저 부분을 Raw로 설정한 후 저장해야 한다※ 

 

이 파일은 헤더 시그니처가 존재하지 않고 비밀번호

와 연관된 파일이란 특징을 생각해봤을 때, 

TrueCrypt로 암호화된 파일이라고 추측된다.

 

트루크립트(TrueCrypt)
: 실시간 파일 암호화(on-the-fly encryption (OTFE))를 지원하는 응용 소프트웨어

 

 

복구한 파일을 올리고 저장소 선택, Mount 클릭
그러면 이렇게 비밀번호를 입력하는 창이 뜬다

아까 얻었던 비밀번호 S3cr3tVV34p0n 를 입력해본다.

 

성공적으로 마운트

이 디스크를 들어가보면 두 개의 파일이 존재한다

 

이 둘이 만나기로 한 장소는 LAS VEGAS이다,

 

 

'Study > Forensic' 카테고리의 다른 글

[Network Forensic] DefCoN#21#6  (0) 2021.11.29
[Network Forensic] DefCoN#21#5  (0) 2021.11.18
[Network Forensic] DefCoN#21#4  (0) 2021.11.18
[Network Forensic] DefCoN#21#3  (0) 2021.11.18
[Network Forensic] DefCoN#21#1  (0) 2021.11.17

문제
round1.pcap

 

round1.pcap 파일을 보던 중 

IRC 프로토콜로 통신하고 있는 것을 확인할 수 있었다.

따라서 여기서 채팅 데이터를 볼 수 있을 것 같다.

IRC (Internet Relay Chat)

: 텍스트 기반의 메시지 전송 프로토콜
: 클라이언트-서버 형태의 메시지 교환 네트워크 구성
: IRC 프로토콜은 TCP를 사용하며 대개 6667번 포트를 사용

 

17번 패킷의 TCP Stream 따라옴

TCP Stream을 따라오니 역시 채팅 데이터가 남아있었다

서로 인사를 주고 받고, "what day do you want to meet up?"이라는 문자열에 대한 대답은

인코딩 되어 볼 수 없었다.

 

따라서 이 이후의 문자열을 디코딩하여 문제를 풀면 되겠다.

 

인코딩 된 것을 보면 &#문자열형태를 띄고 있다.

이는 HTML 엔티티로, HTML 인코딩 된 것임을 알 수 있다.

HTML 엔터티

: HTML에서 특정 캐릭터들이 예약되어있기 때문에 표기의 혼란을 막기 위해서 사용하는 것
: 흔히 공백을 &nbsp; 로 쓰거나 <,>를 &lt; &gt; 처럼 쓰는 것
: 앰퍼샌드 '&'로 시작하고 세미콜론 ';'으로 끝나는 문자열

 

따라서 HTML 디코딩 페이지를 통해 데이터를 디코딩 해주었다.

회의가 예정된 요일은 수요일(Wednesday)이다.

 

'Study > Forensic' 카테고리의 다른 글

[Network Forensic] DefCoN#21#6  (0) 2021.11.29
[Network Forensic] DefCoN#21#5  (0) 2021.11.18
[Network Forensic] DefCoN#21#4  (0) 2021.11.18
[Network Forensic] DefCoN#21#3  (0) 2021.11.18
[Network Forensic] DefCoN#21#2  (0) 2021.11.17

 

SimpkeBackdoor 실행파일

분석 시작!

 

 

1. 기초 정적 분석 

Virustotal 사이트에 올린 결과

악성코드인지 정상적 코드인지 판단이 잘 안서나보다.

각각의 비율이 거의 비슷하다

 

PEView

PEView에서 확인한 결과, 컴파일 시간은 2017년 6월 17일 09:04:08 이다.

 

 

IAT (Import Address Table)

: Import하는 프로그램이 어떤 API가 필요한지에 대한 정보를 담고 있음

: 여기에 등록을 해놔야 프로그램에서 API 사용이 가능함

 

Kernel32.dll 

: 대부분의 프로그램에서 사용되는 dll. 파일/하드웨어/메모리 접근 및 조작이 가능하기 때문에 주의해야 한다.

 

CreateMutex, ReleaseMutex 등

: Mutex? 중복 실행 방지를 위해 사용

이름이 있거나 없는 Mutex 오브젝트 하나를 만듬(동기화/원자성을 위해)

 

CreateThread, CloseHandle, GetCurrentThreadId, Sleep, WaitForSingleObject 등

: 윈도우는 스레드 기반으로 동작함. 프로세스는 작업 공간이며 스레드가 작업을 수행한다. 

메인 스레드는 동작을 하며 부가적 다른 스레드를 만들 수 있고(CreateThread)

현재 스레드 Id 를 확인도 한다.(GetGurrentThreadId)

동기화를 위해 Sleep, WaitForSingleObject 등 이벤트 기반의 함수를 사용하여 스레드의 동작을 확인한다.

스레드 뿐만 아니라 다른 오브젝트(예:Mutex)를 닫을 때도 CloseHandle을 사용하여 반납한다.

 

GetStartupInfo, CreateProcess, TerminateProcess, GetCurrentProcess, GetProcessId, GetExitCodeProcess

: StartupInfo라는 구조체를 생성하고(GetStartupInfo) 이는 CreateProcess 시 필요함

TerminateProcess는 프로세스 종료 함수이며, GetCurrentProcess로 현재 프로세스의 Handle을 얻을 수 있다.

GetExitCodeProcess는 프로세스 종료 시 반환값을 리턴한다.

 

CreatePipe, PeekNamedPipe, ReadFile, WriteFile 등

: Pipe? 프로세스끼리의 통신을 위한 것

파이프를 생성하여(CreatePipe) 파이프로부터 데이터를 읽고(PeekNamedPipe)

ReadFile, WriteFIle을 통해 오브젝트(파일, 파이프 등)에 데이터를 쓰고 읽는다. 

 

GetTickCount, QueryPerformanceCounter 등

: 시간 관련 함수

 

 

USER32.dll

또 중요한 dll 중 하나, USER32.dll을 살펴보자

USER32.dll = user의 인터페이스(버튼, 스크롤바, 사용자 행위 제어 등)를 제어하는 라이브러리. GUI 기반

 

ShowWindow

: Window 창의 상태를 지정 --> BackDoor는 이를 통해 자신의 창을 감출 것임을 예상

 

 

Exeinfo

SubSystem : Win Console(CMD창)을 통해 동작하고 있다는 것을 알 수 있다.

하지만 ShowWindow를 통해 안보이게 감춰서 실행하겠지

 

패킹은 되어있지 않으며, Visual C++ 9.0 버전으로 컴파일 된 실행 파일이라는 것을 알 수 있다.

 


2. 기초 동적 분석

connect_backdoor.py

소켓 프로그래밍을 하는 파이썬 코드

 

 

SysAnalyzer에 SimpltBackdoor.exe 실행파일 올리고 분석 시작

30초 동안 Dump(기록)한다고 설정해놨으니,, 30초 안에 해당 기능을 실행해보겠다

Start 누른 후 Python 실행

 

dir
netstat -ano

30초가 지나면 Dump가 떠지면서  Backdoor의 실행이 끝난다.

 

Running Process 탭

파이썬을 실행했기 때문에 pythonw.exe 프로세스가 동작했음을 알 수 있고

cmd.exe가 실행된 것도 알 수 있다.

SimpleBackdoor.exe의 PID와 cmd.exe의 PPID가 겹치는 것으로 보아 SimpleBackdoor가 cmd를 실행한 것임을 알 수 있다.

 

 

Api Log

정적 분석에서 봤던 API 함수들이 보인다.

 

socket 관련 함수들도 보인다.

bind : 1337번 포트로 연결하고 listen 한다.

accept : 클라이언트와 통신을 시작하는 지점

CreateRemoteThread : 스레드를 만들어 클라이언트와 통신한 것임

 

 

Pipe

SimpleBackdoor.exe는 Pipe 2개(Read, Write를 위한 것이라고 추측)와 Socket을 하나 만들었음을 확인할 수 있다.

 

VisualSite Designer
실행을 종료할 때마다 이 창이 뜬다.

 

이 문제에서 우리가 해결해야 할 것은 

1. trial 제한을 없애고

2. 프로그램 종료 시 광고를 제거하는 것 

 

 

Ctrl+F8로 실행하면 프로그램의 시작 전에 멈추게 된다.

따라서 이 함수가 실행되기 전 trial 횟수가 검증되는 부분이 있을 것이라 생각했고

 

윗 부분(004898F1) JLE 명령어를 JMP로 바꿔준 후 실행 파일을 따로 저장한다.

 

실행

수정 파일을 실행시키면 라이선스 검증창이 뜨지 않고

프로그램을 바로 열 수 있으며

Quit 버튼을 통해 종료시키면 광고창도 뜨지 않고 프로그램을 무제한으로 이용할 수 있다.

 

 

'Study > Reversing' 카테고리의 다른 글

Malware 프로그램 분석 2  (0) 2021.11.17
Malware 프로그램 분석 1  (0) 2021.11.16
Lena 4번 풀이/Rena's Reversing Tutorial 04  (0) 2021.11.10
악성코드 주요 행위 분석  (0) 2021.11.10
고급 정적 분석 by IDA  (0) 2021.11.10

설치 화면
설치 후 실행. User와 Location 정보를 입력하라고 한다.
하나를 새로 생성한 후 실행해본다.
일단 실행하면 UNREGISTERED VERSION이라고 뜨며
group 생성 수도 제한이 걸려있고
한 그룹당 생성 인원 수도 제한되어 있다.

Register을 해야만 할 수 있다는 것들이 너무 많아서 Register한 것처럼 프로그램을 조작해보겠다

 

OllyDBG 실행

F9를 눌러 계속 실행하다보면 프로그램이 중간중간 정지하게 된다.

이럴때는 Shift + F9를 통해서 빠져나오면 되는데, 그럼에도 불구하고 이상한 루틴에 빠지게 되어 프로그램 종료지점으로 가게 된다.

이런 방법을 '안티 디버깅' 기법이라고 하고, 디버깅 탐지를 막기위해 프로그램 제작자가 심어놓은 기술이라고 보면 된다.

디버깅 옵션에서 예외 사항 무시하는 것에 모두 체크

체크하게 되면 중간중간 멈추는 현상이 나타나지 않는다.

 

Memory Dump - Ctrl+B - UNICODE나 ASCII에 찾고자 하는 문자열 검색

프로그램 중간중간 UNREGISTERED라고 표기되어 있는 부분을 싹 바꿔주겠다

 

일단 제목부분의 주소 확인
Hex Dump창을 가서 확인
버전 정보를 담은 제목을 NOP으로 채워준뒤 따로 저장

 

제목 변경


또 다른 unregistered 내용
바꾸기
문자열 바꾸기 성공. 일단 문자열 바꾸는 것은 여기까지 해보겠다


 

OllyDBG에서 실행한 프로그램의 경고창이 뜬 상태에서 

이 상태에서 잠시 프로그램을 정지하고(F12 또는 일시정지버튼)

call stack (K)을 살펴보면 호출된 함수들의 목록을 확인할 수 있다.

경고창의 내용이 나오는 것을 확인할 수 있다.
이 상태에서 Alt+F9 실행

메모리 상 다양한 dll 파일이 있지만 우리는 사용자가 사용하는 프로그램에서만 사용되는 DLL 을 살펴봐야 한다.

Alt+F9 이후에 프로그램에 뜨는 OK버튼 클릭 --> User Code까지 실행이 됨

 

MessageBox가 뜬 후의 위치로 왔다.

이 MessageBox를 호출한 함수의 루틴을 확인해보기 위해 

Call stack에서 함수 확인

004562ED를 호출한 함수는 00308B1D이다

 

해당 함수를 호출하는 곳을 가서 확인해본다

ⓐ CMP EAX,3 

이 명령어에서 그룹 제한 수 3을 큰 숫자로 늘리거나 

 

ⓑ JL 00408B34

JL 명령어를 통과해야하는데 이를 통과하지 못하고 해당 경고창이 뜬 것임을 알게 되었다.

따라서 이 부분의 명령어를 JMP로 바꾸어 무조건 점프하게 해본다.

 

그룹 생성 수에 제한 없이 계속해서 add 되는 것을 확인할 수 있다!!


인원 수 제한을 푸는 방법도 위와 같다.

똑같이 여기까지 실행한 후 

OllyDBG에서 일시정지, Alt+F9, 확인버튼

 

그러면 그 함수를 부르기 전의 위치로 오게된다.

F8눌러서 RETN으로 넘어가고

 F8 누르면 바로 위에 CALL함수가 있는 다음줄로 넘어간다.

 

MessageBox를 호출한 함수는 00412DEA이다.

  CALL함수가 메시지 박스!!

 

CALL 함수 위쪽을 보면 아까와 비슷한 비교문, JL 문이 있다.

CMP EAX,4에서 숫자를 높이거나

JL을 JMP로 바꿔주면?

 

성공

'Study > Reversing' 카테고리의 다른 글

Malware 프로그램 분석 1  (0) 2021.11.16
Lena 5번 풀이/Rena's Reversing Tutorial 05  (0) 2021.11.10
악성코드 주요 행위 분석  (0) 2021.11.10
고급 정적 분석 by IDA  (0) 2021.11.10
Lena 3번 풀이/Rena's Reversing Tutorial 03  (0) 2021.11.03

OpenCV

: 실시간 이미지/영상 처리에 사용하는 오픈 소스 라이브러리 

: Python, C++, Java 와 같은 다양한 개발 환경을 지원

: Windows, Linux, Mac OS, iOS Android같은 다양한 OS를 지원하는 크로스 플랫폼

 

 

Cascade Classifier : 다단계 분류

- Haar Cascade Object Detection 모듈

     : 머신러닝 기반 Object Detection 알고리즘. OpenCV의 대표적인 API

     : 다수의 객체 이미지와 객체가 아닌 이미지를 cascade 함수로 트레이닝 시켜 객체 검출

     : 미리 정해진 방식으로 인식(xml 파일에 학습데이터 저장되어 있음)

       ↔ Machine Learning : data training 방식

     : 빠른 Object Detection 가능, 간단, 가벼움

     : 정확도가 낮아 예외 사항에 약함

 

import cv2
import numpy as np
from tkinter import *
from PIL import Image
from PIL import ImageTk
from tkinter import filedialog

#xml에 있는 얼굴인식 파일정보를 기반으로 detection
face_cascade_name = './opencv/data/haarcascades/haarcascade_frontalface_alt.xml'
eyes_cascade_name = './opencv/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml'

file_name = 'soccer.jpg'
title_name = 'Haar cascade object detection'
frame_width = 500 #사이즈가 크면 인식하는게 더 많기도 함(Haar cascade의 경우)

def selectFile():
    file_name=filedialog.askopenfilename(initialdir="./", title="Select file",filetypes = (("jpeg files","*.jpg"),("all files","*.*")))
    print('File name: ', file_name)

    read_image = cv2.imread(file_name)
    (height, width) = read_image.shape[:2]
    frameSize = int(sizeSpin.get())
    ratio = frameSize / width
    dimension = (frameSize, int(height * ratio))
    read_image = cv2.resize(read_image, dimension, interpolation = cv2.INTER_AREA)
    image = cv2.cvtColor(read_image, cv2.COLOR_BGR2RGB)
    image = Image.fromarray(image)
    imgtk = ImageTk.PhotoImage(image=image)
    detectAndDisplay(read_image)

def detectAndDisplay(frame):
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#Gray scale로 바꿔줌
    frame_gray = cv2.equalizeHist(frame_gray) #히스토그램 이용 -> 디지털 이미지
    #-- Detect faces
    faces = face_cascade.detectMultiScale(frame_gray) #MultiScale 특정 영역.. 얼굴정보

    for(x,y,w,h) in faces:
        center = (x+w//2, y+h//2) #사각형(얼굴) 중간
        frame = cv2.rectangle(frame, (x,y), (x+w, y+h), (0,255,0), 4) #녹색 사각형(두께4)그리기
        faceROI = frame_gray[y:y+h, x:x+w] #관심영역 = 금방 선택한 얼굴
        #-- In each face, detect eyes
        eyes = eyes_cascade.detectMultiScale(faceROI)
        for (x2,y2,w2,h2) in eyes:
            eye_center = (x + x2 + w2//2, y + y2 + h2//2)
            radius = int(round((w2 + h2)*0.25)) #반지금 구하기 : 정사각형모양에 0.25곱해서(4분의 1)실수, 반올림
            frame = cv2.circle(frame, eye_center, radius, (255,0,0),4)

    #cv2.imshow("Capture - Face detection", frame)
    #버튼을 눌러 새로운 화면 보여줌
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    image= Image.fromarray(image)
    imgtk = ImageTk.PhotoImage(image = image)
    detection.config(image=imgtk)
    detection.image = imgtk


#main
main = Tk()
main.title(title_name)
main.geometry()

read_img = cv2.imread(file_name)
(height, width) = read_img.shape[:2]
ratio = frame_width / width
dimension = (frame_width, int(height * ratio))
read_img = cv2.resize(read_img, dimension, interpolation = cv2.INTER_AREA)

image = cv2.cvtColor(read_img, cv2.COLOR_BGR2RGB) #이걸 안하면 색이 좀 빛바랜 것처럼 나옴
image = Image.fromarray(image)
imgtk = ImageTk.PhotoImage(image = image) #Tk Pillow 위에 그리기 위한 과정

#cv2.imshow("Original Image", image)

face_cascade = cv2.CascadeClassifier()
eyes_cascade = cv2.CascadeClassifier()

#-- 1. Load the cascades
if not face_cascade.load(cv2.samples.findFile(face_cascade_name)):
    print("--(!) Error Loading face cascade")
    exit(0)
if not eyes_cascade.load(cv2.samples.findFile(eyes_cascade_name)):
    print("--(!) Error Loading eyes cascade")
    exit(0)
    

label = Label(main, text=title_name) #타이틀
label.config(font=("Courier", 18))
label.grid(row=0, column=0, columnspan=4)

sizeLabel = Label(main, text='Frame Width : ')
sizeLabel.grid(row=1, column=0)

sizeVal = IntVar(value = frame_width)
sizeSpin = Spinbox(main, textvariable = sizeVal, from_=0, to=2000, increment=100, justify=RIGHT) #부모 윈도우 안에,,,
sizeSpin.grid(row=1, column=1)

Button(main, text="File Select", height=2, command=lambda:selectFile()).grid(row=1,column=2, columnspan=2)
detection = Label(main, image=imgtk)
detection.grid(row=2, column=0, columnspan=4)
detectAndDisplay(read_img)

사진 크기에 따라 인식률이 달라지는 것을 확인할 수 있다

'Study > Deep Learning' 카테고리의 다른 글

Gradient Clipping  (0) 2021.10.20
TensorFlow 2.0을 이용한 Char-RNN 구현  (0) 2021.10.20
Embedding  (0) 2021.10.20
순환신경망(RNN)  (0) 2021.10.19
Pre-Trained CNN 모델을 이용한 Image Classification  (0) 2021.10.18

윈도우 API

- 대부분의 악성코드는 윈도우 플랫폼에서 동작

- 운영체제와 밀접하게 상호작용

 

https://these-dayss.tistory.com/100?category=991231 

 

윈도우즈 프로그래밍

윈도우즈(Windows) :: 미국의 마이크로소프트(Microsoft)사에서 만들었으며 83년 11월에 개발 시작, 85년 11월에 첫 버전 발표 :: 이미 시장을 장악하고 있었던 MS-DOS에 비해 멀티 태스킹이 가능 :: 훨씬 더

these-dayss.tistory.com

 

핸들(Handle)

- 윈도우, 프로세스, 모듈, 메뉴, 파일 등과 같이 운영체제에서 오픈되거나 생성

- 객체나 메모리 위치를 참조한다는 점에서 포인터와 같음

 

 

파일 시스템 함수

- 악성코드가 시스템과 상호작용하는 가장 일반적인 방식은 파일을 생성하거나 수정해 파일명을 구별하거나 기존 파일명을 변경하는 방식

- 식별자(Signature)로 사용 가능하다

- 파일을 생성해 그 파일에 웹 브라우징 내용을 저장한다면? 해당 스파이웨어 형태일 가능성이 높다

 

함수 설명
CreateFile 파일을 생성하고, 열 때 사용
기존 파일, 파이프, 스트림, I/O 장치를 열고 새로운 파일을 생성
+) dwCreateionDisposition 인자 : 이 함수가 새로운 파일을 생성하는지, 기존 파일을 오픈하는지 여부 제어
ReadFile
WriteFile
파일을 읽고 쓰는 데 사용
두 함수  모두 파일을 스트림 형태로 운영
ReadFile : 파일에서 몇 바이트를 읽고 나면, 그 다음 몇 바이트를 읽는 형식을 가짐
CreateFileMapping
MapViewOfFile
파일 매핑은 파일을 메모리로 로드해 쉽게 조작할 수 있게 함
CreateFileMapping : 파일을 디스크에서 메모리로 로드
MapViewOfFile : 매핑된 베이스 주소 포인터를 반환. 메모리 내 파일에 접근. 파일 포맷 파싱시 용이

파일 매핑은 윈도우 Loader 기능을 복제할 때 주로 사용

(파일 맵을 획득한 후 악성코드는 PE 헤더를 파싱해 메모리 내의 파일에 필요한 부분을 변경 -> 마치 OS 로더에 의해 로드된 것처럼 PE 파일을 실행)

 

 

공유 파일

- \\ServerName\share 나 \\.\ServerName\share로 시작하는 이름을 가짐

- 네트워크 상에 저장된 공유 폴더에서 디렉터리나 파일에 접근

 

 

윈도우 레지스트리

- 운영체제 설정이나 옵션 같은 프로그램 구성 정보를 저장

- 네트워킹, 드라이버, 시작, 사용자 계정, 다른 정보 등 거의 모든 윈도우 구성 정보 저장

- 레지스트리를 활용하는 악성코드? 영구 데이터나 설정 데이터 저장 / 컴퓨터 부팅 시 마다 자동으로 동작할 수 있게 수정

 

레지스트리 루트키 종류 설명
HKEY_LOCAL_MACHINE(HKLM) 시스템 전역 설정 저장
HKEY_CURRENT_USER(HKCU) 현재 사용자에 특화된 설정 저장
HKEY_CLASSES_ROOT 정의한 유형 정보를 저장
HKEY_CURRENT_CONFIG 현재 하드웨어 구성 설정, 특히 현재 설정과 표준 설정의 차이를 저장
HKEY_USERS 기본 사용자, 새로운 사용자, 현재 사용자의 설정을 정의

+) 내 컴퓨터\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run : 부팅 시 자동실행되는 값들을 담고 있음. 이곳에 레지스트리가 추가되거나 수정된다면 악성코드 행위를 한다고 의심해볼 수 있음!

 

 

+ <악성코드에서 레지스트리를 수정할 목적으로 사용하는 윈도우 API>

API 설명
RegOpenKeyEx 편집과 질의용으로 레지스트리를 오픈
RegSetValueEx 레지스트리에 새로운 값을 추가하고 데이터를 설정
RegGetValue 레지스트리 내의 값 엔트리용 데이터를 반환

 

 

서비스

- 악성코드가 새로운 코드를 실행하는 또 다른 방식은 서비스로 설치하는 방법!!

- 백그라운드 애플리케이션으로 실행하는 서비스를 사용, 프로세스나 스레드 없이 실행 (코드가 스케줄링돼 사용자 입력 없이 윈도우 서비스 관리자가 실행)

 

- 서비스 이용의 이점

    - SYSTEM 권한으로 실행(administrator나 사용자 계정보다 상위 권한)

    - 운영체제 시작 시 자동으로 실행

    - 작업관리자(Task Manager)에 프로세스가 보이지 않을 수 있음

 

- 서비스 API

    - OpenSCManager : 서비스 제어 관리자(Service control manager)에 핸들 반환

    - CreateService : 신규 서비스로 등록, 부팅 시 서비스의 자동/수동 시작 여부를 호출자가 지정

    - StartService : 서비스를 시작하고 서비스가 수동으로 시작하게 설정되어 있을 때만 사용

 

--> 이 API 사용 여부가 판단되면 악성코드 행위를 의심해볼 수 있음!

 

 

+) Autoruns 프로그램 = 운영체제가 시작 시 자동으로 실행하는 코드를 목록화. IE, 다른 프로그램으로 로드되는 DLL, 커널로 로드되는 드라이버 목록화. 전체 리스트가 아닐 수 있으니 너무 의존하지 않을 것

 

 

 

버클리 호환 소켓

- 이 소켓의 네트워크 기능은 Winsock 라이브러리에서 주로 ws2_32.dll에 구현

API 설명
socket 소켓 생성
bind 호출 전에 소켓을 특정 포트로 할당
listen 소켓이 인바운드 연결을 위해 리스닝하고 있음을 나타냄
accept 외부 소켓 연결을 오픈하고 연결을 받아들임
connect 연결을 외부 소켓으로 오픈하고 외부 소켓은 연결을 기다림
recv 외부 소켓에서 데이터를 수신
send 외부 소켓으로 데이터를 발송

--> 악성코드가 해당 API 함수를 사용하고 있다면 socket 을 이용한 네트워크 작업을 하고 있음을 예측할 수 있다!!

 

 

WinINet API

- Winsock API 보다 상위 수준의 API

- Wininet.dll에 저장

- HTTP, FTP와 같은 프로토콜을 구현

API 설명
InternetOpen 인터넷 연결 초기화
InternetOpenUrl URL에 연결할 때 사용(HTTP 페이지나 FTP 리소스에 사용할 수 있음)
InternetReadFile ReadFile 함수같이 프로그램이 인터넷에서 다운로드 한 파일에서 데이터를 읽음

 

 

DLL(Dynamic Link Libraries, 동적 링크 라이브러리)

- 현재 윈도우에서 다양한 애플리케이션끼리 코드를 공유하는 라이브러리를 사용하는 방식

- 다른 애플리케이션에 의해 실행할 수 있는 Export 함수를 포함

- 정적 라이브러리는 DLL 이전에 사용하던 표준 라이브러리로 프로세스를 별도로 메모리에 로드했었음

 

++ 악성코드 제작자가 DLL을 어떻게 이용할까?++

ⓐ 악성코드 저장용 

    exe 파일 프로세스당 하나만 가지기 때문에 dll을 사용하여 다른 프로세스에서 실행 가능

 

ⓑ 윈도우 DLL 사용

    거의 모든 악성코드는 윈도우와 상호작용할 수 있는 윈도우 OS DLL을 사용하여 악성코드 분석가에게 힌트 제공

 

ⓒ 외부 DLL 사용

    다른 프로그램과의 상호동작을 위해 외부 DLL 사용

 

ⓓ 윈도우 API 활용해 직접 다운로드하지 않고 파이어폭스의 DLL을 이용

 

 

 

프로세스

- 새로운 프로세스를 생성하거나 기존 프로세스를 변형해 현재 프로그램 외부에서 코드를 실행

- CreateProcess () 

 

스레드 : 윈도우 운영체제가 실행. 프로세스 내의 코드 일부를 실행

          : 운영체제가 스레드를 교체하기 전, CPU의 정보를 스레드 문맥에 저장 -> 스레드가 CPU 내부 레지스터 값 변경

 

 

MalwareAnalysis <Lab05.dll>

 

 

1. DllMain의 주소는 무엇인가?

- 0x1000D02E

 

DllMain : DLL의 메인 함수 DLL이 로드될 때 불림(4가지가 정의되어 있음 : dll 로드/언로드, thread 로드/언로드)

Names 탭을 누르면 Names Window 창이 뜨며, dllmain을 입력하면 해당 함수의 주소가 나온다.

 

2. Imports 윈도우를 이용해 gethostbyname을 탐색해보자. 임포트 위치는 어디인가?

- 0x100163CC

Imports 탭에서 gethostbyname을 입력하면 얻고자 했던 위치 정보가 나온다

 

3. gethostbyname을 호출하는 CALL 명령어는 몇 개인가?

- 9개

gethostbyname 함수 더블클릭 후 XREF 부분을 오른쪽마우스 -> jump to cross reference 후 확인 가능

XREF = 상호참조. 어디서 호출하는지 알려줌

 

 

4. 0x10001757에 위치한 gethostbyname 호출을 보면 어떤 DNS 요청이 이뤄지는지 알 수 있는가?

- pics.praticalmalwareanalysis.com

 

gethostbyname : 서버 이름 또는 도메인(예. www.naver.com)으로부터 주소정보(IP Address)를 얻는다.

주소 정보는 local computer의 /etc/hosts 파일 또는 DNS 서버로 부터 얻는다.

G(주소) -> 10001757 입력

eax에 이름 정보가 있는 것을 확인할 수 있다.

그렇다면 eax는 어디에서 왔을까? 일단 10019040 주소에 있는 데이터를 가져와서(off_10019040)

0D 를 더하고 있다.

 

10019040에 위치한 값

1001 9194 + 0D = 1001 91A1

 

G -> 100191A1 입력

 

 

5. 0x10001656에 있는 서브루틴에서 IDA Pro는 지역 변수 몇 개를 인지하고 있는가? 20개 

6. 0x10001656에 있는 서브루틴에서 IDA Pro는 파라미터 몇 개를 인지하고 있는가? 1개

 

 

7. Strings 윈도우를 이용해 디스어셈블리 내의 문자열 \cmd.exe /c를 찾아보자. 어디에 있는가?

- 0x100101D0

Search -> text -> \cmd.exe /c 입력

 

 

8. \cmd.exe /c를 참조하는 코드 영역에서 무슨 일이 발생하는가?

- 공격자의 실행 명령어를 실행하기 위한 세팅 작업이 일어난다.

 

ex) \cmd.exe /c notepad : 메모장 프로그램이 끝날 때까지 다른 것을 실행하지 않음(다른 명령어를 받지 않음)

프로그램 버전에 따라 명령어 문자열을 달리함
대부분의 백도어의 형테가 이렇다고 한다. (문자열에 따른 계단식의 루틴)

 

9. 같은 영역 0x100101C8에서 dword_1008E5C4는 경로를 지정하는 전역 변수로 보인다. 악성코드는 어떻게 dword_1008E5C4를 설정하는가? (힌트 : dword_1008E5C4의 상호 참조를 이용하라)

- GetVersion이라는 함수를 통해서 커널버전을 저장한다.

 

100101C8
1008E5C4

10001767+22 지점에서 write 되고 있다.

10003695의 결과(eax)가 해당 부분에 쓰여지기 때문에 10003695 함수를 확인하러 가보자
GetVersionA 함수를 통해 eax에 값을 넣고 있다.

 

10. 0x1000FF58에서 서브루틴으로 수백 라인은 문자열을 비교하기 위한 일련의 memcmp 비교다. robotwork와 문자열 비교가 성공적으로 이뤄지면 무슨 일이 일어나는가? (memcmp가 0을 반환)

- robotwork는 작업 시간을 출력하는 것으로 보인다. 문자열도 만들고 네트워크를 통해 전송한다.

 

robotwork 문자열로 찾은 뒤 맞았을 때의 루틴을 따라가보자
call 부분의 함수 rename
바꾸고
그래프로 함수 동작 한눈에 파악

 

 

11. PSLIST 익스포트는 무슨 역할을 하는가?

- 프로세스 리스트를 분석

Exports - PSLIST - xref graph로 확인

 

 

12. 그래프 모드를 이용해 sub_10004E79 상호 참조 그래프를 그려보자. 이 함수에 진입하기 위해 호출하는 API 함수는 무엇인가?

- StartAddress → CreateThread()를 통해 백도어 함수를 진행한다.

 

해당 API 함수에만 기반을 두고 이 함수를 어떤 이름으로 변경하겠는가?

- my_checkLang

 

 

13. DllMain이 직접 호출하는 윈도우 API 함수는 몇 개인가?

- 너무 많다!

 

두 번째 깊이(depth of 2)에서 몇 개인가?

- 2~30개 일 것으로 추정

from, 깊이 설정

 

깊이가 2인 애들만 보면 됨

14. 0x10001358에서 Sleep 호출이 존재한다.(sleep까지 수밀리초 값을 파라미터로 갖는 API 함수) 코드 후반부를 보면 이 코드가 수행되려면 프로그램이 얼마동안 Sleep 하는가?

- 30초 

 

Sleep 함수

10019020으로부터 데이터(0x100192AC)를 가져와

0D를 더하고

여기에 있는 아스키 값("30")을

int형(30)으로 바꾸고(atoi)

3E8을 곱한ㄷㅏ.

 

따라서

30 * 1000 ms = 30 s

실행 시
또 메시지가 뜬다. Nags를 제거하기 위해 patch하라고 한다
또 또 또

 

OllyDBG를 실행한 결과

코드도 몇 줄 안되지만,, 실행하다보면 CMP EAX,0 가 뜬금없이 나온다.

EAX에는 실행 파일의 시그니처 값 MZ가 들어있다. 이는 DOS HEADER의 시작이며

이값은 절대 0일 수가 없다. (JE에서 점프가 불가능)

 

 

따라서 Entry Point를 401000에서 401024로 바꿔줘야 한다.

Memory Map에서 시작주소 400000번지의 PE Header 클릭
EntryPoint를 찾은 후 해당 값이 있는 주소(004000E8) 확인
덤프창에서 해당 주소로 가서 값 확인
00 10 00 00 을 24 10 00 00 으로 변경

원래 프로그램 시작점은 401000 이었지만, (Image Base 값 400000 + Entry Point 값 1000)

우리가 가고자 하는 401024로 가기 위해 4000E8의 값을 00에서 24로 변경해준다.

 

 

덤프창에서 먼저 Copy to executable file로 저장한 후, 실행하면 

요 아이가 또 뜬다

 

따라서 새롭게 저장한 파일을 OllyDBG에 다시 올려준 후 수정작업을 한다.

두번째로 뜨는 MessageBox를 삭제하기 위해서 NOP로 채워준다.

Copy to executable file - selection - save file
성공

'Study > Reversing' 카테고리의 다른 글

악성코드 주요 행위 분석  (0) 2021.11.10
고급 정적 분석 by IDA  (0) 2021.11.10
악성코드 분석  (0) 2021.11.03
Lena 2번 풀이/Rena's Reversing Tutorial 02  (0) 2021.10.27
윈도우 실행 파일과 패커  (0) 2021.10.06

+ Recent posts