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

 

실습 환경

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