본문 바로가기
Study/악성코드

[윈도우즈 보안과 악성코드 기초] 기초 정적 분석

by 8희 2024. 4. 6.

기초 정적 분석

목표

  • 악성코드의 기능을 파악하기 위해 코드나 프로그램의 구조를 분석하는 과정
  • 악성코드를실행하지 않고 분석하는 과정인 정적분석의 기본을 수행할 수 있다.

주요 사용 기법 (기초 정적 분석 방법)

  • 악성 여부를 판단하는 안티바이러스 도구
  • 악성코드를 판별하는 해시 정보 검증
  • 파일의 문자열, 함수, 헤더에서 주요 정보 수집

 

안티바이러스 스캐닝

  • 악성코드 탐지(기본)
    • 패턴 매칭 분석: file signatures를 검색하여 찾는 방법
      • 주로 많이 사용하는 방법
    • heuristic : 변조, 신종 등
      • 악성코드를 변조시키거나, 신종을 나오게 하는 방법
  • 악성코드 실행 및 탐지 (안티바이러스 도구)

 

VirusTotal 실습

VirusTotal 사이트에 접속해서 간단한 프로그램(노트 패드나 강의 자료 악성코드) 프로그램을 검증해보자!

https://www.virustotal.com/gui/home/upload

 

VirusTotal

 

www.virustotal.com

 

  • VirusTotal 사이트에 Lab01-01.exe를 업로드 하고 확인
  • 72개 중 52개가 악성코드로 탐지됨
    • 즉 이 파일은 그냥 악성코드라는 것을 알 수 있음
  • 악성코드 이름들을 확인
    • 안랩에서는 Trojan/Win32.Agent.C957604라고 판단
    • 대체적으로는 Trojan이 많고 그 외에는 Backdoor 등도 있음
    • 바이러스 회사가 명명한 악성코드 이름은 중요한 정보가 될 수 있음
  • 바이러스 포털 이용 시 장점: 백신을 여러 개를 돌릴 수 있다!
    • 기본적으로 여기서 악성 유무를 판단하고 그 후에 분석 작업 진행

 

해시

  • 해시: 악성/정상 코드의 고유 값
    • 주로 악성코드를 보고 악성인지를 판단
    • 해시 값을 검증하면 코드가 변조 유무를 알 수 있음
    • type
      • SHA-1(Secure Hash Algorithm 1), MD5(Message-Digest Algorithm 5)
    • tool
  • 해시 검증
    • 해시를 이름으로 사용
    • 악성코드 식별을 위해 해시 공유
    • 식별 여부를 온라인에서 검색

 

WinMD5 실습

WinMD5Free SW를 다운받아 설치하고 검증해보자!

https://www.winmd5.com/

 

WinMD5 Free - Windows MD5 Utility Freeware for Windows 7/8/10/11

WinMD5Free WinMD5Free is a tiny and fast utility to compute MD5 hash value for files. It works with Microsoft Windows 98, 2000, XP, Vista, and Windows 7/8/10/11. As an Internet standard (RFC 1321), MD5 has been used in a wide variety of security applicatio

www.winmd5.com

  • 다운로드 후 프로그램 실행 시 이런 화면이 뜸

  • 사이트에 올라와 있는 파일의 해시 값을 아래 부분에 넣고 Verify 버튼 클릭
    • →  해당 파일을 WinMD5 프로그램에 넣은 해시 값과 동일함을 알 수 있음
  • 태생부터 악성 파일은 판단 불가능, 정상 파일이 변조된 경우에만 판단 가능
  • 해시 정보로는 악성 유무만 판단 가능!

 

문자열 검색

  • 문자열 검색: 코드 내의 문자열 검색 및 추출
    • 악성 행위 시 대부분 값, 변수, 파일 명 등의 고유의 값들이 포함됨
      • 이런 문자열들은 그대로 저장되는 경우가 많음
      • 그래서 실행 파일을 역으로 실행해서 문자열을 추출하면 알아보기가 쉬움
      • 실질적인 정보들을 통해 악성코드인지 파악할 수 있음
  • 문자 표현(문자열을 저장하는 방식)
    • ASCII(8bit, 1byte)
    • Unicode(16bit, 2byte)

 

Strings 실습

Strings를 다운받아 설치하고 악성코드가 어떤 결과로 나타나는지 실습해보자!

  • Strings는 cmd 창에서만 실행 가능
  • exe 파일은 확장자 안 붙여도 실행 가능
  • 명령어: strings 파일명.확장자

  • 같은 폴더로 이동 후 검색
    • 바이너리 검색일 땐 확장자 붙여줘야 됨
    • 대소문자는 구분 X
  • Strings는 바이너리 이미지에서 ASCII나 Unicode로 되어 있는 문자열을 추출하는 거임
    • 지금 화면에 출력된 게 PEview에서 DOS STUB 영역에 있는 거랑 같은 거임!
    • 앞 부분은 일부분을 제외하고는 이해할 수 없는 문자들로 구성

  • 계속 내려보면 Lab01-01.exe에서 사용하는 API 함수와 dll을 확인할 수 있음
    • 이게 바로 Strings를 통해서 알고 싶은 것임! 의미가 있는 것들!

  • 자세히 보면 kernel132.dll 바로 위에 kernel132.dll이라고 되어 있음
    • l이라고 되어 있어야 하는 부분이 1로 되어 있는 거임

  • 마지막에 warning_this_will_destroy_your_machine을 통해 악성코드임을 표현하기도 함

 

패킹/난독화

  • 패킹/난독화: 악성코드 은폐 목적, 문자열 검색이 안 됨
    • LoadLibrary, GetProcAddress 함수 포함
      • 두 함수들은 정삭적인 프로그램에서는 사용 X
    • 파일의 시그니처 등으로 사용자들이 악성코드임을 알 수 있기 있음
      • 이를 방지하기 위해 공격자들이 수행하는 것이 바로 패킹/난독화
  • 패킹 파일
    • 패킹 파일 = 판독할 수 없는 파일
    • 패킹을 하게 되면 압축 파일처럼 사이즈가 작아짐
    • 실제 실행이 되려면 다시 원본으로 돌아가야 함
      • 이를 위해 패킹 파일을 다시 복구할 수 있는 래퍼 프로그램이 있음
    • 원본 실행파일 → 래퍼 프로그램 + 패킹된 실행 파일

 

UPX, PEiD 실습

1. PEiD를 다운받아 설치하고 패킹 전후의 프로그램의 검증 과정에서 변화가 있는지 확인

https://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml

  • EP Section: Entry Point를 알려주는 것
    • .text로 나오는 게 정상

 

  • EP Section이 비어 있거나 Linker Info가 0.0이면 의심해봐야 함
    • 이건 지금 패커여서 그럼

 

2. UPX를 다운 받아 정상 프로그램을 패킹해서 PEiD로 확인

 

https://github.com/upx/upx/releases/tag/v4.2.3

 

Release UPX 4.2.3 · upx/upx

Please see the file NEWS for a detailed list of changes. Note: all versions are functionally equivalent, i.e. each version can handle all executable formats, so you only need the file that runs on ...

github.com

 

  • Lab01-01.exe 원본 파일일 때, PEiD 실행 결과

  • upx로 패킹
    • 명령어: upx 파일명.exe
  • 패킹을 하면 exe가 똑같이 실행됨

 

  • 패킹 후 PEiD 실행 결과
  • EP Section이 UPX1로 변경된 것을 확인할 수 있꼬, 컴파일 버전도 찾을 수 없다고 나옴

 

PE 파일 포맷

  • 윈도우 실행 파일 포맷: DLL, PE(Portable Executable)
  • PE file header
    • PE file header에서 대부분의 정보를 수집할 수 있음
    • 코드에 관한 정보
    • 애플리케이션 유형
    • 필요한 라이브러리 함수
    • 메모리 공간요구 사항
    • 주로 보는 내용은 링크 라이브러리와 함수

 

링크 라이브러리와 함수

  • 임포트 함수 목록 확보: 다른 프로그램에 저장된 라이브러리
  • 링크하는 시점: 정적/런타임/동적링크
    • static link: 실행 시 라이브러리 코드를 모두 복사, PE 파일 헤더에 파일 링크 코드 정보 없음
    • runtime link: 악성코드 패킹이나 난독화에 자주 사용, 함수가 필요할 때마다 동적 링크
      • LoadLibrary/GetProcAddress, LdrGetProcAddress/LdrLoadDll
    • dynamic link: 프로그램이 링크된 라이브러리 함수를 호출하면 라이브러리 내의 함수를 실행
    • PE파일 헤더에 로드 되는 모든 함수에 대한 정보를 저장함
      • 그래서 헤더 부분을 잘 보면 악성코드를 더욱 쉽게 유추할 수 있음
      • ex) URLDownloadToFile : 인터넷에 연결해 다운로드 후 저장
  • Dependency Walker: 동적 링크 함수 탐색 프로그램

 

Dependency Walker로 파일을 열었을 때, 주로 많이 나오는 DLL

DLL 설명
Kernel32 메모리, 파일, 하드웨어 접근 및 조작
Adwapi32 서비스 관리자, 레지스트리 같은 윈도우 핵심 컴포넌트 접근
User32 버튼, 스크롤바, 사용자 행위 에저와 반응 등 사용자 ui
Gdi32 그래픽 보기와 조작 관련
Ntdll 윈도우 커널 인터페이스, kernel32.dll로 import, 사용하는 경우는 기능 숨기거나 프로세스 조작 등 특정 작업
WSock32/Ws2_32 네트워크 연결 및 관련 작업 수행
Wininet FTP, HTTP, NTP등 프로토콜을 구현한 상위 수준 네트워크 함수