
Fritter v1.3
EXE, DLL, .NET, VBScript, JScript의 메모리 내 실행을 위한 다형성 셸코드 생성기로, 탐지 회피 및 시그니처 저항을 위해 출력물별·빌드별 무작위화를 제공합니다.
Fritter
Donut의 교묘한 사촌.
Fritter는 TheWover와 Odzhan의 Donut 셸코드 생성기를 대폭 수정한 포크입니다. VBScript, JScript, EXE, DLL 및 .NET 어셈블리를 메모리 내에서 실행하기 위한 위치 독립적 셸코드를 생성하며, 회피와 시그니처 저항에 중점을 둡니다. 코드베이스는 x64 전용입니다.
달라진 점
많습니다. Fritter는 일반적으로 필요하지 않은 기능을 제거하고 수년간 시그니처가 잘 알려진 내부 구조를 교체합니다. 암호화, 압축, 해싱 및 API 해석 계층은 다른 여러 영역과 함께 모두 재작업되었습니다.
다형성과 회피가 설계 목표입니다. 모든 출력은 고유하며, 도구의 모든 빌드 자체도 고유합니다. 두 가지 별개의 레이어가 있습니다:
출력별 무작위화: fritter가 호출될 때마다 적용됩니다. 엔트리 스텁, 다형성 디코더, 암호화 키 및 생성된 셸코드 내의 많은 구조적 요소가 모든 PIC 빌드에서 새로운 엔트로피로 재생성됩니다.
빌드별 무작위화: fritter 자체가 컴파일될 때마다 적용됩니다. 암호 및 해시 회전 상수, API 해석 테이블 레이아웃, 심 측 문자열 스크램블링, PEB 탐색 방향, 실행 후 삭제 패턴, 그리고 로더와 심 내부의 여러 구조적 축이 컴파일 시점에 고정됩니다.
런타임에 Fritter는 로더의 실행 가능한 풋프린트를 최소화합니다. 로더는 개별적으로 암호화된 함수들로 분할되며, 각 함수는 고유한 PE 섹션, XOR 키 및 디스패처를 가집니다. 주어진 순간에는 오직 하나의 함수 바이트만 평문으로 존재합니다. 이전의 VEH 슬라이딩 윈도우 모델은 이 디스패치 모델을 위해 폐기되었습니다.
!! 소스에서 빌드하는 것을 강력히 권장합니다 !!
이것은 중요합니다. *releases*에서 테스트용으로 제공되는 사전 빌드 바이너리는 해당 바이너리의 모든 사용자 간에 빌드별 상수를 공유합니다.
자신만의 복사본을 빌드하세요. 빌드별 축은 make가 호출될 때마다 다시 무작위화됩니다:
# Linux, static-musl ELF, no runtime libc dependency
# Requires: build-essential, mingw-w64, musl-tools
make -f Makefile.linux release
# Windows (MSVC), recommended on Windows
nmake -f Makefile.msvc
Windows에서는 MSVC가 권장 툴체인입니다. MSVC는 각 로더 함수를 자체 페이지 정렬 PE 섹션에 배치하는데, 이것이 N>1 함수별 디스패치 모델에 필요한 방식입니다. mingw는 현재 모든 것을 단일 .text에 배치하므로 하나의 엔트리가 하나의 XOR 키로 전체 로더를 덮는 방식으로 실행됩니다(기능적으로는 MSVC 출력과 동일하지만, 다형성 디스패처가 여러 개가 아닌 하나뿐입니다). Visual Studio가 없다면 WSL에서 Makefile.linux로 빌드하세요. mingw-w64를 통해 Windows 로더를 크로스 컴파일합니다.
각 make는 tools/gen_poly를 실행하여 새로운 빌드별 상수를 생성하고 tools/gen_api_shuffle을 실행하여 API 해석 테이블을 순열화합니다. 그 결과 생성된 fritter 바이너리 자체는 서로 다른 암호 상수, 서로 다른 해시 상수, 서로 다른 API 테이블 레이아웃, 서로 다른 심 측 문자열 스크램블링 등을 갖는 고유한 바이너리입니다. 그 바이너리로 생성된 모든 셸코드는 그 빌드별 상수를 공유하지만 출력별 축에서는 달라집니다.
사용법
Fritter를 테스트하기 위해 calc.exe와 inject_local64.exe가 포함된 /test 폴더가 함께 제공됩니다. 테스트 호스트를 직접 다시 빌드하려면: nmake -f Makefile.msvc harness, 또는 WSL에서 make -f Makefile.linux harness를 실행하세요.
fritter [options] -i <EXE/DLL/VBS/JS>
INPUT
-i, --input <path> Input file to execute in-memory
-p, --args <args> Parameters / command line for target
-c, --class <name> Class name (required for .NET DLL)
-m, --method <name> Method or function for DLL
-r, --runtime <ver> CLR runtime version
-w, --unicode Pass command line as UNICODE
-t, --thread Run unmanaged EXE entrypoint as thread
OUTPUT
-o, --output <path> Output file (default: loader.bin)
-f, --format <1-8> 1=Bin 2=B64 3=C 4=Ruby 5=Py 6=PS 7=C# 8=Hex
-x, --exit <1-3> 1=Thread (default) 2=Process 3=Block
-y, --fork <offset> Fork thread, continue at RVA offset
LOADER
-e, --entropy <1-3> 1=None 2=Random names 3=Names+Crypto (default)
-k, --headers <1-2> 1=Overwrite (default) 2=Keep all
-g, --chunked <0-1> (deprecated; dispatch shim is always used)
-d, --domain <name> AppDomain name for .NET
-j, --decoy <path> Decoy module for Module Overloading
STAGING
-n, --modname <name> Module name for HTTP staging
-s, --server <url> Server URL (supports basic auth)
예제
fritter -i payload.exe
fritter -i implant.dll -m RunMain -p "arg1 arg2"
fritter -i payload.exe -g 0 -k 2 -o out.bin
아키텍처 (여기에 나열되지 않은 많은 구현이 있습니다)
Fritter 셸코드 페이로드는 중첩된 레이어로 구조화되며, 각 레이어는 다음 레이어를 복호화하거나 스테이징합니다:
-
엔트리 스텁. 가변 길이의 무작위 정크 프리픽스, 출력별로 생성되는 RSP 정렬 루틴, 그리고 생성적 트램펄린으로 구성됩니다. Shikata Ga Nai 기법에 기반합니다.
-
다형성 XOR 디코더. 2패스 방식으로 어셈블됩니다. 레지스터 할당은 Fisher-Yates 셔플로 풀에서 추출됩니다. 키 길이는 출력별로 선택됩니다. 모든 실제 명령어 사이에 정크가 삽입됩니다. 핫 루프의 이동 가능한 명령어 그룹은 정확성 제약 조건 내에서 재정렬됩니다.
-
디스패치 심. 이전의 VEH 슬라이딩 윈도우 심을 대체합니다. 로더 영역을 RW->RWX로 전환한 다음 제어를 로더 엔트리에 넘깁니다. N>1 디스패치에서는 각 호출이 함수별 썽크를 통해 함수별 디스패처로 라우팅되며, 디스패처는 복호화, 실행, 반환 시 삭제를 수행합니다. 모든 디스패처의 opcode 레이아웃은 빌드마다 다릅니다 (CHANGELOG v1.3 참조).
-
로더. PE 인메모리 매퍼입니다. 해시로 API를 해석하고, 섹션 API를 통해 내장된 PE를 매핑하며, 임포트/재배치/TLS 콜백을 적용하고, 엔트리포인트를 호출한 다음 삭제합니다. PEB 탐색 방향, 실행 후 삭제 바이트, MainProc의 구조적 salt 위치는 모두 빌드별로 무작위화됩니다.
-
정리. 빌드별 바이트 패턴으로 로더 페이지를 삭제하고, 인스턴스를 지우며,
-x에 따라 스레드 또는 프로세스 종료로 빠져나갑니다. 정리해야 할 VEH 핸들러나 컨텍스트 구조가 없습니다.
실행 후 남는 풋프린트는 디스패치 심이 실행된 작은 RWX 페이지 하나입니다. 스레드 모드에서는 CRT 콜백이 계속 이어질 수 있도록 매핑된 PE 섹션이 의도적으로 그대로 유지됩니다.
크레딧
Fritter는 TheWover와 Odzhan의 작업을 기반으로 합니다. 그들의 원래 Donut 프로젝트는 위치 독립적 셸코드 생성을 접근 가능하고 실용적으로 만들었습니다. 그들의 아키텍처, 로더 설계 및 PIC 프레임워크는 여기의 모든 것이 구축된 기반입니다. PE 매핑, .NET 호스팅 및 스크립트 실행 경로는 대부분 그들의 작업이며, 유지되고 존중됩니다.
라이선스
BSD 3-Clause. LICENSE를 참조하세요.