
AFLplusplus v5.03c
AFL++는 최첨단 퍼저이며 벤치마크에서 1위를 차지했습니다. 원래 AFL을 기반으로 했습니다. 오늘날에는 qemu 5.1, 충돌 없는 커버리지, 향상된 laf-intel & redqueen, AFLfast++ 파워 스케줄, MOpt 뮤테이터, unicorn_mode 등 많은 기능이 포함되어 있습니다!
American Fuzzy Lop plus plus (AFL++)
릴리스 버전: 5.03c
GitHub 버전: 5.03c
저장소: https://github.com/AFLplusplus/AFLplusplus
AFL++는 다음 사람들이 유지보수합니다:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode는 @Worksbutnottested가 유지보수합니다
원래는 Michal "lcamtuf" Zalewski가 개발했습니다.
AFL++는 Google의 AFL보다 우수한 포크입니다 - 더 빠른 속도, 더 많고 더 나은 뮤테이션, 더 많고 더 나은 인스트루멘테이션, 커스텀 모듈 지원 등을 제공합니다.
AFL++는 AGPL-3.0-or-later 라이선스로 배포되며, Apache-2.0 라이선스가 적용되는 파일도 포함합니다.
퍼징 하니스로 컴파일되는 모든 것은 Apache 2.0 라이선스가 유지됩니다.
각 파일은 자체 SPDX-License-Identifier 헤더에 라이선스를 명시합니다 — 해당 파일에 대해
따라야 하는 라이선스는 바로 그것입니다.
AGPL을 사용할 수 없는 조직을 위해 상용 라이선스가 선택적으로 제공됩니다
(좋은 목적을 위한 기부를 통해 획득 — 프로젝트와 유지보수자는 금전적 이익을 받지 않습니다).
자세한 내용은 LICENSING.md의 쉬운 설명과 아래의
라이선스 섹션을 참조하세요.
시작하기
시작하는 데 도움이 되는 몇 가지 정보입니다:
- AFL++ 문서 개요와 매우 유용한 그래픽 가이드는 docs/README.md를 방문하세요.
- 튜토리얼을 시작하려면 docs/tutorials.md로 이동하세요.
- 릴리스에 대해서는
Releases 탭과
브랜치를 참조하세요. 그러나 사용하기 가장 좋은 브랜치는 위험 감수 수준에 따라
stable또는dev입니다. 또한 AFL++의 중요한 변경 사항 목록과 기능 목록도 확인하세요. - 학술 연구에 AFL++를 사용하려면 웹사이트의 논문 페이지를 확인하세요.
- 우리 연구를 인용하려면 인용 섹션을 참조하세요.
- 비교를 위해서는 fuzzbench
aflplusplus설정을 사용하거나,AFL_LLVM_CMPLOG=1과 함께afl-clang-fast를 사용하세요. Google의 fuzzbench에서aflplusplus기본 구성을 찾을 수 있습니다.
AFL++ 빌드 및 설치
모든 것이 컴파일된 AFL++를 쉽게 사용하려면 Docker Hub에서 이미지를 직접 가져오세요 (x86_64 및 arm64 모두 사용 가능):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
이 이미지는 stable 브랜치에 푸시가 발생할 때 자동으로 게시됩니다
(브랜치 참조). 위 명령어를 사용하면 컨테이너의 /src에서
대상 소스 코드를 찾을 수 있습니다.
참고: aflplusplus/aflplusplus:dev도 가져올 수 있으며, 이는 AFL++의 가장 최신
개발 상태입니다.
AFL++를 직접 빌드하려면 — 이 방법을 권장합니다 — docs/INSTALL.md에서 계속 진행하세요.
빠른 시작: AFL++로 퍼징하기
참고: 시작하기 전에 퍼징의 일반적인 위험에 대해 읽어보세요.
이것은 소스 코드가 있는 대상을 퍼징하기 위한 빠른 시작 가이드입니다. 프로세스에 대해 자세히 알아보려면 docs/fuzzing_in_depth.md를 참조하세요.
다른 대상을 퍼징하는 방법을 알아보려면 다음을 참조하세요:
- 바이너리 전용 대상: docs/fuzzing_binary-only_targets.md
- 네트워크 서비스: docs/best_practices.md#fuzzing-a-network-service
- GUI 프로그램: docs/best_practices.md#fuzzing-a-gui-program
단계별 빠른 시작:
-
afl-cc를 사용하여 퍼징할 프로그램 또는 라이브러리를 컴파일하세요. 일반적인 방법은 다음과 같습니다:CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared make clean all -
프로그램에 의미가 있는 작지만 유효한 입력 파일을 준비하세요. 복잡한 구문(SQL, HTTP 등)을 퍼징할 때는 dictionaries/README.md에 설명된 대로 사전도 생성하세요.
-
프로그램이 stdin에서 읽는 경우 다음과 같이
afl-fuzz를 실행하세요:./afl-fuzz -i seeds_dir -o output_dir -- \ /path/to/tested/program [...program's cmdline...]사전을 추가하려면 afl-fuzz에
-x /path/to/dictionary.txt를 추가하세요.프로그램이 파일에서 입력을 받는 경우 프로그램의 명령줄에
@@를 넣을 수 있습니다. AFL++가 자동 생성된 파일 이름을 해당 위치에 넣어줍니다. -
퍼저 UI에서 빨간색으로 표시되는 모든 항목은 즉시 docs/afl-fuzz_approach.md#understanding-the-status-screen을 참조하여 조사하세요.
-
발견된 크래시와 행은
-o output_dir디렉토리의crashes/및hangs/하위 디렉토리에서 찾을 수 있습니다. 크래시를 재생하려면 대상에 입력으로 전달하세요. 예를 들어 대상이 stdin을 사용하는 경우:cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]코어를 생성하거나 gdb를 직접 사용하여 크래시를 추적할 수 있습니다.
-
퍼징의 커버리지 분석을 위해 파트너 도구인 cov-analysis(퍼징 코퍼스 기반 소스 커버리지 리포트)와 fuzz-reachability(하니스가 도달할 수 있는 함수의 정적 분석으로, 실행 가능한 커버리지 격차와 데드 코드를 구분하고 인스트루멘테이션 허용 목록 생성)를 권장합니다.
-
아무리 강조해도 지나치지 않습니다 — 효과적으로 퍼징하려면 docs/fuzzing_in_depth.md 문서를 읽으세요!
연락처
질문이 있나요? 우려 사항이 있나요? 버그 리포트가 있나요?
- 기여자들에게는 다음을 통해 연락할 수 있습니다 (예: 이슈 생성 — 단, AFL++ 결함에 한함!): https://github.com/AFLplusplus/AFLplusplus.
- FAQ와 모범 사례를 확인하세요.
- 가장 좋은 방법: Fuzzing Zulip 서버에 가입하세요!
브랜치
다음과 같은 브랜치가 있습니다:
- release: 최신 릴리스
- stable: AFL++의 안정적인 상태 — 안정성에 만족할 때 때때로 dev에서 동기화됩니다. 이것이 기본 브랜치입니다.
- dev: AFL++의 개발 상태 — 최첨단이며 컴파일되지 않거나 버그가 있는 체크아웃을 받을 수 있습니다. PR(풀 리퀘스트)은 'dev' 브랜치에만 접수합니다!
- (기타): 특정 기능 작업 또는 새로운 기능이나 변경 사항 테스트를 위한 실험 브랜치.
도움 요청
"help wanted" 태그가 있는 이슈 목록을 확인하세요. 이것이 AFL++를 지원하고 기여하는 방법이 될 수 있습니다 — 멋진 기능으로 확장해 보세요. 다른 아이디어가 있다면 — 이슈를 생성하여 제안하세요!
기여(및 풀 리퀘스트 전송)를 원하는 모든 분들은 제출 전에 기여 지침을 읽어주세요.
특별 감사
원래 AFL과 AFL++에 대한 많은 개선은 기여자들의 피드백, 버그 리포트 또는 패치 없이는 가능하지 않았을 것입니다.
감사합니다! (풀 리퀘스트를 보내는 분들은 이 목록에 자신을 추가해 주세요 :-)