
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.04a
저장소: 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를 사용하세요.aflplusplus기본 구성은 Google의 fuzzbench에서 찾을 수 있습니다.
AFL++ 빌드 및 설치
모든 것이 컴파일된 AFL++를 쉽게 사용할 수 있도록 하려면 Docker Hub에서 이미지를 직접 가져오세요 (x86_64와 arm64 모두 사용 가능):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
이 이미지는 stable 브랜치로 푸시가 발생하면 자동으로 게시됩니다
(branches 참조). 위 명령을 사용하면 컨테이너의 /src에서
대상 소스 코드를 찾을 수 있습니다.
참고: 가장 최신 개발 상태인 aflplusplus/aflplusplus:dev를 풀(pull)할 수도
있습니다.
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에 설명된 대로 사전(dictionary)도 함께 생성합니다.
-
프로그램이 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을 즉시 참고하여 조사하세요.
-
발견된 크래시와 행(hang)은
-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++의 개발 상태 - 최첨단이며 컴파일되지 않거나 버그가 있는 체크아웃을 받을 수 있습니다. 우리는 'dev' 브랜치에 대해서만 PR(풀 리퀘스트)을 받습니다!
- (기타): 특정 기능 작업이나 새로운 기능 또는 변경 사항 테스트를 위한 실험적 브랜치.
도움을 구합니다
"help wanted" 태그가 붙은 이슈 목록을 확인하세요. 이것이 AFL++를 지원하고 기여하는 방법이 될 수 있습니다 - 무언가 멋진 일을 하도록 확장해 보세요. 다른 아이디어가 있다면 - 이슈를 생성하여 제안하세요!
기여하고 싶은 분(그리고 풀 리퀘스트를 보내고 싶은 분)은 제출하기 전에 기여 가이드라인을 읽어 주세요.
특별한 감사
원래 AFL과 AFL++에 대한 많은 개선은 기여자들의 피드백, 버그 보고 또는 패치 없이는 불가능했습니다.
감사합니다! (풀 리퀘스트를 보내는 분들은 - 이 목록에 자신을 추가해 주세요 :-)