2014년 2월 16일 일요일

자바(Java) 바이트코드(Bytecode) 디버깅(Debugging)

며칠 전 출근 길에 흥미로운 블로그 내용을 읽게 되었습니다. 제가 읽는 블로그 내용들이 대부분 새로운 악성코드 분석 정보나 이와 관련된 분석 기법들을 다루는 내용들이 대부분인데, 며칠 전 흥미롭게 읽은 블로그는 미국 보안 업체인 Crowdstrike에서 작성한 “Native Java Bytecode Debugging without Source Code” 입니다.

최근 몇 년 사이에 외국도 마찬가지이지만 한국에서도 역시 Gongda Web Exploit Toolkit에서 자바(Java)에 존재하는 여러 가지 취약점들을 악용하여 다른 악성코드를 드라이브 바이 다운로드(Drive By Download)으로 감염시키는 기법들이 많이 사용되고 있습니다. 그래서, 저 역시 취약점이 존재하는 자바 파일 형식인 JAR 파일들을 자주 접하게 됩니다.

일반적으로 자바에서 사용하는 JAR 파일 형식은 압축 파일 형식인 PKZip과 동일한 형태를 가지고 있어, 헥사 에디터(Hex Editor)로 JAR 파일을 살펴 보게 되면 다음과 같은 구조를 가지고 있습니다.


위 헥사 코드를 보면 파일 오프셋(Offset) 0h의 첫 번째 두 바이트(Byte)가 PKzip으로 압축된 파일과 동일한 시그니처(Signature)을 가지고 있고, 매니패스트(MANIFEST) 역시 정의되어 있는 것을 볼 수가 있습니다. 하지만, 경우에 따라 특정 JAR 파일의 경우에는 아래 헥사 코드처럼 매니패스트 없이 바로 클래스(Class) 파일명이 정의되어 있는 것도 볼 수가 있습니다.


그래서, JAR 파일은 7Zip과 같은 범용 압축 라이브러리(library)를 사용하는 압축 프로그램으로 압축을 풀 수 있으며, 파일이 손상되지 않은 경우에는 아래 이미지와 같이 내부에 포함되어 있는 클래스 파일을 볼 수가 있습니다.


압축 파일 형태를 가지는 JAR 파일에 대해 대부분의 안티 바이러스(Anti-Virus) 소프트웨어에서는 JAR 파일의 압축을 풀고 내부에 존재하는 클래스 파일에 존재하는 익스플로잇(Exploit) 코드들을 이용해 진단 합니다.

일반적으로 JAR 파일을 분석은 자바 디컴파일러(Java Decomplier)를 이용해 아래 이미지와 같이 JAR 파일 구조와 내부 클래스 파일들에 포함되어 있는 디컴파일된 코드들을 살펴볼 수가 있습니다.


자바 디컴파일러를 이용하는 경우에는 위 이미지에 존재하는 붉은 색 박스의 클래스 박스를 확장하면 내부 코드들을 확인 할 수가 있습니다. 그래서 비교적 간단한 JAR 파일들의 경우에는 자바 디컴파일러를 이용하여, 아래 이미지와 같이 클래스 파일의 코드들에 존재하는 악의적인 코드를 읽어 볼 수 있습니다.


이러한 방식은 일반적으로 비교적 간단한 JAR 파일을 디컴파일하여 볼 수 있는 방법이지만, 실제 코드를 디버깅하면서 볼 수 없기 때문에 실제 악의적인 코드의 흐름을 자세히 파악하기 어려운 부분이 있습니다.

그런데, 앞서 언급한 Crowdstrike 블로그에서는 몇 가지 프로그램들을 설치하여, JAR 파일을 디버깅(Debugging) 할 수 있는 방안을 설명하고 있습니다. 그래서 해당 업체에서 설명한 방안으로 실제 JAR 파일을 디버깅 가능한지 확인 해보았습니다.

우선 JAR 파일을 디버깅하기 위해서는 2개의 소프트웨어를 별도로 설치를 하여야 됩니다. 우선, 오라클(Oracle)에서 제공하는 자바 개발 도구(Java SE Development Kit 7)를 설치하여야 됩니다. 설치하고자 하는 버전은 오라클에서 항상 최신 버전을 제공해주고 있음으로 운영체제에 맞는 버전만 설치하면 됩니다.


자바 개발 도구(Java SE Development Kit 7) 설치가 완료되면, 두 번째로 필요한 소프트웨어는 자바 개발자용 이클립스 IDE(Eclipse IDE for Java Developers)가 필요 합니다. 이클립스의 경우에는 파일 설치 없이 압축 파일 다운로드 이후 내부에 존재하는 실행 파일 클릭만으로 바로 사용이 가능합니다.


JAR 파일을 분석하기 위해서는 추가적으로 이클립스 마켓플레이스(Eclipse Marketplace)에서 “Dr.Garbage’s Bytecode Visualizer” 프로그램을 하나 더 설치하여야 됩니다. 그러므로, 이클립스 마켓플레이스에서 검색을 통해 최신 버전인 “Bytecode Visualizer 4.3.5” 최신 버전을 설치 합니다.


“Bytecode Visualizer 4.3.5”가 설치 완료되면 자바 개발자용 이클립스 IDE가 재시작을 하면 이제 JAR 파일을 디버깅 할 수 있는 환경은 모두 완료되었다고 생각하시면 됩니다.

이제 실제 취약한 JAR 파일을 자바 개발자용 이클립스 IDE에서 읽어 들이기 위해 새로운 자바 프로젝트(Java Project)를 하나 생성합니다.


새로운 자바 프로젝트는 아래 이미지와 같이 간단하게 새로운 자바 프로젝트의 명칭만을 정의 해주고 다음을 클릭합니다.


여기에서 아래 이미지와 같이 새로운 자바 프로젝트의 환경 설정들이 나타나게 됩니다. 여기에서 상단의 “Libraries” 탭을 선택 한 후, 디버깅을 하고자 하는 취약한 JAR 파일을 지정해주기 위해 “Add External JARs”를 클릭합니다. 그리고 준비 한 취약한 JAR 파일을 선택 합니다.


준비한 취약한 JAR 파일을 새로운 프로젝트에서 읽어 들이게 되면 자바 디컴파일러에서 보아왔던 것과 동일하게 JAR 파일의 구조가 전부 보이게 됩니다. 여기에서 JAR 파일 내부에 존재하는 클래스 파일을 선택 한 후 오른쪽 마우스를 클릭하여 “Open with Bytecode Visualizer”를 선택 합니다.


해당 클래스 파일을 “Bytecode Visualizer”에서 읽어 들이게 되면 아래 이미지와 같은 코드들이 나타나며, IDA에서와 같이 전체 코드 플로우(Code Flow)와 함께 코드들이 나타나게 됩니다.


여기에서 코드 시작 부분을 오른쪽 마우스로 클릭하여 브레이크포인트(BreakPoint)를 설정한 후에 디버깅을 진행 할 준비를 합니다.


코드 시작 부분에 브레이크포인트 설정을 완료 했다면, 다시 클래스 파일에서 오른쪽 마우스를 클릭하여 나타나는 항목 중 “Debug As”를 선택 한 후 “Java Application”을 클릭해야 됩니다.


그런데, 제가 준비한 취약한 JAR 파일의 클래스 파일에서는 이상하게도 디버그 설정에 “Java Application”이 나타나지 않았습니다.

무언가 설정이 잘못되거나 준비한 JAR 파일에 문제가 있는지 구글(Google) 검색을 통해 확인 해보니 디버깅을 위한 JAR 파일 내부의 클래스 파일에 메인 코드 시작 부분이 존재해야 되었습니다.

즉, 윈도우(Windwos) PE 파일이 WinMain에서 시작하듯이 JAR 파일의 클래스 파일에서도 메인 코드(Main Code) 시작 부분이 존재하는데, 제가 준비한 JAR 파일에는 해당 메인 코드가 존재하지 않았기 때문에 디버그 설정에 “Java Application”이 나타나지 않았던 것으로 보입니다. 그래서 최근에 발견된 악의적인 JAR 파일들을 확인 해보니 모두 메인 코드가 존재하지 않는 샘플들이었습니다.

하지만, 이 부분은 조금 더 조사와 연구를 해보고 가능한 방법들이 있는지 찾아 봐야 할 것 같습니다. 이후에라도 가능한 방법들을 찾게 된다면 블로그를 업데이트 하도록 하겠습니다.

댓글 없음:

댓글 쓰기