
악성코드 분석과의 관련성을 기준으로 문자열의 순위를 매기는 머신러닝 도구입니다.
StringSifter는 악성코드 분석을 위해 문자열의 관련성을 기준으로 자동으로 순위를 매기는 머신러닝 도구입니다.
StringSifter는 Python 3.9 이상 버전이 필요합니다. 다음 명령을 실행하여 코드를 받고, 단위 테스트를 실행하고, 도구를 사용하세요:
pip install stringsifter
개발용으로는 poetry를 사용하세요:
git clone https://github.com/mandiant/stringsifter.git
cd stringsifter
poetry install --with dev
StringSifter 설치 디렉터리에서 단위 테스트를 실행하려면:
poetry run tests -v
pip install 명령은 flarestrings와 rank_strings라는 두 개의 실행 가능한 스크립트를 Python 환경에 설치합니다. 소스에서 개발할 때는 pipenv run flarestrings 및 pipenv run rank_strings를 사용하세요.
flarestrings는 GNU binutils의 strings 기능을 모방하며, rank_strings는 파이프된 입력을 받아들입니다. 예:
flarestrings <my_sample> | rank_strings
rank_strings는 여러 명령줄 인수를 지원합니다. 위치 인수 input_strings는 순위를 매길 문자열이 담긴 파일을 지정합니다. 선택적 인수는 다음과 같습니다:
| Option | Meaning |
|---|
--batch 옵션을 지정하지 않으면 순위가 매겨진 문자열은 표준 출력으로 작성되며, 지정하면 순위가 매겨진 출력이 <input_file>.ranked_strings라는 이름의 파일로 작성됩니다.
flarestrings는 -n(또는 --min-len) 옵션을 지원하며, 기본값 4 대신 최소 min-len 길이의 문자 시퀀스를 출력합니다. 예:
flarestrings -n 8 <my_sample> | rank_strings
길이가 8 이상인 문자열만 출력하고 순위를 매깁니다.
docker build -t stringsifter -f docker/Dockerfile .
flarestrings 또는 rank_strings 인수와 함께 실행하여 해당 명령을 사용합니다. 컨테이너화된 명령은 파이프라인에서 사용할 수 있습니다:cat <my_sample> | docker run -i stringsifter flarestrings | docker run -i stringsifter rank_strings
-v 플래그로 호스트 디렉터리를 컨테이너에 노출합니다:docker run -v <my_malware>:/samples -it stringsifter
여기서 <my_malware>는 분석 대상 샘플이 포함된 디렉터리입니다. 예:
docker run -v $HOME/malware/binaries:/samples -it stringsifter
flarestrings /samples/<my_sample> | rank_strings <options>
모든 명령줄 인수는 컨테이너화된 스크립트에서 지원됩니다.
StringSifter는 임의의 문자열 목록에 적용할 수 있으므로, 라이브 메모리 덤프, 샌드박스 실행 또는 난독화된 문자열을 포함하는 바이너리와 같은 대체 인텔리전스 수집 소스에서 통찰을 얻고자 하는 실무자에게 유용합니다. 예를 들어, FireEye Labs Obfuscated Strings Solver (FLOSS)는 Strings와 마찬가지로 인쇄 가능한 문자열을 추출하지만, 인코딩, 패킹 또는 스택에 수동으로 구성된 난독화된 문자열도 추가로 드러냅니다. Strings의 인라인 대체품으로 사용할 수 있으므로 StringSifter도 다음 명령을 사용하여 FLOSS 출력에 유사하게 호출할 수 있습니다:
$PY2_VENV/bin/floss –q <options> <my_sample> | rank_strings <options>
참고:
–q 인수는 헤더와 형식을 생략하고 추출된 문자열만 표시합니다. 추가 FLOSS 옵션에 대한 자세한 내용은 사용법 문서를 참조하세요.floss 또는 rank_strings 중 적어도 하나는 Python 가상 환경을 참조하는 상대 경로를 포함해야 합니다.strings 실행에 관한 참고 사항이 배포판에는 플랫폼 간 예측 가능한 출력을 보장하기 위해 flarestrings 프로그램이 포함되어 있습니다. 시스템에 설치된 strings를 실행하려는 경우 해당 옵션은 버전과 플랫폼에 따라 일관되지 않습니다:
대부분의 Linux 배포판에는 GNU Binutils의 strings 프로그램이 포함되어 있습니다. "와이드" 문자열과 "내로우" 문자열을 모두 추출하려면 프로그램을 두 번 실행하여 출력 파일로 파이프해야 합니다:
strings <my_sample> > strs.txt # narrow strings
strings -el <my_sample> >> strs.txt # wide strings. note the ">>"
MacOS에 포함된 일부 BSD strings 버전은 와이드 문자열을 지원하지 않습니다. 또한 전체 파일을 스캔하는 strings의 -a 옵션은 기본 구성에서 비활성화될 수 있습니다. -a가 없으면 유용한 문자열이 손실될 수 있습니다. 와이드 문자를 지원하는 strings 버전을 얻으려면 Homebrew 또는 MacPorts를 통해 GNU Binutils를 설치하는 것이 좋습니다. 올바른 버전의 strings를 호출하도록 주의하세요.
strings는 Windows에 기본적으로 설치되지 않습니다. 작동하는 strings를 얻으려면 Windows Sysinternals, Cygwin 또는 Malcode Analyst Pack을 설치하는 것이 좋습니다.
이 버전의 StringSifter는 첫 번째 EMBER 데이터 세트와 연관된 샘플 악성코드 바이너리의 Strings 출력을 사용하여 훈련되었습니다. 순서형 레이블은 약한 지도 방식으로 생성되었으며, 지도 학습은 순위 학습 목적 함수를 사용하는 그라디언트 부스팅 결정 트리로 수행됩니다. 자세한 기술적 내용은 빠른 링크를 참조하세요. 현재 레이블 데이터와 훈련 코드는 제공되지 않으며, 향후 릴리스에서 이 접근 방식을 재검토할 수 있습니다.
버그 및 기능 요청은 GitHub Issues를 사용합니다.
flarestrings는 훌륭한 도구인 FLOSS에서 파생되었습니다.| --scores (-s) | 출력에 순위 점수 포함 |
| --limit (-l) | 상위 limit개의 순위가 매겨진 문자열로 출력 제한 |
| --min-score (-m) | 점수가 min-score 이상인 문자열로 출력 제한 |
| --batch (-b) | 일괄 처리를 위한 strings 출력 폴더 지정 |