
실행 파일에서 블로트를 제거하기 위한 GUI 및 CLI 도구

Debloat는 비대해진 실행 파일에서 과도한 쓰레기를 제거하는 GUI 및 CLI 도구입니다.
"과도한 쓰레기"란 바이너리가 샌드박스에 들어가지 못하도록 바이너리에 추가된 100~800MB의 정크 바이트를 의미합니다. 이러한 정크 추가 방식을 "인플레이팅(inflating)" 또는 "펌핑(pumping)"이라고 합니다. Debloat는 현재 가장 흔한 10가지 인플레이션 기법을 처리합니다.
Python으로 제작된 이 애플리케이션은 다른 워크플로우에서도 쉽게 활용할 수 있습니다. 현재 debloat는 CCCS의 AssemblyLine 및 CERT Polska의 MWDB에서 사용되고 있습니다.
이 프로그램은 Windows, MacOS, Linux용으로 컴파일할 수 있습니다. GUI와 CLI에는 최소한의 옵션만 있습니다. 가능한 한 단순하게 설계되었으며, 프로그램 내부의 로직이 다양한 사용 사례를 자동으로 처리합니다.
컴파일된 바이너리는 이미 Releases에 포함되어 있습니다.
debloat는 pip install debloat 명령으로 설치할 수 있습니다. debloat로 CLI를 실행하고 debloat-gui로 GUI를 실행합니다.
고급 사용자의 경우 Debloat를 다른 스크립트로 가져와서 처리 함수를 개별적으로 호출할 수도 있습니다.
Debloat의 GUI는 가능한 한 직관적으로 설계되었습니다. 실행 후 비대해진 파일을 텍스트 입력란에 끌어다 놓고 "Process file" 버튼을 누르면 됩니다. 일부 기술 정보가 스크롤되는 텍스트 상자에 출력되며, 블로트가 제거된 파일은 원본 파일이 있던 디렉터리에 저장됩니다. 쉽게 들리나요? 정말 그렇습니다!
파일 처리는 몇 초 정도 걸립니다.

pip install debloat로 설치한 후 debloat 명령을 사용합니다.
debloat는 두 개의 인수를 받을 수 있습니다. 첫 번째 인수는 필수이며, 디블로트할 파일입니다. 두 번째 인수는 선택 사항으로 출력 위치입니다. 출력 위치를 지정하지 않으면 원본 파일과 같은 디렉터리에 저장됩니다.
GUI는 debloat-gui 명령으로 CLI에서도 실행할 수 있습니다.
아직 아닙니다. 최근 분석에 따르면 debloat는 비대해진 파일에서 97.8%의 확률로 정크를 제거할 수 있습니다.
이전 버전에서는 debloat가 실수로 바이너리의 너무 많은 부분을 제거할 수 있었습니다. 그러나 "--last-ditch" 스위치를 사용하지 않는 한 더 이상 그런 일은 발생하지 않습니다. 이 스위치가 필요한 경우 추가 분석을 위해 샘플을 공유해 주시기 바랍니다. 이 옵션은 이제 GUI에도 추가되었습니다. 기능적으로 이 함수는 오버레이(overlay)가 있을 경우 오버레이 전체를 제거합니다. 정크에 대한 패턴이 발견되지 않은 경우 필요할 수 있으며, 이는 일반적으로 압축이 잘 되지 않는 샘플에서 가장 흔하게 발생합니다.
서명된 PE 끝에 추가된 블로트.
아래 이미지에서 블로트가 실행 파일 끝에 추가된 것을 볼 수 있습니다.

서명 또는 미서명 패킹(packed) 실행 파일.
아래 이미지에서 패킹 후 블로트가 실행 파일에 추가된 것을 볼 수 있습니다.

PE의 .rsrc 섹션에 블로트가 포함된 서명된 실행 파일.
아래 이미지에서 블로트가 .rsrc 섹션에 있는 것으로 식별되어 PE에서 제거됩니다.

PE 섹션 내부에 블로트가 추가된 경우.
아래 이미지에서 블로트가 [0]이라는 이름의 PE 섹션에 포함되어 있습니다.

실행 파일이 Nullsoft Scriptable Installer System 실행 파일(NSIS, 일명 Nullsoft)인 경우.
이러한 exe는 하나 이상의 파일을 포함할 수 있는 설치 프로그램입니다. 포함된 파일은 악성일 수도 있고 아닐 수도 있습니다. (때로는 공격자가 단순히 파일 크기를 늘리기 위해 파일을 추가하기도 합니다.) 설치 프로그램 내의 모든 파일은 새 디렉터리에 추출됩니다. 이 디렉터리에는 설치 프로그램의 스크립트도 포함되어 있으며, 이를 참조하여 어떤 파일이 악성인지 확인할 수 있습니다.
아래 이미지에서 Malcat은 이 실행 파일을 NSIS 설치 프로그램으로 식별했습니다.

도구가 동작하지 않는 사용 사례도 있습니다. 다만, 이에 대해 너무 많이 공개하기 전에 해결할 계획입니다.
비대해진 실행 파일을 쉽게 처리할 수 있는 도구는 제한적인 것 같습니다. 제가 가장 많이 본 두 도구는 디스크 이미지에서 바이너리를 복구하기 위한 "foremost"와 "pecheck"입니다.
Foremost는 정크 바이트가 널(0x00)인 경우에 가장 잘 동작하며, 바이너리에 가짜 또는 실제 서명이 있는 경우에는 어려움을 겪습니다. 파일에서 블로트를 제거하는 용도는 이 도구의 원래 목적이 아닙니다.
Pecheck는 14년 이상 개발되어 왔으며 혼란스러운 명령줄 옵션이 일부 있습니다. 블로트된 콘텐츠를 제거하는 옵션은 이 스크립트의 주요 기능이 아닙니다. 서명된 실행 파일을 처리하려면 Pecheck를 다른 도구(disitool)와 결합해야 합니다. 제 경험상 pecheck가 혼동되어 원래 블로트된 실행 파일보다 두 배 큰 실행 파일을 반환하는 경우도 있었습니다. 이러한 모든 요소는 소수의 바이너리를 처리할 때는 괜찮아 보이지만, 바이너리 수와 기법이 늘어날수록 블로트 제거에 특화된 도구가 필요합니다.
Binary Refinery는 놀라운 도구입니다. 명령줄의 CyberChef가 되겠다는 의도로 작성되었습니다. 두 도구 모두 훌륭하지만, 사용자가 어떤 수식을 적용해야 하는지 알아야 한다는 단점이 있습니다.
바이너리에서 블로트를 제거하는 확실한 수동 방법이 있지만, 이러한 방법은 지루할 수 있고 모든 분석가가 이 작업을 수행할 수 있는 것은 아닙니다. 이 도구는 블로트를 수동으로 제거하는 방법을 알아야 하는 부담을 없애줍니다. 또한 더 나은 확장성을 제공합니다. 스크립트에 사용된 원리는 자동화를 원할 경우 더 나은 확장성을 가능하게 합니다.
사용 중인 플랫폼에 맞는 빌드 명령을 따르세요. 빌드 명령 간의 주요 차이점은 아이콘 형식입니다.
MacOS
pyinstaller --onefile --noconsole --additional-hooks-dir=./hook --icon=debloat.icns gui.py
Windows
pyinstaller --onefile --noconsole --additional-hooks-dir=./hook --icon=debloat.ico gui.py
Linux
pyinstaller --onefile --noconsole --icon=debloat.ico --collect-all tkinterdnd2 gui.py
debloat Discord에 가입해 보세요.
Binary Refinery의 제작자인 Jesko Hüttenhain에게 큰 감사를 전합니다. NSIS 추출은 그가 리버스 엔지니어링한 NSIS 파일 형식을 기반으로 합니다. 아직 확인하지 않았다면 Binary Refinery를 확인해 보세요.
일괄 처리: 디렉터리의 모든 파일을 처리하고 보고서를 생성합니다.
debloat 외부에서 처리 방법을 사용할 수 있도록 더 나은 지원.
압축 해제 없이 디블로팅할 수 있는 지원.