머신러닝을 활용한 악성코드 분석 - 악성코드 분석(동적 방법 - 행위 분석 - 1) 

https://criling.tistory.com/77

 

 

 

* 실행 중에 애플리케이션이 만드는 시스템 호출(syscall) 시퀀스는 악성코드 분류에 있어 중요한 속성입니다.

 

syscall을 추적하는 몇 가지 다른 방법이 있지만 가장 많이 쓰이고 직접적인 방법은 가장 최신의 안드로이드 배포판에 포함된 *strace 모듈을 사용하는 것입니다.

 

adb와 에뮬레이터를 사용해 애플리케이션의 syscall을 추출하는 방법을 간단히 살펴 보겠습니다.

 

안드로이드 애플리케이션은 Zygote 데몬 앱 런처 프로세스를 포크해서 시작됩니다.

주 프로세스의 맨 처음부터 애플리케이션의 syscall을 추적하기를 원하기 때문에 Zygote에서 strace를 실행한 다음 수집된 strace 로그에서 앱 프로세스의 프로세스 ID를 찾아냅니다.

목표 앱이 이미 안드로이드 가상 장치에 로드돼 설치됐다고 가정하면 adb 셸을 시작하고 Zygote의 프로세스 ID에서 strace를 시작합니다.

 

[그림 1]
[그림 2]
[그림 3]

 

adb 쉘을 시작한 후 Zygote의 프로세스 ID에서 strace를 시작합니다.

 

[그림 4]

 

[그림 5]
[그림 6]

3790의 부모 프로세스 ID를 가지고 해당 프로세스는 복제하여 이 애플리케이션과 연관시키고자 하는 시스템 호출 동작을 취하는 것을 알 수 있습니다.

 

 

 

 

참고

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

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

 

 

https://source.android.com/devices/tech/debug/strace?hl=ko 

 

strace 사용  |  Android 오픈소스 프로젝트  |  Android Open Source Project

strace 사용 strace는 프로세스에서 생성하는 시스템 호출, 그리고 이러한 시스템 호출이 무엇을 반환하는지 확인할 수 있게 해줍니다. strace 빌드 strace를 빌드하려면 다음을 실행합니다. mmma -j6 exter

source.android.com

 

우분투 환경

 

[그림 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

 

 

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

 

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

 

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

단일 코드 블록을 찾기위해 바이너리 코드 블록 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

 

 

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

일반적인 악성코드의 흐름은 다음과 같이 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"

 

간단한 실습을 통해 컴파일된 빌드 프로세스를 단계별로 진행하는 C코드를 살펴보겠습니다.

 

실습 환경

Linux kali 5.7.0-kali1-686-pae #1 SMP Debian 5.7.6-1kali2 (2020-07-01) i686 GNU/Linux

gcc (Debian 9.3.0-15) 9.3.0

 

 

실습

[그림 1] cat add.c

 

1. 전처리

이 단계는 전처리 단계입니다.

C에서 #문자로 시작하는 줄은 선행 처리기 지시문으로 전처리기에 의해 해석됩니다.

전처리기는 단순히 코드를 반복하고 이러한 지시문을 매크로로 처리합니다.

포함된 라이브러리의 내용을 삽입하고 코드 주석을 제거해 컴파일할 코드를 준비합니다.

 

[그림 2] cc -E add.c(전처리) (일부 캡처)

[그림 2]를 통해 #include <stdio.h>가 표준 C 라이브러리 stido.h의 일부 내용으로 대체된 것을 알 수 있습니다.

 

2. 컴파일

컴파일러는 전처리된 코드를 어셈블리 코드로 변합니다.

이렇게 생성된 어셈블리 코드는 CPU가 이해하고 실행해야 하는 명령을 포함하고 있으므로 대상 프로세서 아키텍처에만 적용된다.

[그림 3] cc -S add.c(컴파일) -&amp;amp;amp;gt; cat add.s

빨간 박스로 표시된 addl과 call을 보아 변수에 1을 더하고 print 함수를 호출하는 것을 알 수 있습니다.

다른 라인들은 다른 기능들이 액세스 할 수 있는 CPU레지스터와 메모리 위치에서 이동 값을 구성합니다.

 

 

3. 어셈블리 코드를 오브젝트 코드(기계어 코드)로 변환

[그림 4] cc -c add.c(기계어로 변환)-&amp;amp;amp;gt; hexdump add.o(일부 캡처)
[그림 5] od -c add.o (일부 캡처)

기계어로 변환된 오브젝트 파일을 hexdump 및 od를 이용하여 확인할 수 있습니다.

[그림 5]의 빨간 박스로 표시된 부분을 통해 ELF 파일인 것을 알 수 있고 ELF 파일은 파일의 유형을 포함해 파일의 일부 특성을 나타내는 헤더로 시작합니다.

 

[그림 6] readelf -h add.o

readelf와 같은 유틸리티를 사용하면 이 헤더에 포함된 모든 정보를 파싱할 수 있습니다.

 

[그림 7] chmod u+x add.o -&amp;amp;amp;gt; ./add.o

해당 오브제트 파일에 실행 권한을 부여 후 실행하면 [그림 7]과 같이 실행이 되지 않는 것을 확인할 수 있습니다. (Exec 형식 오류)

이는 어셈블러에 의해 생성된 오브젝트 코드는 실행에 필요한 중요한 프로그램 일부가 누락되어 있기 때문입니다.

또한 프로그램의 섹션이 제대로 정렬되지 않아 라이브러리 및 프로그램 기능을 성공적으로 호출할 수 없습니다.

이를 해결하는 단계가 빌드 프로세스의 마지막 단계인 링킹입니다.

이 예시에서 링커는 printf 라이브러리 함수의 오브젝트 코드를 이진 파일에 삽입합니다.

 

[그림 8] 최종 실행 바이너리 생성

stdio.h 외부 라이브러리는 정적으로 이진 파일에 링크됐고, 이것은 나머지 패키지와 함께 단일 패키지로 컴파일됐다는 의미입니다. 일부 언어 및 구현에서는 외부 라이브러리를 동적으로 포함할 수 있습니다.

즉, 코드에서 참조되는 라이브러리 구성 요소가 컴파일된 이진 파일에 포함되지 않은 것입니다.

실행 시 로더가 호출돼 동적으로 링크된 라이브러리에 대한 참조를 검색한 후 시스템에 라이브러리를 배치해 이러한 참조를 확인합니다.

 

 

참고

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

"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