우분투 환경

 

[그림 1] 환경

필요한 AVD 환경

 

안드로이드 4.4 x86 OS

Nexus 5(4.95 1080x1920 xxhdpi)

 

 

과정

 

1. 안드로이드 스튜디오 파일 다운로드

https://developer.android.com/studio

 

Download Android Studio and SDK tools  |  Android Developers

Download the official Android IDE and developer tools to build apps for Android phones, tablets, wearables, TVs, and more.

developer.android.com

 

[그림 2] 안드로이드 스튜디오(.tar.gz) 설치

 

 

 

2. sudo apt-get install libz1 libncurses5 libbz2-1.0:amd64 libstdc++6 libbz2-1.0

[그림 3] sudo apt-get install lib1 libncurses5 libbz2-1.0:amd64 libstdc++6 libbz2-1.0

libbz2-1.0:????

 

 

3. sudo tar -zxvf android-studio-2021.1.1.22-linux.tar.gz -C /usr/local

[그림 4] sudo tar -zxvf android-studio-2021.1.1.22-linux.tar.gz -C /usr/local (이하 생략)

 

 

 

4. grep -Eoc '(vmx|svm)' /proc/cpuinfo의 출력 결과가 아래 사진과 같이 0이 아닌 값이 나와야 합니다.

나중에 발생할 수 있는 "Your CPU does not support required features (VT-x or SVM)" 오류 때문

[그림 6]

출력 결과가 0이 아니라면 가상머신 세팅을 변경해줍니다.

Edit virtual machine settings -> Processors -> Virtual Intel VT-x/EPT or AMD-V/RVI 체크

 

 

 

5. sh /usr/local/android-studio/bin/studio.sh

 [그림 7] sh studio.sh

 

 

6. Android studio setup

[그림 8] step 1

 

[그림 9] step 2

 

[그림 10] step 3

 

[그림 11] step 4

 

[그림 12] step 5

 

[그림 13] step 6

 

[그림 14] step 7

 

[그림 15] step 8

 

[그림 16] step 9

 

[그림 17] step 10

 

[그림 18] step 11

 

[그림 19] step 12

 

[그림 20] step 13

 

[그림 20] step 13

 

[그림 21] step 14 (Iamge 선택 후 엔터)

 

[그림 22] step 15 (해당 이미지 파일 설치 후 Next)

 

[그림 23] step 16 (Finish)

 

[그림 24] step 17

 

[그림 25] step 18

 

 

 

 

 

 

참고

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=lghlove0509&logNo=220949464753 

 

[리눅스] 우분투에 안드로이드 스튜디오 설치하기

리눅스, 우분투, 우분투 안드로이드 스튜디오, 우분투 이클립스, 리눅스 안드로이드 스튜디오, 안드로이드 ...

blog.naver.com

 

 

 

https://koharinn.tistory.com/479

 

How to Enable Ubuntu Virtualization( VT-x/EPT or AMD-V/RVI) in VMware

사용하는 프로세서의 가상화(virtualization) 지원 여부 확인 grep -Eoc '(vmx|svm)' /proc/cpuinfo 0 이외의 숫자가 출력되는 경우, 현재 가상화 기능이 활성화되어있다는 의미이다. 0 값이 출력되는 경우, virtu

koharinn.tistory.com

 

 

파이썬에서 같은 수의 요소를 가진 리스트와 넘파이 배열의 크기가 어떻게 다른지 궁금하여 알아보았다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
import numpy as np
 
array_1 = [x for x in range(64)]
array_2 = [[x for x in range(8)] for y in range(8)]
array_3 = [[[x for x in range(4)] for y in range(4)] for z in range(4)]
 
np_array_1 = np.array(array_1)
np_array_2 = np.array(array_2)
np_array_3 = np.array(array_3)
 
print("[sys.getsizeof] array_1: ",sys.getsizeof(array_1))
print("[sys.getsizeof] array_2: ",sys.getsizeof(array_2))
print("[sys.getsizeof] array_3: ",sys.getsizeof(array_3),"\n")
 
print("[sys.getsizeof] np_array_1: ",sys.getsizeof(np_array_1))
print("[sys.getsizeof] np_array_2: ",sys.getsizeof(np_array_2))
print("[sys.getsizeof] np_array_3: ",sys.getsizeof(np_array_3),"\n")
 
print("[ndarray.nbytes] np_array_1: ", np_array_1.nbytes)
print("[ndarray.nbytes] np_array_2: ", np_array_2.nbytes)
print("[ndarray.nbytes] np_array_3: ", np_array_3.nbytes)
cs

 

 

[출력 결과]

 

sys.getsizeof: Return the size of an object in bytes.

객체의 메모리 사이즈를 바이트 단위로 출력

 

numpy.ndarray.nbytes: Total bytes consumed by the elements of the array.

배열의 요소들에 의해 사용된 전체 바이트 수

 


[sys.getsizeof] array_1~3

[sys.getsizeof] np_array_1~3


[ndarray.nbytes] np_array_1~3

 

 

 

nbytes는 저장된 데이터만을 반환하고 sys.getsizeof는 전체 객체 크기를 반환합니다.

 

참고

https://stackoverflow.com/questions/35421869/nbytes-and-getsizeof-return-different-values

 

nbytes and getsizeof return different values

I have noticed that nbytes and getsizeof returns two different values when the bank to a NumPy array. Example: import sys import numpy as np x = np.random.rand(10000, 50) print('x.nbytes: {0} byt...

stackoverflow.com

 

 

https://docs.python.org/3/library/sys.html

 

sys — System-specific parameters and functions — Python 3.10.2 documentation

sys — System-specific parameters and functions This module provides access to some variables used or maintained by the interpreter and to functions that interact strongly with the interpreter. It is always available. sys.abiflags On POSIX systems where P

docs.python.org

https://numpy.org/doc/stable/reference/generated/numpy.ndarray.nbytes.html

 

numpy.ndarray.nbytes — NumPy v1.22 Manual

 

numpy.org

 

 

'기타' 카테고리의 다른 글

GrayScale변환 후 출력이 다르게 나오는 이유  (0) 2021.08.11

안드로이드 애플리케이션의 메타데이터를 보는 구조 분석은 소프트웨어가 실제로 하는 일에 대해 매우 제한된 시각으로 바라보는 것이다.

 

정적 분석은 이론적으로는 완전한 코드 커버리지를 통해 악의적인 행위를 발견할 수있지만 때로는 크고 복잡한 애플리케이션을 처리할 때 비현실적으로 높은 리소스 비용이 발생한다. 또한 정적 분석은 매우 비효율적일 수 있다.

 

서로 다른 범주의 바이너리(예: 악성코드, 정상/악성)를 구별하는 가장 강력한 속성은 바이너리에서 일부분에 존재하기 때문입니다.

단일 코드 블록을 찾기위해 바이너리 코드 블록 100개를 분석하는 것은 상당한 낭비입니다.

 

프로그램을 실행하면 풍부한 데이터를 생성할 수 있는 효율적인 방법이 될 수 있습니다.

 

애플리케이션에서 모든 코드 경로가 실행되지는 않더라도 다른 범주에 속하는 악성 코드 바이너리는 무언가 다른 부작용 행위를 할 수 있습니다. 바로 이러한 점을 관찰해 분류를 위한 속성을 추출할 수 있습니다.

 

실행 파일의 부수 효과를 정확하게 파악하려면 샌드박스에서 악성코드를 실행하는 것이 좋습니다.

 

악성코드 분석 시 찾아야 할 가장 명백한 실행 부수 효과는 네트워크 동작 행위입니다.

많은 악성 애플리케이션은 C&C 서버로부터 명령을 받거나 도난 당한 데이터를 추출하거나 원치 않는 콘텐츠를 제공하기 위해 외부 통신을 필요로 합니다.

애플리케이션 실행 중에 네트워크 동작을 관찰해 이러한 불법적인 통신을 엿볼 수 있으며, 애플리케이션의 탐지 시그니처를 생성할 수 있습니다.

 

 

 

[그림 1] mitmproxy 설치

 

[그림 2] adb 설치
[그림 3] mitmproxy 실행

 

[그림 4] 에뮬레이터 실행
[그림 5]
[그림 6]

 

[그림 7]
[그림 8]
[그림 9]
[그림 10]

 

 

 

 

 

 

 

 

[그림 11]

 

p.appbrain.com 및 alog.umeng.com에 대한 요청은 무해한 광고 트래픽

Umeng 및 AppBrain은 모바일 앱 광고 네트워크)처럼 보이지만 POST 요청 http://35.205.61.67:7070은 상당히 의심스럽습니다.

 

[그림 12]

해당 패킷의 호스트 이름과 요청 본문을 확인해보면 jxyxintel.slhjl.com:7070은 C&C 서버처럼 보입니다.

악성코드 샘플의 최신 및 현재 상태에 따라 C&C 서버가 계속 활성화 될 수도 있고 활성화되지 않을 수도 있습니다.

 

아웃바운드 요청에는 응답이 없으므로 서버가 더이상 활성상태가 아닙니다. 이런 경우 악성코드 분류 속성에 포함될 수는 없습니다. 게다가 네트워크 프로파일링 외에도 안드로이드 애플리케이션의 몇 가지 다른 행동 부작용이 분류 속성을  사용하는 데 더 유용합니다.

 

 

실습환경

[그림 1 실습환경]

정적 분석

[그림 2]를 통해 앞선 정적 분석에서 apktool을 사용해 infected.apk 파일을 디코드 할 때 "Baksmaling classes.dex..."가 출력된 것을 확인할 수 있습니다

 

[그림 2] Baksmaling classes.dex...

 

dex 파일은 안드로이드 애플리케이션의 컴파일된 바이트 코드로 *Dalvik 가상 머신에서 실행됩니다.

 

*Dalvik

달빅 가상 머신은 레지스터 형태의 가상머신으로 현재 안드로이드 휴대 전화 플랫폼에 들어갑니다.

 

대부분의 APK에서 컴파일된 바이트코드는 classes.dex 파일에 통합됩니다.

 

Baksmali는 .dex 형식(smali는 해당 어셈블러의 이름)의 역어셈블러입니다.

 

이 역어셈블러는 통합 dex 파일을 사람이 읽을 수 있도록 *smali 소스코드로 변환합니다.

apktool 디코드를 통해 사람이 읽을 수 있는 smali 소스코드로 변환합니다.

 

*smali

"smali/baksmali is An assembler/disassembler for the dex format used by dalvik"

dex 바이너리를 사람이 읽을 수 있도록 표현한 언어

Dalvik 바이트 코드를 위한 어셈블리 언어

 

[그림 3] cat MainActivity.smali (일부 캡처)

 

 

[그림 4]

※ Mainactivity.smali 안에[그림 4]에 해당하는 내용을 찾을 수가 없다...

 

 

smali 명령어를 n-그램을 이용하여 학습 알고리즘의 속성을 추출할 수 있습니다.

 

[그림 4]의 각 코드를 분석해보겠습니다.

 

const-string v0, "http://178.57.217.238:3000"

C&C 서버에 대한 하드코드된 IP 주소를 정의합니다.

 

iget-object v1, po, Lcom/fanta/services/SocketService;->b:La/a/b/c;

SocketService를 레지스터 v1에 할당해 인스턴스 필드에서 객체 참조를 읽습니다.

 

invoke-static {v0, v1}, La/a/b/b;->

    a(Ljava/lang/String;La/a/b/c;)La/a/b/ac;

파라미터로 IP 주소와 객체 참조가 있는 정적 메소드를 호출합니다.

 

move-result-object v0

그 뒤 정적 메소드의 결과가 레지스터 v0으로 이동됩니다.

 

iput-object v0, p0, Lcom/fanta/services/SocketService;->a:La/a/b/ac;

마지막으로 SocketService 인스턴스 필드에 기록됩니다.

 

이것은 Dalvik opcode를 smali 형식으로 표현된 것을 *n-그램을 적용해 속성으로 만들 수 있는 아웃바운드 전송입니다.

 

예를 들어 smali 형식 정보를 5-그램으로 표현하면 다음과 같습니다.

{const-string, iget-object, invoke-static, move-result-object, iput-object}

 

*n-그램(k-그램)

n개로 이루어진 집합

 

 

속성으로 syscall이나 opcode n-그램을 사용하는 것은 악성코드 분류에 있어서 유용합니다.

 

baksmali 역어셈블러는 dex 파일에 해당하는 모든 smali 코드를 생성할 수 있지만 때로는 필요 이상일 때도 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

참고

"머신 러닝을 활용한 컴퓨터 보안, 클라렌스 치오, 데이비드 프리먼, 에이콘"

"Machine Learning and Security by Clarence Chio and David Freeman(O'Reilly). Copyright 2018 Clarence Chio and Davide Freeman, 978-1491-97990-7"

 

Dalvik

https://ko.wikipedia.org/wiki/%EB%8B%AC%EB%B9%85_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4) 

 

달빅 (소프트웨어) - 위키백과, 우리 모두의 백과사전

달빅 (소프트웨어) 위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

 

Smali

https://github.com/JesusFreke/smali

 

GitHub - JesusFreke/smali: smali/baksmali

smali/baksmali. Contribute to JesusFreke/smali development by creating an account on GitHub.

github.com

 

실습 환경

[그림 1] 실습 환경

구조 분석

안드로이드 애플리케이션은 APK(Android Package Kit)파일 패키지로 제공됩니다.

APK 파일은 안드로이드 운영체제에서 사용하기 위한 파일 포맷입니다.

또한 애플리케이션 실행에 필요한 모든 리소스와 메타데이터를 포함하는 ZIP 아카이브 입니다.

 

[그림 2] unzip infected.apk(일부 캡처)

 

[그림 3] 압축 해제 후

 

[그림 2]과 같이 unzip을 사용하여 apk를 압축 해제할 수 있습니다.

AndroidManifest.xml *매니페스트 파일은 해당 애플리케이션의 개요를 제공할 수 있습니다.

이러한 매니페스트 파일은 모든 안드로이드 앱에 필요합니다.

 

*매니페스트 파일(manifest file)

컴퓨팅에서 집합의 일부 또는 논리정연한 단위인 파일들의 그룹을 위한 메타데이터를 포함하는 파일입니다.

컴퓨터 프로그램의 파일들은 이름, 버전 번호, 라이선스, 프로그램의 구성 파일들을 가질 수 있습니다.(위키백과)

ex) 구성파일: 필수 사용 권한, 외부 라이브러리 종속성, 구셩 요소 등

 

 

애플리케이션은 특수 권한이 필요한 함수가 호출되기 바로 전에 *런타임에 사용 권한을 요청할 수도 있습니다.

*런타임: 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상머신의 상태(위키백과)

 

예를 들어 사진 촬영 기능이 사용되기 직전에 대화상자가 열리면서 사용자에게 애플리케이션 카메라 액세스 권한을 부여하라는 메시지가 표시됩니다.

또한 매니페스트 파일은 다음을 선언합니다.

 

활동: 사용자가 상호작용하는 화면

서비스: 백그라운드에서 실행되는 클래스

수신기: SMS 또는 네트워크 연결 변경과 같은 시스템 수준 이벤트와 상호작용하는 클래스

 

 

압축을 해제한 파일들은 대부분 바이너리 형식으로 인코딩 되기 때문에 서드파티 도구가 필요합니다.

Apktool은 APK 파일에 있는 리소스 거의 원래 형태로 디코딩하고 일부 수정 후 다시 빌드할 수 있는 안드로이드 패키지 리버스 엔지니어링 도구입니다. 

[그림 4] apktool decode infected.apk

 

[그림 5] cd infected

 

[그림 6] decode 전(일부 캡처)

 

[그림 7] decode 후(일부 캡처)

Apktool decode의 결과로 apk 파일의 이름인 infected 디렉토리가 생성되고 사람이 읽을 수 있는 형태로 바뀝니다.

 

매니페스트에는 해당 애플리케이션을 실행하기 위해 필요한 권한 목록을 가지고 있습니다.

 

패키지 이름이 "cn.dump.pencil"이라는 프로그램은 [그림 7]과 같은 권한 목록을 가지고 있습니다.

 

해당 애플리케이션이 카메라 사진에 연필 사진 스케치 이미지 스타일을 적용하는 프로그램이라고 가정했을 때 인터넷(anroid.permission.INTERNET)에 대한 전체 액세스와 시스템 알림 창(android.permission.SYSTEM_ALERT_WINDOW)을 표시하는 기능을 요청하는 것은 상당히 의심스러운 일입니다.

 

실제로 *공식 문서에는 "이 권한을 사용하는 앱은 거의 없다. 이 창은 사용자와의 시스템 레벨 상호작용을 위한 창이다." 라고 명시되어 있습니다.

("Very few apps should use this permission; these windows are intended for system-level interaction with the user.")

 

또한 WRITE_SECURE_SETTINGS, ACCESS_MTK_MMHW, READ_LOGS와 같은 권한이 요청되는 것도 굉장히 위험합니다.

 

모든 안드로이드 애플리케이션은 기기에서 실행되기 위해 인증서로 서명이 되어 있어야 합니다.

APK의 META-INF 폴더에는 앱 서명에 사용된 인증서를 포함해 코드의 무결성과 소유권을 확인하는 데 필요한 리소스가 포함되어 있습니다.

 

Apktool은 패키지의 루트 폴더 아래의 META-INF 폴더에 존재합니다.

openssl 유틸리티를 사용하기 위해 해당 폴더의 *.RSA 파일인 DER로 인코드된 인증서에 대한 정보를 확인할 수 있습니다.

 

[그림 8] *.RSA 파일 확인

 

[그림 9] openssl pkcs7 -in SUIYUN2_.RSA -inform DER - print(일부 캡처 1)

 

위 명령어를 이용하여 인증서에 대한 자세한 정보를 확인할 수 있습니다.

 

[그림 10] openssl pkcs7 -in SUIYUN2_.RSA -inform DER - print(일부 캡처 2)

 

인증서의 발행자 및 소유자가 "sui yun" 인 것을 확인할 수 있고 유효 기간에서 인증서 서명 시점을 알 수 있습니다.

 

하지만 애플리케이션에 대한 자세한 정보를 수집하기 위해선 내부 구조를 살펴보고 내용을 분석해야할 필요가 있습니다.

 

 

 

 

 

 

 

참고

"머신 러닝을 활용한 컴퓨터 보안, 클라렌스 치오, 데이비드 프리먼, 에이콘"

"Machine Learning and Security by Clarence Chio and David Freeman(O'Reilly). Copyright 2018 Clarence Chio and Davide Freeman, 978-1491-97990-7"

 

 

매니페스트 파일

https://ko.wikipedia.org/wiki/%EB%A7%A4%EB%8B%88%ED%8E%98%EC%8A%A4%ED%8A%B8_%ED%8C%8C%EC%9D%BC

 

매니페스트 파일 - 위키백과, 우리 모두의 백과사전

매니페스트 파일(manifest file)은 컴퓨팅에서 집합의 일부 또는 논리정연한 단위인 파일들의 그룹을 위한 메타데이터를 포함하는 파일이다. 예를 들어, 컴퓨터 프로그램의 파일들은 이름, 버전 번

ko.wikipedia.org

 

*공식 문서

https://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW

 

Manifest.permission  |  Android Developers

android.widget

developer.android.com

 

*Apktool

https://ibotpeaches.github.io/Apktool/

 

Apktool - A tool for reverse engineering 3rd party, closed, binary Android apps.

A tool for reverse engineering 3rd party, closed, binary Android apps. It can decode resources to nearly original form and rebuild them after making some modifications. It also makes working with an app easier because of the project like file structure and

ibotpeaches.github.io

 

인증서의 구조

https://ko.wikipedia.org/wiki/X.509

 

X.509 - 위키백과, 우리 모두의 백과사전

X.509는 암호학에서 공개키 인증서와 인증알고리즘의 표준 가운데에서 공개 키 기반(PKI)의 ITU-T 표준이다. 역사와 활용[편집] X.509는 1988년 7월 3일 X.500 표준안의 일환으로 시작되었다. 1993년 인증

ko.wikipedia.org

 

 

속성 생성

속성 추출 및 속성 공학은 원시 데이터를 해석해 배포의 성격을 가장 잘 나타내는 데이터 자료를 생성하는 프로세스이며 실행 가능한 바이너리보다 분석하기가 더 복잡하지도 않고 보안 전문가에게 더 적합한 데이터 형식도 없습니다.

 

머신 러닝에서 데이터 수집 및 속성 공학은 매우 중요합니다.

 

데이터 과학자 및 머신러닝 엔지니어가 데이터 수집 방법 및 프로세스에 거의 영향을 미치지 못하는 위치에 있는 경우가 있습니다.

 

이런 상황은 매우 좋지 않은데 머신 러닝 및 데이터 과학에서 가장 큰 돌파구 및 개선 사항은 원시 데이터의 품질 향상에서 비롯된 것이므로 고급 알고리즘을 사용하거나 더 나은 시스템을 설계하는 데에서 오는 것이 아니기 때문입니다.

 

작업이 무엇이든 간에 정리되지 않은 원시 데이터로부터 좋은 결과를 얻기 위해 필요한 정보를 추출하는 것이 중요합니다.

 

머신 러닝 알고리즘이 잘 수행되지 않는다면 알고리즘의 단점보다는 데이터 품질이 좋은지 좋지 않은지 여부를 향상 고려해야 합니다.

 

머신 러닝 시스템을 구축하는 프로세스의 속도를 높이기 위해 데이터 수집을 위한 유연하고 효율적인 아키텍처를 설계하는 것이 중요합니다.

 

데이터를 수집할 가치가 있는지 없는지 결정하거나 데이터를 어떻게 수집할 것인가에 대한 가장 좋은 방법에 대한 선행 연구를 하기 위해 상당한 투자를 할 수 있어야 합니다.

 

머신러닝을 위해 데이터를 수집할 때 고려해야 할 중요한 사항을 살펴보겠습니다.

 

 

데이터 수집

도메인 지식의 중요성

도메인 지식은 데이터의 중요한 부분을 학습하는 알고리즘을 돕기 위해 수집할 중요한 속성을 매우 신속하게 식별하는 데 도움이 됩니다.

 

확장 가능한 데이터 수집 프로세스

작은 데이터 샘플에서 수동으로 속성을 추출하는 것이 간단할 수 있지만, 백만 개 이상의 샘플이 있을 경우 상황이 상당히 복잡해집니다.

 

작업을 확장해야 하기 전에 데이터 수집 프로세스의 자동화에 대하 고려해야만 합니다.

 

도메인 지식과 데이터 탐색 기능을 함께 사용하면 작업에 필요한 가장 중요한 속성만 자동으로 수집하는 데 집중할 수 있는 방법을 고안할 수 있습니다.

 

 

검증과 편향

동물 이미지 분류 시스템이 전반적인 정확도는 높지만 새 카테고리에 대해 일관되게 나쁜 결과를 얻는 경우 원시 데이터의 선택된 속성이 다른 동물을 더 잘 식별할 수 있게 편향됐거나 휴식 중인 새의 이미지 혹은 비행 중인 새의 이미지로만수집된 데이터를 구성했기 때문입니다.

 

악성코드 데이터셋은 악성코드 샘플들이 시간 경과에 따라 굉장히 빨리 변할 수 있기 때문에 데이터의 부패 문제에 직면합니다.

 

예를 들어 1월에 수집된 악성코드의 샘플은 3월에 수집된 샘플을 대표하지 않을 수 있습니다.

 

이는 민첩한 악성코드 개발자가 시그니처 기반 탐지를 피하기 위함 때문입니다.

 

보안 데이터셋은 악성 샘플과 정상 샘플을 동등하게 수집하기 어려울 수 있기 때문에 클래스 불균형 문제에 자주 직면합니다.

 

반복 실험

프로세스 중 특정 시점에서 나쁜 결과가 나오면 과학적으로 상황에 접근해 제어된 실험의 실패한 인스턴스를 분석해야 합니다.

 

과학자가 실험 변수를 변경하고 실험을 다시 시작하는 것처럼 실패의 가장 큰 원인에 대해 숙련된 추측을 하고 다시 시도해야 합니다.

 

 

 

 

 

 

 

 

참고

"머신 러닝을 활용한 컴퓨터 보안, 클라렌스 치오, 데이비드 프리먼, 에이콘"

"Machine Learning and Security by Clarence Chio and David Freeman(O'Reilly). Copyright 2018 Clarence Chio and Davide Freeman, 978-1491-97990-7"

일반적인 악성코드 공격의 흐름

일반적인 악성코드의 흐름은 다음과 같이 3단계로 구분할 수 있습니다.

 

[정찰 -> 침투] -> [활동 -> 유지/관리] -> [목적 달성 -> 흔적 제거]    

 

 

 

각 단계별로 수행되는 활동을 살펴보겠습니다.

 

1단계: 정찰 -> 침투

간접적인 방법으로 표적 범위를 지정하기 위해 초기 정찰 활동이 수동적인 방법으로 수행됩니다.

취약점을 악용하여 악성코드 침투

 

2단계: 활동 -> 유지/관리

이미 희생자의 환경에 악성코드 존재

백도어 설치 및 영구적인 백그라운드 데몬 프로세스 설치 등으로 환경 내 자신을 유지

 

3단계: 목적 달성 -> 흔적 제거

환경에서 악성코드 스스로 흔적을 제거하고 추적을 남기지 않습니다.

작업이 완료되면 악성코드가 제거돼 피해 대상 시스템에서 모든 작업 흔적을 제거합니다.

 

 

 

악성코드 특정 유형

존재 숨기기

패커 및 암호화 기술을 사용하여 코드 압축 후 난독화

목적: 탐지를 피하고 연구자 분석의 진행을 방해

 

자신의 기능 실행

효과적으로 기능을 수행하려면 악성코드가 시스템 변경이나 시스템 관리자에 의해 감지되지 않도록 보장해야 한다.

DLL 로드 및 안티바이러스 프로세스를 종료하는 것 같은 방어 회피 기술이 일반적으로 사용된다.

특정 유형의 악성코드는 네트워크를 통해 이동하기도 한다. 대부분 유형의 악성코드는 특정 형식의 권한 상승(버퍼 오버플로우 또는 최종 사용자의 사회 공학과 같은 소프트웨어/OS 취약점 악용)을 시도해 플랫폼에 관리자 권한으로 접근하려고 한다.

 

데이터 수집과 전화로 연결

악성코드는 필요한 모든 데이터(서버/애플리케이션 자격증명, 웹 액세스 로그, 데이터베이스 항목 등)를 수집한 후 데이터를 외부 랠리 지점으로 보낸다.

또한 원격 명령제어(C&C)서버에 '전화로 연결'하고 추가 지침을 받을 수도 있다.

 

 

 

 

참고

"머신 러닝을 활용한 컴퓨터 보안, 클라렌스 치오, 데이비드 프리먼, 에이콘"

 

 

 

 

간단한 실습을 통해 파이썬 스크립트 실행 프로세스를 분석해보겠습니다.

 

실습 환경

Ubuntu 16.04.1 LTS

python 3.5.2

 

 

실습

[그림 1] add.py

해당 예제를 이용하여 파이썬 빌드 매커니즘을 탐색해보도록 하겠습니다.

 

해당 코드는 바이트코드(중간 형식)으로 컴파일 됩니다.

스크립트가 외부 모듈을 가져오고 대상 디렉터리에 쓸 수 있다면 컴파일된 파이썬 모듈(.pyc)이 생성되지만 위의 경우 외부 모듈을 가져오지 않으므로 .pyc 파일을 만들 수 없습니다.

빌드 프로세스를 검사하기 위해 py_compile 모듈을 사용하여 .pyc 파일을 강제로 생성할 수 있습니다.

[그림 2] .pyc 파일 생성

.pyc 파일에는 바이트코드가 만들어집니다. 이후 파일의 헤더를 제거하고 *언마샬링(비정렬화)하여 types.CodeType 구조로 바이너리 파일의 내용을 검사할 수 있습니다.

 

*직렬화, 마샬링이란?

 

[그림 3] inspect.py

 

[그림 4] inspect.py 결과 1

표시하지 않은 CodeType 객체에 더 많은 정보가 인코딩 되어 있지만 바이트 코드 바이너리의 일반적인 구조를 보여줍니다.

 

해당 바이트 코드는 파이썬 가상 머신 런타임에 의해 실행됩니다. 이 바이트 코드는 이진 머신 코드가 아니라, 가상 머신이 해석한 파이썬 고유의 연산 코드이며, 코드를 기계 명령어로 변환합니다. 이전에 생성한 code 객체를 dis.disassemble()함수를 이용해 역어셈블링하면 [그림 5]와 같이 표시됩니다.

[그림 5] inspect.py 결과 2 (역어셈블링)

 

필요한 빌드 또는 컴파일 단계가 없기 때문에 인터프리터 언어의 코드 실행 프로세스가 짧아집니다.

이를 통해 코드를 작성한 직후에 코드를 실행할 수 있습니다.

 

 

 

사람이 작성한 소스코드에 액세스해 기능별로 정확히 분류할 수 있는 특정 소프트웨어의 특성 및 의도를 쉽게 파싱할 수 있습니다.

그러나 코드에 대한 액세스 권한이 없기 때문에 프로그램에 대한 정보를 추출하기 위해 좀 더 간접적인 방법을 사용해야 합니다.

 

최신 코드 실행 프로세스에 대한 이해를 바탕으로, 이제는 악성 코드의 정ㅈ거 및 런타임 분석에 접근하기 위한 여러 가지 방법을 살펴볼 수 있다. 코드는 작성자에서 실행에 이르기까지 잘 정의된 경로를 거친다. 경로를 따라 어느 지점에서든 가로 채기 하면 프로그램에 대한 많은 정보를 얻을 수 있습니다.

 

 

 

 

참고

"머신 러닝을 활용한 컴퓨터 보안, 클라렌스 치오, 데이비드 프리먼, 에이콘"

"Machine Learning and Security by Clarence Chio and David Freeman(O'Reilly). Copyright 2018 Clarence Chio and Davide Freeman, 978-1491-97990-7"

 

+ Recent posts