>  기사  >  백엔드 개발  >  Python이 악성 코드를 식별하는 방법

Python이 악성 코드를 식별하는 방법

WBOY
WBOY앞으로
2023-05-09 13:28:321209검색

01 Microsoft Windows Portable Executable File Format

악성코드에 대한 정적 분석을 수행하려면 .exe, .dll, .sys 등 오늘날의 Windows 프로그램 파일의 구조를 설명하고 정의하는 Windows PE 파일 형식을 이해해야 합니다. 데이터를 저장하는 방식. PE 파일에는 x86 명령, 이미지, 텍스트와 같은 데이터, 프로그램 실행에 필요한 메타데이터가 포함되어 있습니다.

PE 형식은 원래 다음 작업을 수행하도록 설계되었습니다.

1) Windows에 프로그램을 메모리에 로드하는 방법을 알려줍니다.

PE 형식은 파일의 어떤 블록을 메모리에 로드해야 하는지, 어디에 로드해야 하는지를 설명합니다. 또한 Windows가 프로그램 실행을 시작해야 하는 프로그램 코드의 위치와 메모리에 로드해야 하는 동적으로 연결된 코드 라이브러리를 알려줍니다.

2) 실행 중에 사용할 수 있는 미디어(또는 리소스)를 실행 프로그램에 제공합니다.

이러한 리소스에는 GUI 대화 상자나 콘솔 출력을 위한 문자열과 같은 문자열은 물론 이미지나 비디오도 포함될 수 있습니다.

3) 디지털 코드 서명과 같은 보안 데이터 제공

Windows는 이 보안 데이터를 사용하여 코드가 신뢰할 수 있는 소스에서 제공되었는지 확인합니다.

PE 형식은 그림 1-1에 표시된 일련의 구조를 활용하여 위 작업을 수행합니다.

Python이 악성 코드를 식별하는 방법

▲ 그림 1-1 PE 파일 형식

그림 1-1과 같이 PE 파일 형식에는 프로그램을 메모리에 로드하는 방법을 운영 체제에 알려주는 데 사용되는 일련의 헤더가 포함되어 있습니다. 또한 실제 프로그램 데이터가 포함된 일련의 섹션도 포함되어 있습니다. Windows는 메모리의 오프셋이 디스크에 나타나는 위치와 일치하도록 이러한 섹션을 메모리에 로드합니다.

PE 헤더부터 시작하여 이 파일 구조를 더 자세히 살펴보겠습니다. 1980년대 Microsoft DOS 운영 체제에서 유래되었으며 호환성을 위해서만 존재하는 DOS 헤더에 대한 논의는 생략하겠습니다.

1. PE 헤더

그림 1-1 하단과 같이 DOS 헤더 ❶ 위에는 PE 헤더 ❷가 있는데, 이는 바이너리 코드, 이미지, 압축 데이터 등 프로그램의 일반적인 속성을 정의합니다. 및 기타 프로그램 속성. 또한 프로그램이 32비트 또는 64비트 시스템용으로 설계되었는지 여부도 알려줍니다.

PE 헤더는 맬웨어 분석가에게 기본적이지만 유용한 상황 정보를 제공합니다. 예를 들어 헤더에는 맬웨어 작성자가 파일을 컴파일한 시간을 제공하는 타임스탬프 필드가 포함되어 있습니다. 일반적으로 맬웨어 작성자는 이 필드를 가짜 값으로 바꾸지만 때로는 맬웨어 작성자가 이 필드를 바꾸는 것을 잊어버려 이런 일이 발생합니다.

2. 선택적 헤더

선택적 헤더 ❸는 이름이 암시하는 것과 정반대로 오늘날의 PE 실행 파일에서 사실상 어디에나 있습니다. 이는 프로그램이 로드된 후 실행되는 첫 번째 명령어를 나타내는 PE 파일의 프로그램 진입점 위치를 정의합니다.

또한 PE 파일, Windows 하위 시스템, 대상 프로그램(예: Windows GUI 또는 Windows 명령줄) 및 프로그램에 대한 기타 상위 수준 세부 정보를 로드할 때 Windows가 메모리에 로드하는 데이터의 크기를 정의합니다. 프로그램의 진입점은 리버스 엔지니어링에게 리버스 엔지니어링을 시작할 위치를 알려주기 때문에 이 헤더 정보는 리버스 엔지니어링에게 매우 중요합니다.

3. 섹션 헤더

섹션 헤더 ❹는 PE 파일에 포함된 데이터 섹션을 설명합니다. PE 파일의 섹션은 운영 체제가 프로그램을 로드할 때 메모리에 매핑되는 데이터 조각이거나 프로그램을 메모리에 로드하는 방법에 대한 지침을 포함합니다.

즉, 섹션은 메모리에서 연속 바이트 문자열이 되거나 운영 체제에 로드 프로세스의 특정 측면을 알려주는 디스크의 일련의 바이트입니다.

섹션 헤더는 또한 프로그램이 실행될 때 읽기, 쓰기 또는 실행 가능해야 하는지 여부와 같이 섹션에 부여해야 하는 권한을 Windows에 알려줍니다. 예를 들어, x86 코드가 포함된 .text 섹션은 프로그램 코드가 실행 중에 실수로 자체적으로 수정되는 것을 방지하기 위해 읽기 및 실행 가능으로 표시되지만 쓰기 가능으로 표시되는 경우가 많습니다.

그림 1-1은 .text 및 .rsrc와 같은 많은 섹션을 보여줍니다. PE 파일이 실행되면 메모리에 매핑됩니다. .reloc 섹션과 같은 다른 특수 섹션은 메모리에 매핑되지 않으며 이러한 섹션에 대해서도 논의하겠습니다. 그림 1-1에 표시된 섹션을 살펴보겠습니다.

1) .text 섹션

모든 PE 프로그램에는 섹션 헤더에 실행 가능한 것으로 표시된 x86 코드 섹션이 하나 이상 포함되어 있습니다. 이러한 섹션의 이름은 거의 항상 .text❺입니다.

2).idata 섹션

.idata 섹션❻은 가져오기 섹션이라고도 하며 동적 링크 라이브러리와 해당 기능을 나열하는 IAT(가져오기 주소 테이블)를 포함합니다. IAT는 프로그램이 호출하는 라이브러리를 지적하므로 PE 바이너리의 초기 분석 중에 살펴보아야 할 가장 중요한 PE 구조 중 하나입니다. 그러나 이러한 호출은 결국 맬웨어의 고급 기능을 드러낼 수 있습니다.

3) 데이터 섹션

PE 파일 구조의 데이터 섹션에는 마우스 커서 이미지, 버튼 아이콘, 오디오 및 프로그램에서 사용하는 기타 미디어를 저장하는 .rsrc, .data 및 .rdata와 같은 섹션이 포함될 수 있습니다. 예를 들어, 그림 1-1의 .rsrc 섹션에는 프로그램이 텍스트를 문자열로 렌더링하는 데 사용하는 인쇄 가능한 문자열이 포함되어 있습니다.

.rsrc(리소스) 섹션의 정보는 PE 파일의 인쇄 가능한 문자열, 그래픽 이미지 및 기타 자산을 검사하여 파일 기능에 대한 중요한 단서를 얻을 수 있으므로 맬웨어 분석가에게 매우 중요합니다.

섹션 03에서는 icoutils 툴킷(icotool 및 wrestool 포함)을 사용하여 악성 코드 바이너리의 리소스 섹션에서 그래픽 이미지를 추출하는 방법을 알아봅니다. 그런 다음 섹션 04에서는 악성코드 리소스 섹션에서 인쇄 가능한 문자열을 추출하는 방법을 알아봅니다.

4).reloc 섹션

PE 바이너리의 코드는 위치 독립적이지 않습니다. 즉, 예상 메모리 위치에서 새 메모리 위치로 이동하면 올바르게 실행되지 않습니다. .reloc❽은 코드를 손상시키지 않고 이동할 수 있도록 하여 이 문제를 해결합니다.

PE 파일의 코드가 이동된 경우 코드가 계속 올바르게 실행될 수 있도록 Windows 운영 체제에 파일 코드의 메모리 주소를 변환하도록 지시합니다. 이러한 변환에는 일반적으로 메모리 주소에 오프셋을 더하거나 빼는 작업이 포함됩니다.

02 pefile을 사용하여 PE 파일 형식 구문 분석

Ero Carerra가 작성하고 유지 관리하는 Python 모듈 pefile은 PE 파일 구문 분석을 위한 업계 표준 악성 코드 분석 라이브러리가 되었습니다. 이 섹션에서는 pefile을 사용하여 ircbot.exe를 구문 분석하는 방법을 보여 드리겠습니다. 코드 목록 1-1에서는 ircbot.exe가 이미 현재 작업 디렉터리에 있다고 가정합니다.

Python에서 가져올 수 있도록 다음 명령을 입력하여 pefile 라이브러리를 설치합니다.

$ pip install pefile

이제 목록 1-1의 명령을 사용하여 Python을 시작하고 pefile 모듈을 가져온 다음 pefile을 사용하여 파일을 열고 구문 분석합니다. PE 파일 ircbot.exe .

  • 코드 목록 1-1 pefile 모듈을 로드하고 PE 파일(ircbot.exe)을 구문 분석합니다.

$ python >>> import pefile >>> pe = pefile.PE("ircbot.exe")

PE 모듈이 구현하는 핵심 클래스인 pefile.PE를 인스턴스화합니다. PE 파일을 구문 분석하여 해당 속성을 볼 수 있습니다. PE 생성자를 호출하여 지정된 PE 파일(이 경우 ircbot.exe)을 로드하고 구문 분석합니다. 이제 이 파일을 로드하고 구문 분석했으므로 목록 1-2의 코드를 실행하여 ircbot.exe의 pe 필드에서 정보를 추출합니다.

  • 코드 목록 1-2 PE 파일의 섹션을 반복하고 해당 섹션에 대한 정보를 인쇄합니다.

#基于 Ero Carrera的示例代码(pefile库的作者) for section in pe.sections:   print(section.Name, hex(section.VirtualAddress),     hex(section.Misc_VirtualSize), section.SizeOfRawData)
  • 코드 목록 1-3은 인쇄물의 모양을 보여줍니다.

코드 목록 1-3 Python의 pefile 모듈을 사용하여 ircbot.exe에서 섹션 데이터 추출

PE 파일의 5개 섹션(.text, .rdata, .data, .idata 및 .idata)에서 데이터를 추출했습니다. .재배치 출력은 추출된 각 PE 섹션에 대해 하나의 요소인 5개의 튜플 형식으로 제공됩니다. 각 줄의 첫 번째 항목은 PE 섹션을 식별합니다. (C 스타일의 빈 문자열 종결자인 일련의 \x00 널 바이트는 무시할 수 있습니다.) 나머지 필드는 각 섹션이 메모리에 로드되면 메모리 사용률과 메모리 내 위치를 알려줍니다. 로드되면 발견됩니다.

예를 들어 0x1000❶은 이러한 섹션이 로드되는 기본 가상 메모리 주소이며, 섹션의 기본 메모리 주소로도 간주될 수 있습니다. 가상 크기 필드의 0x32830❷는 섹션이 로드된 후 필요한 메모리 크기를 지정합니다. 세 번째 필드의 207360❸은 이 섹션이 이 메모리 블록에서 차지할 데이터의 양을 나타냅니다.

pefile을 사용하여 프로그램 섹션을 구문 분석하는 것 외에도 이를 사용하여 바이너리가 로드할 DLL 파일과 해당 DLL 파일에서 요청할 함수 호출을 나열할 수도 있습니다. PE 파일의 IAT를 미러링(덤핑)하여 이를 달성할 수 있습니다. 코드 목록 1-4는 pefile을 사용하여 ircbot.exe의 IAT를 미러링하는 방법을 보여줍니다.

  • 코드 목록 1-4 ircbot.exe에서 가져오기 정보 추출

$ python pe = pefile.PE("ircbot.exe") for entry in pe.DIRECTORY_ENTRY_IMPORT:     print entry.dll     for function in entry.imports:         print '\t', function.name

코드 목록 1-4는 코드 목록 1-5에 표시된 출력을 생성합니다(간결성을 위해 출력이 잘렸습니다).

  • 코드 목록 1-5 이 악성 코드가 사용하는 라이브러리 기능을 보여주는 ircbot.exe의 IAT 테이블 내용

Python이 악성 코드를 식별하는 방법

코드 목록 1-5에 표시된 대로 이 출력은 다음과 같습니다. 맬웨어에 대한 분석은 맬웨어 선언과 참조할 풍부한 기능 배열을 나열하므로 가치가 있습니다.

예를 들어, 출력의 처음 몇 줄은 악성코드가 WriteFile❶을 사용하여 파일에 쓰고, CreateFileA❷를 사용하여 파일을 열고, CreateProcessA❸를 사용하여 새 프로세스를 생성한다는 것을 알려줍니다. 이는 맬웨어에 대한 기본 정보일 뿐이지만, 맬웨어의 더 자세한 동작을 이해하기 위한 시작입니다.

03 맬웨어 이미지 검사

맬웨어가 대상을 속이기 위해 어떻게 설계되었는지 이해하기 위해 .rsrc 섹션에 포함된 아이콘을 살펴보겠습니다. 예를 들어, 악성 코드 바이너리는 Word 문서, 게임 설치 프로그램, PDF 파일 등과 같이 일반적으로 사용되는 소프트웨어의 아이콘을 위장하여 사용자가 해당 아이콘을 클릭하도록 속이도록 설계되는 경우가 많습니다.

你还可以在恶意软件中找到攻击者自己感兴趣程序中的图像,例如攻击者为远程控制受感染机器而运行的网络攻击工具和程序。

回到我们的样本图像分析,你可以在本文的数据目录中找到名为fakepdfmalware.exe的这个恶意软件样本。这个样本使用Adobe  Acrobat图标诱骗用户认为它是一个Adobe Acrobat文档,而实际上它是一个恶意的PE可执行文件。

在我们使用Linux命令行工具wrestool从二进制文件fakepdfmalware.exe中提取图像之前,我们首先需要创建一个目录来保存我们将提取的图像。代码清单1-6显示了如何完成所有这些操作。

  • 代码清单1-6 从恶意软件样本中提取图像的Shell命令

$ mkdir images $ wrestool -x fakepdfmalware.exe -output=images $ icotool -x -o images images/*.ico

我们首先使用mkdir  images创建一个目录来保存提取的图像。接下来,我们使用wrestool从fakepdfmalware.exe中提取图像资源(-x)到/images目录,然后使用icotool提取(-x)并将Adobe中.ico图标格式中的所有资源转换(-o)为.png图形,以便我们可以使用标准的图像浏览工具查看们。

如果你的系统上没有安装wrestool,你可以从这里下载:

http://www.nongnu.org/icoutils/

一旦你使用wrestool将目标可执行文件中的图像转换为PNG格式,你就可以在你喜欢的图像浏览工具中打开它们,并以各种分辨率查看Adobe  Acrobat图标。

正如我在这里给出的例子所示,从PE文件中提取图像和图标相对简单,可以快速显示与恶意软件二进制文件相关的有趣且又有用的信息。同样地,我们可以轻松地从恶意软件中提取可打印字符串来获取更多信息,我们接下来会做这项工作。

04 检查恶意软件的字符串

字符串是程序二进制文件中可打印字符的序列。恶意软件分析师通常依赖恶意样本中的字符串来快速了解其中可能发生的情况。这些字符串通常包含下载网页和文件的HTTP和FTP命令,用于告诉你恶意软件连接到的地址的IP地址和主机名等类似信息。

有时,即使用于编写字符串的语言也有可能暗示恶意软件二进制文件的来源国,尽管这可能是伪造的。你甚至可以在一个字符串中找到一些文本,它们用网络用语解释了恶意二进制文件的用途。

字符串还可以显示有关二进制文件的更多技术信息。例如,你可能会发现有关用于创建二进制文件的编译器、编写二进制文件所使用的编程语言、嵌入式脚本或HTML等信息。

虽然恶意软件作者可以对所有这些痕迹进行混淆、加密和压缩等处理,但是即便是高水平的恶意软件作者也经常会暴露并留下一些痕迹,因此在分析恶意软件时,对镜像的字符串进行细致检查显得尤为重要。

1. 使用字符串程序

查看文件中所有字符串的标准方法是使用命令行工具strings,按照以下语法进行使用:

$ strings filepath | less

该命令将文件中的所有字符串逐行打印到终端上。在末尾添加 |  less可以防止字符串在终端上跨屏显示。默认情况下,strings命令查找所有最小长度为4字节的可打印字符串,但是你可以设置不同的最小长度并更改“命令手册”中所列各种其他参数。

我建议只使用默认的最小字符串长度4,但是你可以使用-n选项更改最小字符串长度。例如,“string -n 10  filepath”只提取最小长度为10字节的字符串。

2. 分析镜像字符串

现在我们镜像了一个恶意软件程序的可打印字符串,但是挑战在于要理解这些字符串的含义。例如,假设我们将ircbot.exe中的字符串镜像到ircbotstring.txt文件中,这在本文前面的内容中,我们使用pefile库已经进行了探讨,如下所示:

$ strings ircbot.exe > ircbotstring.txt

ircbotstring.txt的内容包含数千行文本,但其中一些行应该突出显示出来。例如,代码清单1-7显示了从字符串镜像中提取出来的一串以单词DOWNLOAD开头的行。

  • 代码清单1-7 显示恶意软件可以将攻击者指定的文件下载到目标计算机的字符串输出

Python이 악성 코드를 식별하는 방법

这些行表示ircbot.exe将尝试把攻击者指定的文件下载到目标计算机上。

我们来尝试分析另一个。代码清单1-8所示的字符串镜像表明ircbot.exe可以起到Web服务器的作用,在目标机器上侦听来自攻击者的连接。

  • 코드 목록 1-8은 악성 코드에 공격자가 연결할 수 있는 HTTP 서버의 문자열 출력이 있음을 보여줍니다.

Python이 악성 코드를 식별하는 방법

코드 목록 1-8은 ircbot.exe에서 다음 작업을 수행하는 데 사용되는 다양한 구성 요소를 보여줍니다. HTTP 서버 HTTP 상용구 프로그램을 구현합니다. 이 HTTP 서버를 사용하면 공격자가 HTTP를 통해 대상 시스템에 연결하여 피해자 데스크톱의 스크린샷을 찍어 공격자에게 다시 전달하는 등의 명령을 실행할 수 있습니다.

코드 목록 전체에서 HTTP 기능의 증거를 볼 수 있습니다. 예를 들어, 인터넷 자원으로부터 데이터를 요청하는 GET 메소드 ❶. HTTP/1.0 200 OK❷이 줄은 HTTP 네트워크 트랜잭션이 잘 실행되고 있음을 나타내는 상태 코드 200을 반환하는 HTTP 문자열이며, Server:myBot❸는 HTTP 서버의 이름이 다음에 연결된 내장 HTTP 서버인 myBot임을 나타냅니다. ircbot.exe.

이 모든 정보는 특정 악성코드 샘플이나 악성 활동을 이해하고 차단하는 데 도움이 됩니다. 예를 들어, 악성 코드 샘플에 연결 시 특정 문자열을 출력하는 HTTP 서버가 있다는 사실을 알면 네트워크를 검사하여 감염된 호스트를 식별할 수 있습니다.

위 내용은 Python이 악성 코드를 식별하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제