Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
litefuzz — 사용자 영역 바이너리, 네트워크 클라이언트 및 서버를 테스트하는 멀티플랫폼 퍼저 | Kitploit
도구/GitHubGitHub/sec-tools/litefuzz
Vulnerability AnalysisExploitationFuzzingPenetration TestingBinary Analysis
GitHubsec-tools/litefuzz

litefuzz

사용자 영역 바이너리, 네트워크 클라이언트 및 서버를 테스트하는 멀티플랫폼 퍼저

저장소 보기
69108개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

litefuzz

사용자 공간 바이너리, 클라이언트 및 서버를 테스트하기 위한 다중 플랫폼 퍼저입니다.

이 도구는 유수 기업과 오픈 소스의 50개 이상의 앱 및 라이브러리에서 버그를 발견했습니다.

Linux, Mac 및 Windows에서 퍼징을 시작하기 위한 간단한 설정.

  • litefuzz
    • intro
    • why
    • how it works
      • what it does
      • what it doesn't do
    • support
      • python versions
      • linux
      • mac
      • windows
      • targets
      • triage
    • getting started
      • tests
        • unit tests
        • crashing app tests
    • options
      • crash directory
      • insulate mode
      • timeout
      • mutators
      • ReportCrash
      • pause
      • reusing crashes for variant finding
      • memory debugging helpers
      • checking live target output
      • client and server modes
      • local network examples
      • remote network examples
        • client
        • server
          • TLS
        • multiple data exchange modes
      • attaching to a process
      • crash artifacts
      • golang
      • repros
      • remove file
      • minimization
      • command
    • examples
      • local app
        • quick look
        • enumerating file handlers on Ubuntu
        • enumerating file handlers on OS X
      • client
        • quick look
        • local client
        • remote client
      • server
        • quick look
        • local server
        • remote server
  • command line
  • trophies
  • FAQ
    • how did this project come about?
    • is this project actively maintained?
    • how do you know the fuzzer is working well and did you measure it against others?
    • what would you change if you were to re-write it today?
    • how stable is litefuzz?
    • are there unsupported scenarios for litefuzz?
    • what guarentees are given for this project or it's code?
    • author / references

intro

Litefuzz는 한 가지 목적을 위해 만들어졌습니다: 모든 주요 플랫폼에서 퍼징 및 트라이지를 수행하고, CLI/GUI 앱, 네트워크 클라이언트 및 서버를 지원하여 보안 관련 버그를 찾는 것입니다.

이 도구는 프로세스를 단순화하고, 몇 가지 정직한 절충안을 통해 여러 플랫폼의 다양한 대상에서 보안 버그를 쉽게 발견할 수 있도록 합니다.

속도, 확장성 또는 학계에서 상을 받기 위해 만들어진 것이 아닙니다. 다양한 각도에서 간단한 기술을 적용하여 결과를 얻습니다. 콘솔 기반 파일 퍼징에는 AFL을 사용하는 것이 좋습니다. AFL은 뛰어난 성능, 계측 기능(및 더 빠른 비계측 실행), 확장성을 갖추고 있으며 공중에서 jpeg를 만들어낼 수 있습니다. 네트워크 퍼징의 경우, 재생할 PCAP이 있다면 mutiny 퍼저도 잘 작동하며 frizzer도 유망해 보입니다. 하지만 이 도구를 사용해보고 싶다면, 하나의 도구만으로 플랫폼 전반에서 그러한 종류의 대상을 퍼징할 수 있습니다.

./ 그리고 당신의 대상에... 약간의 lite fuzz를 가해보세요.``` $ sudo apt install -y latex2rtf

$ ./litefuzz.py -l -c "latex2rtf FUZZ" -i input/tex -o crashes/latex2rtf -n 1000 -z --========================-- --======| litefuzz |======-- --========================--

[STATS] run id: 3516 cmdline: latex2rtf FUZZ crash dir: crashes/latex2rtf input dir: input/tex inputs: 1 iterations: 1000 mutator: random(mutators)

@ 1000/1000 (3 crashes, 127 duplicates, ~0:00:00 remaining)

[RESULTS]

completed (1000) iterations with (3) unique crashes and 127 dups

check crashes/latex2rtf for more details

root@kitploit:~
이것은 AFL++가 완벽하게 처리할 수 있는 간단한 로컬 타겟이며, 예시로 빠르게 제시한 것입니다. Litefuzz는 네트워크 및 GUI 퍼징 측면에서 훨씬 더 많은 기능을 제공하도록 설계되었으므로, 실제로 사용해보면 알게 될 것입니다.

## 이유

네, 또 다른 퍼저입니다. 그리고 현재의 트렌드와 관례에 잘 맞지 않는 퍼저입니다. 특정 요구사항을 충족하기 위해 트레이드오프가 이루어졌습니다. 이러한 요구사항은 기본적으로 여러 플랫폼에서 작동하고, 로컬 및 네트워크 타겟을 모두 퍼징하며, 사용하기 매우 쉬운 퍼저입니다. 누군가를 설득하려는 것이 아니라, 맥락을 제공하려는 것입니다. 일부 타겟은 AFL과 같은 퍼저를 빌드 체인에 통합하는 데 많은 노력이 필요합니다. 이 퍼저는 계측(instrumentation)을 필요로 하지 않으므로 문제가 되지 않으며, 계측을 통해 얻는 정확한 커버리지는 희생하되 사용 편의성과 이식성을 얻었습니다. AFL은 기본적으로 네트워크 퍼징을 지원하지 않으며, 이를 지원하는 프로젝트들이 있지만 사용하기가 간단하지 않고 일반적으로 더 많은 코드 수정과 하네스가 필요합니다 ([Libfuzzer](https://llvm.org/docs/LibFuzzer.html)와 비슷한 이야기입니다).

병렬 퍼징을 하지 않으며, [영구 모드](https://lcamtuf.blogspot.com/2015/06/new-in-afl-persistent-mode.html)가 제공하는 엄청난 속도 향상도 지원하지 않으므로, 그러한 기능을 가진 퍼저들에 비해 확장할 수 없습니다. 다시 말하지만, 이것은 최첨단 퍼저가 아닙니다. 그러나 소스 코드, 빌드 설정 또는 특정 OS 기능이 필요하지 않습니다. 일부 네트워크 클라이언트 GUI 및 대화형 앱도 퍼징할 수 있습니다. 여러 측면에서 '있는 그대로' 동작하며, 변이기 및 최소화와 같은 많은 기능은 처음부터 직접 작성되었습니다.

그냥 작동하도록 설계되었으며, 필요한 몇 가지 종속성에 대한 설정 및 설치를 자동화하는 데 노력을 기울였습니다. 이 퍼저는 목적을 위해 작성되었으며, 다양한 타겟 시나리오와 환경에서 가치를 제공하고, 무엇보다도 모든 퍼저가 궁극적으로 평가되어야 할 기준인 버그를 찾는 능력에서 가치를 제공합니다. 그리고 **실제로** [버그](https://github.com/sec-tools/beta/blob/main/README.md#trophies)를 찾습니다. 타겟 소스 코드가 있다고 가정하지 않으므로, 폐쇄 소스 소프트웨어를 상당히 잘 커버할 수 있습니다. 약간의 수정만으로 자동화의 일부로 실행될 수 있지만, 취약점 연구자들이 사용하기에 재미있도록 설계되었습니다. 그러나 완전한 제품보다는 R&D 프로젝트로 생각하는 것이 더 도움이 됩니다. 또한, 기본적으로 약간 망가져 있거나 최신 운영 체제에서 실행하기 위해 추가 작업이 필요한 복잡한 설정은 없습니다.

Ubuntu Linux, Mac 및 Windows에서 작동하는 것으로 테스트되었으며, 퍼징 준비 환경을 설정하기 위해 거의 모든 작업을 자동으로 수행하는 완전한 기능의 스크립트가 함께 제공됩니다.

**설정 스크립트가 완료되면, 다양한 타겟을 퍼징하는 데 몇 분밖에 걸리지 않습니다.**

## 작동 방식

**Litefuzz는 로컬, 클라이언트, 서버의 세 가지 모드를 지원합니다.**

로컬 모드는 로컬 바이너리를 대상으로 하며, Linux/Mac에서는 하위 프로세스로 실행되어 GDB 및 LLDB 트라이지(triage) 지원을 각각 크래시 시에 제공하고, Windows에서는 [WinAppDbg](https://github.com/MarioVilas/winappdbg)를 통해 제공됩니다. 크래시는 로컬 크래시 디렉터리에 기록되며, 읽기/쓰기 AV 또는 SIGABRT/SIGSEGV와 같은 결함 유형과 파일 해시별로 정렬됩니다. 모든 고유 크래시는 퍼징 중에 트라이지되며, 이 데이터와 타겟 출력(가능한 경우)도 캡처되어 동일한 디렉터리에 아티팩트로 배치됩니다. 또한 `--replay` 옵션과 크래시 파일을 제공하여 크래시를 재현할 수도 있습니다. `local` 클라이언트 모드에서는 입력 디렉터리에 서버 인사말, 응답 또는 클라이언트가 서버에 연결할 때 기대하는 데이터가 포함되어야 합니다.

현재로서는 복잡한 세션 지원 없이 네트워크 퍼징을 위한 하나의 '샷'만 구현되어 있습니다. 클라이언트는 명령줄을 통해 실행되며, 파일 퍼징과 동일한 방식으로 디버깅됩니다. 이 시나리오를 지원하기 위해 리스너가 설정됩니다. 느리고 거의 수동 노동에 가깝지만 작동합니다. 크래시가 감지되면 gdb에서 재현되어 트라이지 세부 정보를 얻습니다. `remote` 클라이언트 모드에서는 로컬 디버깅/크래시 트라이지가 없다는 점을 제외하고 동일하게 작동합니다. *로컬* 서버 모드는 로컬 클라이언트 모드와 유사하며, `remote` 서버 모드는 지정된 타겟에 연결하고 사용자가 입력으로 지정한 변이된 샘플 클라이언트 데이터를 보내지만, '여전히 연결할 수 있는가, 그렇지 않으면 마지막 데이터에서 크래시가 발생했을 가능성이 높다'는 간단한 트라이지만 제공합니다.

처음부터 작성된 몇 가지 변이 함수가 있으며, 대부분 `-i` 플래그로 지정된 입력의 무작위 선택으로 무작위 변이를 수행합니다. 파일 퍼징의 경우 로컬 모드를 선택하고 타겟 명령줄에 앱이 파싱할 파일 이름을 나타내는 FUZZ를 전달합니다(예: `tcpdump -r FUZZ`). 또한 변이할 '좋은 파일'의 입력 디렉터리를 제공합니다. 네트워크 클라이언트 퍼징의 경우 로컬 퍼징과 유사하지만, `-a`를 통해 연결 세부 정보도 제공합니다. 서버를 퍼징하려면 서버 모드를 선택하고 클라이언트와 마찬가지로 `protocol://address:port`를 제공합니다.

타겟이 데이터를 소비하고 종료하는 속도(대부분의 CLI 애플리케이션의 경우)만큼 빠르게 퍼징하거나, 로컬 실행 또는 네트워크 연결 시간이 초과되기 전에 사용자가 결정한 시간 동안 퍼징하므로 훨씬 느릴 수 있습니다. 여기에는 화려한 exec 또는 커널 트릭이 없습니다. 물론 입력을 파싱하고 빠르게 종료하는 하네스를 작성하여 타겟의 특정 부분을 커버하는 것도 도움이 됩니다. 그러나 그 정도로 타겟에 근접할 수 있다면, [영구 모드](https://lcamtuf.blogspot.com/2015/06/new-in-afl-persistent-mode.html)나 다른 퍼저가 제공하는 유사한 기능을 사용하는 것이 더 나을 것입니다.

간단히 말해서...

### 기능
- linux, windows, mac에서 실행되며 py2/py3 지원
- 파일/stdin에서 읽는 CLI/GUI 바이너리 퍼징
- 네트워크 클라이언트 및 서버 퍼징 (오픈 소스 또는 독점, 로컬 또는 원격 디버깅 가능)
- 크래시의 diff, 최소화, 재현, 정렬 및 자동 트라이지
- TLS 지원, golang 바이너리 퍼징 및 Mac용 일부 추가 기능 등 기타
- 다양한 내장 변이기 + pyradamsa (Linux)로 입력 변이

### 하지 않는 것
- 네이티브 계측
- 동시 작업으로 확장
- 복잡한 세션 퍼징
- 원격 클라이언트 및 서버 모니터링 (연결과 같은 기본 검사만)

## 지원

주로 **Ubuntu Linux 20.04** (22.04 및 21.04는 가볍게 테스트), **Windows 10** 및 **Mac OS 11** (12는 가볍게 테스트)에서 테스트되었습니다. 퍼저와 설정 스크립트는 이러한 운영 체제의 약간 더 오래되었거나 최신 버전에서도 작동할 수 있지만, 대부분의 연구, 테스트 및 개발은 이러한 환경에서 수행되었습니다. Python3가 지원되며, [WinAppDbg](https://github.com/MarioVilas/winappdbg)를 통해 Windows에서 퍼징하는 데 필요하므로 Python2와도 호환되도록 코드를 작성하려고 노력했습니다.

플랫폼 테스트는 주로 Intel 기반 하드웨어에서 수행되었지만, Apple M1 플랫폼에서도 대부분 작동하는 것으로 보입니다 (주목할 만한 예외는 Linux에서 GDB용 exploitable 플러그인이 지원되지 않을 가능성이 있으며, Pyradamsa도 마찬가지입니다). 또한 setup/에 설정 스크립트가 있어 대부분의 작업과 종속성 설치를 자동화합니다. 일반적으로 각 플랫폼에서 네이티브 바이너리(C/C++로 컴파일된 경우가 많음)를 퍼징할 수 있지만, Golang 바이너리의 크래시도 포착할 수 있습니다 (실험적).

### 파이썬 버전

Python3는 Linux 및 Mac에서 지원되며, Python2는 Windows에서 필요합니다.

왜 Linux와 Mac에서는 Py3인가? Pyautogui, Pyradamsa (Linux 전용), Mac에서 더 나은 소켓 지원.

왜 Windows에서는 Py2인가? Winappdbg는 Py2가 필요합니다.

### 리눅스

디버깅에는 GDB를, 크래시 트라이지에는 [exploitable](https://github.com/jfoote/exploitable)을 사용합니다. 오픈 소스인 경우 [샌타이저(sanitizers)](https://fuzzing-project.org/tutorial2.html) 등으로 타겟을 빌드하고 계측할 수 있으며, 그렇지 않으면 실행 시 로드할 수 있는 [메모리 디버거](https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Heap_corruption)가 있습니다.

이 설치 과정과 파이썬 종속성 및 기타 유용한 항목은 [setup/linux.sh](https://github.com/sec-tools/litefuzz/blob/HEAD/setup/linux.sh)로 자동화되었습니다. 권장 OS는 Ubuntu 20.04이며, 대부분의 테스트가 이 환경에서 이루어졌습니다.

### 맥

OS X에서는 gdb 대신 lldb를 디버깅에 사용합니다. XCode 명령줄 도구에 포함되어 있기 때문입니다. 관리자이거나 개발자 그룹에 속해 있으면 lldb를 사용할 수 있어야 하지만, 이 동작은 환경과 버전에 따라 다를 수 있으며, 다른 방법이 없으면 sudo 권한으로 실행해야 할 수도 있습니다.

수동으로 해야 할 한 가지는 SIP를 끄는 것입니다 (복구 모드에서 cmd+R을 통해 또는 vmware fusion 해킹 사용). 그렇지 않으면 Tim Apple의 OS에서 퍼징할 때 자동 트라이지가 실패합니다.

거의 모든 설정이 [setup/mac.sh](https://github.com/sec-tools/litefuzz/blob/HEAD/setup/mac.sh) 스크립트로 자동화되어 있으므로, 빠른 시작을 위해 실행하기만 하면 됩니다.

### 윈도우

Windows에서는 디버깅에 [WinAppDbg](https://github.com/MarioVilas/winappdbg)를 사용하며, stdin 퍼징이 지원되지 않는다는 약간의 주의사항이 있습니다.

다른 운영 체제의 자동 설정과 마찬가지로, chocolatey가 Windows에서 패키지 설치를 자동화하는 데 도움을 줍니다. litefuzz 루트 디렉터리에서 [setup/windows.bat](https://github.com/sec-tools/litefuzz/blob/HEAD/setup/windows.bat)를 관리자 권한으로 실행하여 설치를 자동화하십시오. 디버깅 도구 및 기타 종속성을 설치하여 원활하게 실행되도록 합니다.

### 타겟

다음은 테스트되었고 일반적으로 지원되는 타겟 유형 목록입니다.

* 파일 형식이나 stdin을 파싱하는 로컬 CLI/GUI 앱
  - 디버그 지원
* 서버 응답을 파싱하는 로컬 CLI/GUI 네트워크 클라이언트
  - CLI에 대한 디버그 지원
  - GUI에 대한 제한된 디버그 지원
* 클라이언트 요청을 파싱하는 로컬 CLI 네트워크 서버
  - 디버그 지원 (주의: 독립 실행형 실행 파일로 실행 가능해야 함, 그렇지 않으면 *원격*으로 처리 가능)
* 클라이언트 요청을 파싱하는 로컬 GUI 네트워크 서버
  - 이론적으로 지원, 테스트되지 않음
* 서버 응답을 파싱하는 원격 CLI/GUI 네트워크 클라이언트
  - 디버그 지원 없음
* 클라이언트 요청을 파싱하는 원격 CLI/GUI 네트워크 서버
  - 디버그 지원 없음
  - Mac에서 `attach` 또는 `reportcrash` 기능을 사용하는 경우 예외

다시 말하지만, 퍼저는 Linux, Mac 및 Windows에서 로컬 앱, 클라이언트 및 서버를 실행하고 지원할 수 있으며, 물론 타겟 플랫폼과 무관하게 원격 대상을 퍼징할 수 있습니다.

### 트라이지

* 파일 형식이나 stdin을 파싱하는 로컬 CLI/GUI 앱
  - 앱 실행, 신호 포착, 크래셔와 함께 디버거 내에서 다시 실행하여 재현
* 서버 응답을 파싱하는 로컬 CLI/GUI 네트워크 클라이언트
  - 앱 실행, 신호 포착, 크래셔와 함께 디버거 내에서 다시 실행하여 재현
* 클라이언트 요청을 파싱하는 로컬 GUI/CLI 네트워크 서버
  - 디버거에서 앱 실행, 신호 포착, 크래셔와 함께 디버거 내에서 다시 실행하여 재현
* 서버 응답을 파싱하는 원격 CLI/GUI 네트워크 클라이언트
  - 가시성 없음, 원격 측에서 크래시 수집
  - 트라이지를 지원하기 위해 수동으로 스크립트 작성 가능
* 클라이언트 요청을 파싱하는 원격 CLI/GUI 네트워크 서버
  - 가시성 없음, 원격 측에서 크래시 수집
  - 트라이지를 지원하기 위해 수동으로 스크립트 작성 가능
  - Mac의 예외는 `attach` 및 `reportcrash` 옵션으로, 일부 트라이지 기능을 활성화하는 데 사용 가능

## 시작하기

대부분의 플랫폼별 설정은 [setup](https://github.com/sec-tools/litefuzz/blob/main/README.md#setup) 디렉터리의 스크립트로 자동화되어 있습니다.

litefuzz 루트에서 해당 스크립트를 실행하기만 하면 많은 시간을 절약하고 자동화된 배포에 필요한 일부를 활성화하는 데 도움이 됩니다. 깨끗한 OS 및 퍼징 환경을 설정하기 위해 VM을 사용하는 것이 유용하며, 무엇보다 스냅샷 기능이 유용합니다.

자세한 내용은 [INSTALL.md](https://github.com/sec-tools/litefuzz/blob/main/INSTALL.md)를 참조하십시오.

**설치 후, 빠른 실행을 위해 초기 섹션의 latex2rtf 예제 퍼징을 참조하거나 이 README에 자세히 설명된 모든 명령줄 옵션 및 추가 예제를 살펴보십시오.**

### 도커

로컬에 종속성을 설치하지 않고 `Dockerfile`을 사용하여 Docker로 litefuzz를 실행할 수 있습니다. 이는 빠른 테스트나 시스템에 종속성 설치를 피하려는 경우 특히 유용합니다.

Dockerfile은 다음 두 가지 방식으로 작동합니다.
- **리포지토리 내에서** - 로컬 파일 사용 (더 빠르며, 로컬 변경 사항 포함)
- **독립 실행형** - 모든 디렉터리에서 빌드 가능 (GitHub에서 클론)```bash
# Build the Docker image (from any directory with Dockerfile)
docker build -t litefuzz:latest .

# Run litefuzz
docker run --rm litefuzz:latest python3 litefuzz.py --help

docker 예제

리포지토리의 내장 입력은 /litefuzz/input/tex에서 사용할 수 있습니다. - 입력을 마운트할 필요가 없습니다:```bash

Create crashes directory

mkdir -p crashes

Run fuzzing with example input (1000 iterations with heap debugging)

docker run --rm
-v $(pwd)/crashes:/tmp/crashes
litefuzz:latest
python3 litefuzz.py -l -c "latex2rtf FUZZ" -i /litefuzz/input/tex -o /tmp/crashes -n 1000 -z

root@kitploit:~
이것은 다음을 수행합니다:
- latex2rtf를 1000회 반복으로 퍼징합니다
- 힙 디버깅 사용 (`-z` 플래그)
- 크래시를 호스트의 `./crashes` 디렉토리에 저장합니다
- 저장소의 `/litefuzz/input/tex`에 있는 내장 입력 파일 사용

호스트에서 자신의 입력 파일을 사용하려면:```bash
# Create input directory with your test files
mkdir -p input/tex crashes
# Add your test files to input/tex/
cp your-test.tex input/tex/

# Run fuzzing with your input files
docker run --rm \
  -v $(pwd)/input:/litefuzz/input \
  -v $(pwd)/crashes:/tmp/crashes \
  litefuzz:latest \
  python3 litefuzz.py -l -c "latex2rtf FUZZ" -i /litefuzz/input/tex -o /tmp/crashes -n 1000 -z

중요: 사용할 파일이 있을 때만 입력을 마운트하세요. 빈 input/ 디렉토리를 마운트하면 내장 입력을 덮어쓰고 오류가 발생합니다.

참고사항

  • 내장 입력 사용 가능 - 리포지토리의 입력은 /litefuzz/input/tex에 있습니다 (마운트 불필요)
  • -v로 볼륨을 마운트하여 충돌 출력을 유지하고 입력 파일에 접근하세요
  • 네트워크 퍼징을 위해 --network host를 사용하여 로컬호스트 서비스에 접근하세요
  • 이미지에는 모든 종속성과 테스트 앱이 미리 빌드되어 있습니다
  • pyradamsa 돌연변이 도구는 선택 사항이며 사용하지 못할 수 있습니다 (Linux 전용 기능)
  • 이미지는 Ubuntu 24.04를 기반으로 합니다
  • 표준 퍼징에 SYS_PTRACE가 필요하지 않습니다 - GDB 충돌 분류는 이것 없이도 작동합니다
  • 고급 디버깅(프로세스에 연결)을 위해서는 --cap-add=SYS_PTRACE가 필요할 수 있습니다

테스트

단위 테스트

Litefuzz에 대한 일부 커버리지를 얻기 위한 몇 가지 간단한 단위 및 기능 테스트가 있지만, 완전한 것을 의도하지는 않습니다.``` py2> pytest py3> python3 -m pytest

root@kitploit:~
메인 디렉토리에서 `test_litefuzz.py`에 대한 pytest를 실행하고, 테스트 실행이 완료되면 PASS/FAIL 결과를 제공합니다.

#### 충돌 앱 테스트
다양한 플랫폼에서 충돌 및 분류 기능을 테스트하기 위한 버그가 있는 앱의 몇 가지 예제는 `test` 폴더에서 찾을 수 있습니다.

- (a) 널 포인터 역참조
- (b) 0으로 나누기
- (c) 힙 오버플로우
- (d-gui) GUI의 포맷 문자열 버그
- (e) 클라이언트의 버퍼 오버플로우
- (f) 서버의 버퍼 오버플로우

이들은 설정 중에 자동으로 빌드되며, 명령줄, 디버거에서 실행하거나 퍼징 대상으로 테스트하는 데 사용할 수 있습니다.

**Windows 명령줄에서 실행하는 경우, `이벤트 뷰어 -> Windows 로그 -> 응용 프로그램`에서 충돌을 확인하세요.**

## 옵션
다양한 대상 시나리오를 활용할 수 있는 많은 옵션과 기능이 있습니다. 다음은 이를 사용하는 방법을 이해하는 데 도움이 되는 간단한 설명과 몇 가지 예제입니다.

### 충돌 디렉토리
`-o`를 사용하면 기본값(로컬 경로의 crashes/)이 아닌 다른 충돌 디렉토리를 지정할 수 있습니다. 이를 사용하여 동시에 여러 앱에 대한 여러 퍼징 실행의 충돌 폴더를 관리할 수 있습니다.

### 절연 모드
`-u`는 대상 애플리케이션을 일반 퍼징 프로세스(예: 실행, 반복적인 패킷 전송 및 충돌 확인)로부터 격리합니다. 대신, 이 모드는 대화형 클라이언트 애플리케이션(예: Postman)을 위해 만들어졌으며, 애플리케이션 내에서 스크립트를 작성하여 클라이언트 퍼징을 위한 연결을 반복할 수 있습니다. 대상은 디버거 내에서 실행되고, 퍼저는 일시 중지되어 사용자가 몇 개의 버튼을 클릭하거나 대상의 구성을 자동 실행으로 설정할 시간을 갖습니다. 사용자가 재개하면 이제 대화형 네트워크 클라이언트를 퍼징하고 있습니다.

`litefuzz -lk -c "/snap/postman/140/usr/share/Postman/_Postman" -i input/http_responses -a tcp://localhost:8080 -u -n 100000 -z`

절연 모드 + 새로고침은 대화형 클라이언트에 사용할 수 있습니다. 예를 들어, 디버거에서 FileZilla를 실행하되, 각 새 반복마다 서버에 다시 연결하도록 F5를 계속 누릅니다. 또한 로컬 CLI/GUI 서버 퍼징은 디버거 내에서 한 번만 시작 및 실행되어 프로세스를 약간 더 효율적으로 만듭니다.

`--key`를 사용하면 대화형 대상을 퍼징하는 동안 키를 보낼 수 있습니다. 예를 들어, F5로 '연결 새로고침'을 보내 FileZilla의 FTP 서버 응답 구문 분석을 퍼징할 수 있습니다.

`litefuzz -lk -c "filezilla" -a tcp://localhost:2121 -i input/ftp/filezilla -u -pp --key "F5" -n 100 -z glibc`

참고: 절연 모드는 Linux에서만 테스트되었으며 Windows에서는 지원되지 않습니다.

### 타임아웃
`-x secs`를 사용하여 타임아웃을 지정할 수 있습니다. 실제로는 CLI 대상의 경우 '반복 사이의 대략적인 시간'에 가깝고, GUI의 경우 실제 타임아웃입니다.

### 뮤테이터
`--mutator N`은 퍼징에 사용할 뮤테이터를 지정합니다. 옵션이 제공되지 않으면, 각 퍼징 반복마다 사용 가능한 뮤테이터 목록에서 무작위로 선택됩니다.

이 뮤테이터들은 (물론 Radamsa를 제외하고) 처음부터 작성되었습니다. 수백만 번의 반복 동안 광범위하게 테스트되었고 상당히 잘 견뎌냈지만, 때때로 미묘한 버그가 있을 수 있습니다. 그러나 일반적으로 이는 기능에 영향을 미치지 않습니다.```
FLIP_MUTATOR = 1
HIGHLOW_MUTATOR = 2
INSERT_MUTATOR = 3
REMOVE_MUTATOR = 4
CARVE_MUTATOR = 5
OVERWRITE_MUTATOR = 6
RADAMSA_MUTATOR = 7

참고: Radamsa 뮤테이터는 Linux(+ Py3)에서만 사용할 수 있습니다.

ReportCrash

--reportcrash는 Mac 전용입니다. 기본 트라이지 시스템 대신, 퍼저가 대상 프로세스의 크래시 로그를 위해 ReportCrash 디렉토리를 모니터링하도록 지시합니다. ReportCrash는 OS X에서 활성화되어 있어야 합니다(기본적으로 활성화되어 있지만, 일반적인 퍼징에서는 보통 비활성화됩니다). 이 기능은 디버거에서 대상을 실행하여 자체 크래시 로그를 생성 및 분류할 수 없지만, 운영 체제의 핵심 기능을 활용하여 가시성을 확보할 수 있는 시나리오에서 유용합니다.

참고: 이 기능은 MacOS 시스템 코어 내에서 직접 제어할 수 없는 여러 움직이는 부품과 구성 요소에 의존하므로 실험적 기능으로 간주하십시오. ReportCrash는 언로드 및 재로드를 시도한 후에도 퍼징을 잠시 수행하면 결국 제대로 작동하고 응답하지 않을 수 있으므로, 머신을 재부팅하거나 스냅샷을 재설정하여 정상 상태로 되돌릴 수 있습니다.``` sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist sudo launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist

root@kitploit:~
### pause
Ctrl+c를 눌러 퍼징 프로세스를 일시 중지합니다. 재개하려면 `y` 또는 `n`을 선택하여 중지합니다. 이 기능은 플랫폼 간에 잘 작동하지만, GUI 앱을 퍼징할 때는 덜 안정적일 수 있습니다.

### reusing crashes for variant finding

`-e`는 재사용 모드를 활성화합니다. 즉, 퍼징 실행 중에 충돌이 발견되면 해당 충돌이 두 번째 퍼징 라운드의 입력으로 사용되어 더 많은 버그를 찾아내는 데 도움이 됩니다. `-z`와 결합하면 `-ez` 버그를 잡을 수 있습니다! Da-duph.

다음 예제는 100000번의 반복으로 antiword를 퍼징한 후, 동일한 반복 횟수와 옵션으로 또 다른 실행을 시작하여 충돌을 입력으로 재사용하여 더 많은 버그를 찾아내는 것입니다.

`litefuzz -l -c "antiword FUZZ" -i docs -n 100000 -ez`

(또는 충돌을 수동으로 입력 디렉터리에 복사하여 재사용 실행의 반복 횟수를 직접 제어할 수 있습니다.)

`litefuzz -l -c "antiword FUZZ" -i docs-crashes -n 500000 -z`

참고: 이 모드는 로컬 앱에서만 지원됩니다.

### memory debugging helpers
`-z`는 Linux에서 Electric Fence(또는 대체로 glib malloc 디버깅)를 활성화하고, Mac에서는 Guard Malloc, Windows에서는 PageHeap을 활성화합니다. 또한 `-zz`를 사용하면 애플리케이션에 대해 PageHeap을 활성화한 후 비활성화할 수 있습니다. 퍼저를 시작하지 않고 켜기/끄기만 하려면 `-i` 플래그를 생략하면 됩니다. Windows 설정 중에는 [gsudo](https://github.com/gerardog/gsudo)가 설치되며, 명령줄에서 상승된 명령을 실행하는 데 사용할 수 있습니다(예: 대상에 대해 PageHeap 켜기).

`sudo litefuzz -l -c "notepad FUZZ" -i texts/files -z`

`sudo litefuzz -l -c "notepad FUZZ" -zz`

Linux에서는 특정 도우미를 선택할 수 있습니다. 예를 들어, 기본값으로 glib malloc을 사용하는 대신 선택할 수 있습니다.

`litefuzz -l -c "geany FUZZ" -i texts/codes -z glibc`

기본 Electric Fence malloc 디버거는 훌륭하지만 모든 대상에서 작동하지는 않습니다. EF로 대상을 테스트하고 충돌이 발생하면 대신 glibc 도우미를 선택할 수 있습니다.

### checking live target output
Linux 또는 Mac에서 로컬 앱을 퍼징하는 경우 `cat /tmp/litefuzz/RUN_ID/fuzz.out`을 사용하여 대상의 최신 stdout을 확인할 수 있습니다. `RUN_ID`는 퍼징이 시작될 때 STATS 정보 영역에 표시됩니다. 충돌이 발생하면 stdout도 충돌 디렉터리에 `.out` 파일로 캡처됩니다. 전역 stdout/stderr는 모든 퍼징 대상에 대해 `/tmp/litefuzz/out`으로도 전송되며, 디버깅 목적에 사용됩니다. 단, insulated 또는 로컬 서버 모드의 경우 디버거 출력은 `/tmp/litefuzz/RUN_ID/out`으로 전송됩니다.

Winappdbg는 대상의 stdout 캡처를 기본적으로 지원하지 않으므로(AFAIK) 이 아티팩트는 Windows에서 사용할 수 없습니다.

### client and server modes
서버가 바이너리를 실행하여(일부 플래그 및 구성 포함 또는 미포함) 로컬에서 실행될 수 있다면, `-c`로 명령줄을 전달하고 시작, 퍼징, 종료가 각 반복마다 새롭게 실행됩니다. 여기서 아이디어는 속도를 희생하여 대상의 메모리가 '특정 상태'에 있을 때만 트리거되는 성가신 버그를 피하는 능력을 얻는 것입니다. 이는 위양성(false positive)으로 이어질 수 있습니다. 로컬 네트워크 클라이언트 퍼징도 마찬가지입니다. 또한 TLS 연결을 지원하며, 인증서를 즉석에서 생성합니다(사용자가 필요한 서버를 퍼징할 때 클라이언트 인증서를 제공하거나 인증서 자체를 퍼징하는 것도 다른 아이디어입니다).

Litefuzz는 원격 클라이언트와 서버를 퍼징할 때 디버깅 지원을 제공하지 않으므로, 원격 측 설정은 사용자에게 달려 있습니다. 서버의 경우 단순히 서버가 응답을 중단했는지 확인하고 이전 페이로드를 크래셔(crasher)로 기록합니다. 이는 TCP 연결에서는 잘 작동하지만 UDP 서비스에서는 이러한 이점이 없으므로 원격 서버 모니터링은 ReportCrash 기능(Mac에서 사용 가능), 대상 디버거에서 실행(로컬 서버 모드 또는 수동으로) 또는 특정 대상에 맞게 작성된 맞춤 지원 스크립트를 통해 이루어집니다. 또한 일부 서버는 충돌 후 자동으로 다시 시작되거나 복구될 수 있지만, 로그나 파일 시스템의 다른 아티팩트에서 그 증거를 찾을 수 있으며, 이는 특정 대상에 대해 작성된 지원 스크립트로 파싱할 수 있습니다.

### local network examples

`litefuzz -lk -c "wget http://localhost:8080" -a tcp://localhost:8080 -i input/http -z`

`litefuzz -lk -c "curl -k https://localhost:8080" -a tcp://localhost:8080 -i input/http -z`

`litefuzz -lk -c "curl -k https://localhost:8080" -a tcp://localhost:8080 -i input/http -o crashes/curl --tls -n 100000 -z`

(Wireshark를 열고 응답을 캡처한 후, 
d, 오른쪽 클릭 Simple Network Management Protocol -> Export Packet Bytes -> resp.bin)

`litefuzz -lk -c "snmpwalk -v 2c -c public localhost:1616 1.3.6.1.2.1.1.1" -a udp://localhost:1616 -i input/snmp/resp.bin -n 1 -d -x 3`

`litefuzz -ls -c "./sc_serv shoutcast.conf" -a localhost:8000 -i input/shouts -z`

`litefuzz -ls -c "snmpd" -i input/snmp -a udp://localhost:161 -z`

**quick notes**
- UDP 소켓은 Mac + Py2에서 약간 이상하게 동작할 수 있으므로 Mac + Py3만 테스트 및 지원됩니다.
- Windows에서 로컬 네트워크 클라이언트 퍼징은 버그가 있을 수 있으며 현재 실험적 기능으로 간주되어야 합니다.

### remote network examples

원격 클라이언트와 서버를 퍼징하는 것은 조금 더 까다롭습니다. 로컬 디버깅이 없고 네트워크를 통한 두 당사자 간의 상호 작용 중단을 감지하여 충돌을 포착해야 합니다. 또한 반대쪽에서 무슨 일이 일어나고 있는지 알 수 없으므로, 클라이언트나 서버가 응답을 중단하면 퍼징이 종료되며, 사용자가 원격 측에서 이 프로세스를 관리하는 스크립트를 설정하지 않은 경우 클라이언트나 서버가 정상(충돌하지 않은) 상태로 복원된 후 수동으로 다시 시작해야 합니다.

UDP는 이를 더욱 복잡하게 만듭니다. UDP 포트에서 수신 중인 서비스가 있는지 확인하기 위해 테스트 패킷을 보내더라도 응답이 보장되지는 않습니다. 따라서 원격으로 네트워크 클라이언트와 서버를 퍼징하는 것은 가능하지만 가시성에 대한 트레이드오프가 있습니다.

#### client

`while :; do echo "user test\rpass test\rls\rbye\r" | ftp localhost 2121; sleep 1; done`

`litefuzz -k -i input/ftp/test -a tcp://localhost:2121 -pp -n 100`

클라이언트 모드는 여기서 더 까다롭습니다. 클라이언트가 실제로 충돌하여 재연결되지 않는 것인지, 아니면 send/recv 동작이 맞지 않는 것인지 판단하기 어렵기 때문입니다. 각 클라이언트는 연결을 원하는 대로 처리할 수 있습니다. 또한 이는 단지 예시일 뿐이며, 원격 클라이언트 퍼징은 본질적으로 까다롭고 다소 실험적으로 간주되어야 합니다.

#### server

로컬 또는 원격으로 서버를 퍼징할 때의 장단점은 두 옵션을 모두 사용할 수 있을 때 대상을 어떻게 접근할지 결정하는 데 도움이 될 수 있습니다.

기본적으로 디버거에서 서버를 퍼징하는 것은 느리지만 자동 분류를 통해 충돌 로그를 얻을 수 있습니다. 반면에 원격 모드(로컬호스트를 가리키는 경우라도)로 서버를 퍼징하는 것은 평균적으로 훨씬 빠르지만 높은 가시성과 디버거 기반 분류 기능을 잃게 됩니다. 그러나 각 충돌 후 서버가 종료되기 전에 수동으로 다시 시작할 시간을 제공합니다(TCP 서버만 해당, UDP 기반 서버는 지원되지 않습니다).

**Shoutcast**

`./sc_serv ...`

`litefuzz -s -a localhost:8000 -i input/shouts -n 10000`

**SSHesame**

`sshesame`

`litefuzz -s -a tcp://target:2022 -i input/ssh-server -p -n 1000000 -x 0.05`

**FTP**

`litefuzz -s -a tcp://target:21 -i input/ftp/req.txt -pp -n 1000`

**DNS**

`coredns -dns.port 10000`

`litefuzz -ls -c "coredns -dns.port 10000" -a udp://localhost:10000 -i dns-req/1.bin -o crashes/coredns -n 10000`

or

`litefuzz -s -a udp://localhost:10000 -i dns-req/1.bin -o crashes/coredns -n 10000`

##### TLS

`litefuzz -s -a tcp://hostname:8080 -i input/http --tls -n 10000````
...
@ 48/10000 (1 crashes, 0 duplicates, ~7:13:18 remaining)

[!] check target, sleeping for 60 seconds before attempting to continue fuzzing...

참고: 기본 원격 서버 모드는 퍼징 반복 사이에 지연 시간을 두어 퍼징 세션을 안정적으로 실행할 수 있지만 속도가 상당히 느립니다. 이것이 안전한 기본값이지만, 대상이 패킷을 매우 빠르게 처리할 수 있는 경우 -x를 사용하여 세션 간 매우 짧은 타임아웃을 설정할 수 있습니다 (위에 표시된 대로). 비공식적으로 "2fast2furious" 모드라고 합니다.

세션 기반 프로토콜 (FTP 또는 SSH 등)에 대한 자세한 내용은 Multiple 모드를 참조하십시오.

다중 데이터 교환 모드

-p는 다중 바이너리 데이터 모드로, 순차적인 입력을 제공할 수 있습니다. 예를 들어, 세션의 각 패킷을 퍼징하기 위해 "1", "2", "3" 등의 파일이 포함된 input/ssh 디렉토리가 있습니다. 이는 SSH 클라이언트와 같은 바이너리 기반 프로토콜 구현을 퍼징할 수 있도록 설계되었습니다.

ls input/ssh 1 2 3 4

`xxd input/ssh/2 | head```` 00000000: 0000 041c 0a14 56ff 1297 dcf4 672d d5c9 ......V.....g-.. 00000010: d0ab a781 dfcb 0000 00e6 6375 7276 6532 ..........curve2 00000020: 3535 3139 2d73 6861 3235 362c 6375 7276 5519-sha256,curv 00000030: 6532 3535 3139 2d73 6861 3235 3640 6c69 e25519-sha256@li 00000040: 6273 7368 2e6f 7267 2c65 6364 682d 7368 bssh.org,ecdh-sh 00000050: 6132 2d6e 6973 7470 3235 362c 6563 6468 a2-nistp256,ecdh 00000060: 2d73 6861 322d 6e69 7374 7033 3834 2c65 -sha2-nistp384,e 00000070: 6364 682d 7368 6132 2d6e 6973 7470 3532 cdh-sha2-nistp52 00000080: 312c 6469 6666 6965 2d68 656c 6c6d 616e 1,diffie-hellman 00000090: 2d67 726f 7570 2d65 7863 6861 6e67 652d -group-exchange-

root@kitploit:~
각 패킷은 배열로 소비되며, 무작위 인덱스가 변형되어 대상에 재전송되어 퍼징됩니다.

`litefuzz -lk -c "ssh -T test@localhost -p 2222" -a tcp://localhost:2222 -i input/ssh -o crashes/ssh -p -n 250000 -z glibc`

그리고 최신 반복에 대한 대상의 출력을 확인할 수 있습니다.```
cat /tmp/litefuzz/out
kex_input_kexinit: discard proposal: string is too large
ssh_dispatch_run_fatal: Connection to 127.0.0.1 port 2222: string is too large

... and others like

ssh_dispatch_run_fatal: Connection to 127.0.0.1 port 2222: unknown or unsupported key type

ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Host key verification failed.

Bad packet length 1869636974.
ssh_dispatch_run_fatal: Connection to 127.0.0.1 port 2222: message authentication code incorrect

-pp는 퍼저가 입력에서 줄 바꿈을 확인하도록 요청하며, 줄 바꿈이 감지되면 이를 여러 요청/응답으로 처리합니다. 이는 주로 문자열 기반 프로토콜 구현(예: ftp clients)을 위한 간단한 네트워크 프로토콜 퍼징에 유용합니다.``` cat input/ftp/test 220 ProFTPD Server (Debian) [::ffff:localhost] 331 Password required for user 230 User user logged in 215 UNIX Type: L8 221 Goodbye

root@kitploit:~
퍼저는 각 줄을 자체 FTP 응답으로 분할하여 클라이언트의 세션 처리 방식을 퍼징합니다. 하지만 클라이언트가 "예의 바르게" 행동하거나 세션이 제대로 완료되지 않는 방식으로 동작하지 않을 수도 있으므로, Wireshark를 실행하면서 세션 테스트 케이스를 약간의 시행착오와 미세 조정을 통해 대상 간 상호작용의 차이를 이해하는 것이 도움이 될 수 있습니다.

`litefuzz -lk -c "ftp localhost 2121" -a tcp://localhost:2121 -i input/ftp -o crashes/ftp -n 100000 -pp -z`

이는 FileZilla와 같은 GUI 네트워크 대상을 격리하기 위해 *-u*와 결합할 수도 있습니다.

`litefuzz -lk -c "filezilla" -a tcp://localhost:2121 -i input/ftp.resp -n 100000 -u -pp -z glibc`

### 프로세스에 연결하기
대상이 연결 시 새 프로세스를 생성하는 경우, 서버에 연결이 설정된 후 연결할 프로세스의 이름(또는 pid)을 지정할 수 있습니다. 이는 예를 들어 launchd가 포트에서 수신 대기 중이고 클라이언트가 연결된 후에만 처리 프로세스를 시작하는 경우에 유용합니다. 이 기능은 로컬 퍼징과 원격 퍼징의 경계를 다소 모호하게 만듭니다. 기술적으로 퍼저는 원격 모드이지만 대상 주소를 localhost로 지정하고 프로세스에 연결하도록 요청하기 때문입니다.

`./litefuzz.py -s -a tcp://localhost:8080 -i input/shareserv -p --attach ShareServ -x 1 -n 100000`

참고: 현재 이 기능은 Mac(LLDB)과 네트워크 퍼징에서만 지원되지만, 구현된다면 Linux(GDB)에서도 잘 작동할 것입니다.

### 충돌 아티팩트
퍼징 도중 충돌이 발생하면 디버거에서 재생되어 디버그 아티팩트와 버킷 정보가 생성됩니다. 정보는 플랫폼에 따라 다르지만, 일반적으로 백트레이스, 레지스터 정보, `!exploitable` 유형 정보(사용 가능한 경우) 및 기타 기본 정보가 포함된 텍스트 파일이 생성됩니다.

**메모리 덤프**는 `--memdump`를 전달하여 Windows에서 활성화하거나 `--nomemdump`로 비활성화할 수 있습니다. 이는 `-z`와 `-zz`를 통해 malloc 디버거를 제어하는 방식과 유사합니다. 활성화된 경우 덤프는 콘솔 디버거(cdbg)에도 로드되며, `!analyze -v` 충돌 분석 출력이 추가 메모리 덤프 충돌 분석 로그에 캡처됩니다. Winappdbg에는 이미 초기 충돌 분석에서 얻을 수 있는 !exploitable 유형 분석이 있으므로, 여기서는 !analyze만 수행합니다.

`litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" --memdump`

또는 응용 프로그램에 대해 메모리 덤프를 비활성화하려면

`litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" --nomemdump`

자동 충돌 분류 외에도 바이너리/문자열 diff(적절한 경우)와 대상 stdout(플랫폼/대상에 따라 다름)도 생성되며, 물론 재현 파일도 함께 생성됩니다.

로컬 퍼징의 경우 아티팩트에는 일반적으로 diff, stdout(linux/mac 전용), 재현 파일, 충돌 로그 및 정보 파일이 포함됩니다.```
$ ls crashes/latex
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.diff
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.diffs
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.out
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.tex
PROBABLY_EXPLOITABLE_SIGSEGV_XXXX5556XXXX_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.txt

Windows에서 메모리 덤프가 활성화된 경우 덤프 파일이 생성되고 추가 triage 정보가 추가 충돌 분석 로그에 기록됩니다.``` C:\litefuzz\crashes> dir app.exe.14299_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.dmp app.exe.14299_YYYYa39f3fd719e170234435a1185ee9e596c54e79092c72ef241eb7a41cYYYY.log ....

root@kitploit:~
원격 퍼징의 경우 선택한 옵션에 따라 아티팩트가 다를 수 있지만, 종종 다음이 포함됩니다: diff, 재현 파일 및/또는 재현 파일 디렉터리(입력이 여러 패킷이 있는 세션인 경우), 이전 퍼징 반복 재현(원격 퍼징의 특성상 실제 크래셔일 때 버그를 잃지 않도록 방지), 크래시 로그 또는 간략한 정보 파일.```
ls crashes/serverd
REMOTE_SERVER_testbox.1_NNNN_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY
REMOTE_SERVER_testbox.1_NNNN_PREV_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY
UNKNOWN_XXXX2040YYYY_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY.diff
UNKNOWN_XXXX2040YYYY_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY.diffs
UNKNOWN_XXXX2040YYYY_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY.txt
UNKNOWN_XXXX2040YYYY_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY.zz

ls crashes/serverd/REMOTE_SERVER_localhost_NNNN_XXXX9c3f3660aaa76f70515f120298f581adfa9caa8dcaba0f25a2bc0b78YYYY
REMOTE_SERVER_testbox.1_NNNN_1.zz	REMOTE_SERVER_localhost_NNNN_2.zz
REMOTE_SERVER_testbox.1_NNNN_3.zz	REMOTE_SERVER_localhost_NNNN_4.zz

golang

보통 Golang 바이너리가 충돌할 때, 전통적인 SIGSEGV로 종료되지 않을 수 있습니다. 패닉 정보에서 그렇게 표시되더라도 실제로는 그렇지 않을 수 있습니다(Linux에서 테스트됨). 대신 반환 코드 2와 함께 충돌할 수 있습니다. 그래서 우리는 그것을 사용하는 것으로 가정하겠습니다 :)

이것이 어떻게 작동하는지와 관련 엣지 케이스에 대한 더 나은 설명이 있을 거라고 확신하지만, Linux에서 golang 바이너리의 충돌을 잡기 위해 --golang을 사용할 수 있습니다.

litefuzz -l -c "evernote2md FUZZ" -i input/enex -o crashes/evernote2md --golang -n 100000

repros

충돌 파일은 crashes/ 디렉토리(또는 -o 플래그로 지정된 위치)에 diff 및 충돌 정보와 함께 저장됩니다.

-r과 함께 적절한 대상 명령줄/주소 설정과 repro 파일(또는 디렉토리)을 전달하면 로컬 또는 원격에서 충돌을 재현하려고 시도합니다.

로컬 예제

litefuzz -l -c "latex2rtf FUZZ" -r crashes/latex2rtf/test.tex -z

로컬 네트워크 예제

./litefuzz -ls -c "./sc_serv shoutcast.conf" -a tcp://localhost:8000 -r crashes/crash.raw

원격 네트워크 예제

litefuzz -s -a tcp://host:8000 -r crashes/crash.raw

원격 네트워크 예제 (여러 패킷)

litefuzz -s -a tcp://localhost:22 -r repro/dir/here

remove file

일부 대상은 명령줄의 일부로 정적 출력 파일 위치를 요구하며, 해당 파일이 이미 존재하면 오류를 발생시킬 수 있습니다. --rmfile은 퍼징 중 이 문제를 해결하기 위한 옵션으로, 각 퍼징 반복 후 대상이 작동하는 방식의 일부로 생성된 파일을 제거합니다.

litefuzz -l -c "hdiutil makehybrid -o /tmp/test.iso -joliet -iso FUZZ" -i input/dmg --rmfile /tmp/test.iso -n 500000 -ez

minimization

충돌 파일을 최소화하는 것은 흥미로운 활동입니다. repro와 최소화된 버전을 비교하여 대상이 데이터를 어떻게 파싱하는지 추론할 수도 있습니다.

-m과 함께 대상 명령줄 또는 주소 설정과 repro 파일을 전달하면 여전히 대상을 충돌시키지만 더 작고 불필요한 바이트가 없는 최소화된 버전의 repro를 생성하려고 시도합니다. 이 최소화 과정에서 새로운 충돌을 발견할 수도 있습니다.

로컬 모드만 지원되지만, 여기에는 로컬 클라이언트 및 서버 모드도 포함되므로, 로컬에서 디버깅할 수 있는 한 네트워크 충돌도 최소화할 수 있습니다.

예를 들어, 이 요청은 원본 repro 파일입니다.``` GET /admin.cgi?pass=changeme&mode=debug&option=donotcrash HTTP/1.1 Host: localhost:8000 Connection: keep-alive Authorization: Basic YWRtaW46Y2hhbmdlbWU= Referer: http://localhost:8000/admin.cgi?mode=debug

root@kitploit:~
축소된 버전을 확인해 보세요.```
GET /admin.cgi?mode=debug&option=a
Authorization:s YWRtaW46Y2hhbmdlbWU
Referer:admin.cgi

이제 대상이 무엇을 찾고 있는지, 심지어 충돌의 근본 원인에 대해서도 몇 가지 추측을 할 수 있습니다.

  1. 요청이 가장 중요한 부분입니다.
  2. option=은 아마도 여러 가지 다른 값이 될 수 있습니다.
  3. Host 및 Connection 헤더는 필요하지 않습니다.
  4. Authorization 헤더 파싱은 두 번째 토큰만 찾으며, 명시적으로 Basic 인증을 제시하는지 여부는 중요하지 않습니다.
  5. Referer는 필요하지만, 호스트나 URL이 아닌 admin.cgi만 필요합니다.

다른 것은요? 보너스가 있습니다: Authorization 자격 증명이 올바르다면 유효한 비밀번호를 전달할 필요가 없으며, 그 반대도 마찬가지입니다. 최소화가 선형적이며 파일의 시작부터 끝까지 진행되므로, 우리는 이러한 방식으로 인증하는 재현(repro)만을 생성하게 되며, 실제로 두 가지 옵션이 있다는 사실을 여전히 발견하게 됩니다!

-mm은 슈퍼민(supermin) 모드를 활성화합니다. 이 모드는 더 느리지만, 더 이상 제거할 불필요한 바이트가 없을 때까지 반복해서 최소화를 시도합니다.

재미삼아, 재현을 수정하고 supermin을 통해 실행하여 최대한 최소화된 버전을 얻을 수 있습니다.``` GET /admin.cgi?pass=changeme&mode=debug&option=a Referer:admin.cgi

root@kitploit:~
**최소화 예제**

`litefuzz -l -c "latex2rtf FUZZ" -m test.tex -z`

`litefuzz -ls -c "./sc_serv shoutcast.conf" -a "tcp://localhost:8000" -m repro.http`

**supermin 예제**```
litefuzz -l -c "latex2rtf FUZZ" -mm crashes/latex2rtf/test.tex -z
...
[+] starting minimization

@ 582/582 (1 new crashes, 1145 -> 582 bytes, ~0:00:00 remaining)  

[+] reduced crash @ pc=55555556c141 -> pc=55555557c57d to 582 bytes

[+] supermin activated, continuing...

@ 299/299 (1 new crashes, 582 -> 300 bytes, ~0:00:00 remaining)

[+] reduced crash @ pc=55555557c57d to 300 bytes
...
[+] reduced crash @ pc=555555562170 to 17 bytes

@ 17/17 (2 new crashes, 17 -> 17 bytes, ~0:00:00 remaining)

[+] achieved maximum minimization @ 17 bytes (test.min.tex)

[RESULTS]
completed (17) iterations with 2 new crashes found

명령

--cmd는 사용자가 각 반복 후 실행할 명령을 지정할 수 있도록 합니다. 이는 시스템 리소스를 소비할 수 있는 특정 작업을 정리하는 데 사용할 수 있습니다.

litefuzz -l -c "/System/Library/CoreServices/DiskImageMounter.app/Contents/MacOS/DiskImageMounter FUZZ" -i input/dmg --cmd "umount /Volumes/test.dir" --click -x 5 -n 100000 -ez

예제

로컬 앱

빠른 미리보기```

litefuzz -l -c "latex2rtf FUZZ" -i input/tex -o crashes/latex2rtf -x 1 -n 100 --========================-- --======| litefuzz |======-- --========================--

[STATS] run id: 3516 cmdline: latex2rtf FUZZ crash dir: crashes/latex2rtf input dir: input/tex inputs: 4 iterations: 100 mutator: random(mutators)

@ 100/100 (1 crashes, 4 duplicates, ~0:00:00 remaining)

[RESULTS]

completed (100) iterations with (1) unique crashes and 4 dups

check crashes/latex2rtf dir for more details

root@kitploit:~
#### Ubuntu에서 파일 핸들러 열거```
$ cat /usr/share/applications/defaults.list
[Default Applications]
application/csv=libreoffice-calc.desktop
application/excel=libreoffice-calc.desktop
application/msexcel=libreoffice-calc.desktop
application/msword=libreoffice-writer.desktop
application/ogg=rhythmbox.desktop
application/oxps=org.gnome.Evince.desktop
application/postscript=org.gnome.Evince.desktop
....

로컬 tcpdump의 pcap 파싱 퍼징 (Linux)

litefuzz -l -c "tcpdump -r FUZZ" -i test-pcaps

Evice 문서 리더 퍼징 (Linux GUI)

litefuzz -l -c "evince FUZZ" -i input/oxps -x 1 -n 10000

antiword 퍼징 (옛날 앱이지만 좋은 테스트 앱 :) (Linux)

litefuzz -l -c "antiword FUZZ" -i input/doc -ez

참고: -z를 전달하여 Electric Fence를 활성화하거나(또는 glibc의 기능을 대체 사용) 힙 오류 검사를 수행할 수 있습니다(그리고 그렇게 하는 것이 좋습니다).

OS X에서 파일 핸들러 열거

swda는 Mac에서 파일 핸들러를 열거할 수 있습니다.``` $ ./swda getUTIs | grep -Ev "No application set" com.adobe.encapsulated-postscript /System/Applications/Preview.app com.adobe.flash.video /System/Applications/QuickTime Player.app com.adobe.pdf /System/Applications/Preview.app com.adobe.photoshop-image /System/Applications/Preview.app ....

root@kitploit:~
**fuzz gpg 복호화 (stdin 입력, 힙 오류 검사 포함)** (Mac)

`litefuzz -l -c "gpg --decrypt" -i test-gpg -o crashes-gpg -z`

**fuzz Books 앱** (Mac GUI)

`litefuzz -l -c "/System/Applications/Books.app/Contents/MacOS/Books FUZZ" -i test-epub -t "/Users/test/Library/Containers/com.apple.iBooksX/Data" -x 8 -n 100000 -z`

참고: `-z`는 미묘한 힙 손상 버그를 탐지하기 위해 [Guard Malloc](https://www.manpagez.com/man/3/libgmalloc/) 힙 오류 검사를 활성화합니다.

**mac 참고 사항**

일부 GUI 대상은 각 반복의 타임아웃 후에 종료되지 못하고 응답하지 않게 될 수 있습니다. 이를 완화하려면 다른 터미널에서 다음과 같은 스크립트를 실행하여 주기적으로 배치 종료함으로써 수동 작업과 모니터링을 줄일 수 있습니다. 그렇지 않으면 퍼징 프로세스에 영향을 줄 수 있습니다.```
#!/bin/bash
ps -Af | grep -ie "$1" | awk '{print $2}' | xargs kill -9

C2DC C2B3D CDE5E``` $ while :; do ./pkill.sh "Process Name /Users/test"; sleep 360; done

root@kitploit:~
*/Users/test* (로컬 GUI 앱에 임시 파일이 전달되는 경로의 첫 부분에 대한 예시로, 실행 중 FUZZ가 경로가 됩니다)는 프로세스를 종료하기 위해 고유한 문자열이 필요하고, 프로세스 이름만 사용하면 퍼징 프로세스 자체에도 프로세스 이름이 포함되어 있어 퍼징 프로세스까지 종료되기 때문에 선택되었습니다.

**Windows에서 파일 핸들러 열거**

[AssocQueryString](https://github.com/sec-tools/WindowsFileHandlerEnumeration/) 스크립트를 *assoc* 명령어와 함께 사용하면 파일 확장자를 기본 애플리케이션에 매핑할 수 있습니다.```
C:\> .\AssocQueryString.ps1
...
.hlp :: C:\Windows\winhlp32.exe
.hta :: C:\Windows\SysWOW64\mshta.exe
.htm :: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
.html :: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
.icc :: C:\Windows\system32\colorcpl.exe
.icm :: C:\Windows\system32\colorcpl.exe
.imesx :: C:\Windows\system32\IME\SHARED\imesearch.exe
.img :: C:\Windows\Explorer.exe
.inf :: C:\Windows\system32\NOTEPAD.EXE
.ini :: C:\Windows\system32\NOTEPAD.EXE
.iso :: C:\Windows\Explorer.exe

Windows에서 퍼징을 할 때, 새로운 퍼징 실행을 시작하기 전에 더 나은 퍼징 경험을 위해 PageHeap 및 메모리 덤프를 활성화하는 것이 좋습니다 (대상이 이를 좋아하지 않는 경우 제외).

sudo litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" -z

sudo litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" --memdump

네, 이러한 명령을 Windows에서 (g)sudo를 사용하여 실행하면 콘솔에서 쉽게 관리자 권한으로 상승하여 기능을 활성화하는 데 필요한 레지스트리 변경을 수행할 수 있습니다.

이는 또한 대상에 malloc 디버거를 활성화하는 또 다른 미묘함을 보여줍니다: Linux 및 Mac에서는 이 기능을 활성화하기 위해 매번 전달해야 하는 런타임 환경 플래그를 사용합니다. Windows의 경우 레지스트리를 수정하므로 처음 전달된 후에는 (비활성화하거나 다시 활성화하지 않는 한) 퍼징 명령줄에서 -z 또는 --memdump를 다시 전달할 필요가 없습니다.

PuTTY (puttygen) 퍼징 (Windows)

litefuzz -l -c "C:\Program Files (x86)\WinSCP\PuTTY\puttygen.exe FUZZ" -i input\ppk -x 0.5 -n 100000 -z

예전처럼 Adobe Reader 퍼징 (Windows GUI)

litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe FUZZ" -i pdfs -x 3 -n 100000 -z

(WinAppDbg는 python 2만 지원하므로 Windows에서 py2를 사용해야 합니다.)

참고: 상승된 프롬프트에서 -z를 통해 또는 설정 중에 설치된 gsudo win32 패키지의 sudo를 사용하여 대상 앱에 대해 PageHeap을 활성화할 수 있다는 점을 상기시킵니다.

litefuzz -l -c "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe FUZZ" -z

클라이언트

빠른 보기```

litefuzz -lk -c "ssh -T test@localhost -p 2222" -a tcp://localhost:2222 -i input/ssh-cli -o crashes/ssh -p -n 250000 -z glibc --========================-- --======| litefuzz |======-- --========================--

[STATS] run id: 9404 cmdline: ssh -T test@localhost -p 2222 address: tcp://localhost:2222 crash dir: crashes/ssh input dir: input/ssh-cli inputs: 4 iterations: 250000 mutator: random(mutators)

@ 73/250000 (0 crashes, 0 duplicates, ~1 day, 0:21:01 remaining)^C

resume? (y/n)> n Terminated ...

cat /tmp/litefuzz/out padding error: need 57895 block 8 mod 7 ssh_dispatch_run_fatal: Connection to 127.0.0.1 port 2222: message authentication code incorrect

root@kitploit:~
#### 로컬 클라이언트

**로컬호스트(Linux)에서 SNMP 클라이언트 퍼징**

`litefuzz -lk -c "snmpwalk -v 2c -c public localhost:1616 1.3.6.1.2.1.1.1" -a udp://localhost:1616 -i input/snmp/resp.bin -n 1 -d -x 3`

#### 원격 클라이언트

**원격 FTP 클라이언트(Linux) 퍼징**

`while :; do echo "user test\rpass test\rls\rbye\r" | ftp localhost 2121; sleep 1; done`

`litefuzz -k -i input/ftp/test -a tcp://localhost:2121 -n 100`

참고: 대상에 따라 클라이언트 퍼징을 위해 권한 있는 포트(1-1024)에서 수신 대기가 필요할 수 있습니다. 이 경우 Linux에서는 Python 인터프리터에 `setcap cap_net_bind_service=+ep`를 설정하거나 퍼저 실행 시 sudo를 사용할 수 있고, Mac에서는 sudo를 사용하면 되며, Windows에서는 퍼저를 관리자로 실행하면 Permission Denied 오류를 피할 수 있습니다.

### 서버

#### 빠른 보기```
litefuzz -ls -c "./sc_serv shoutcast.conf" -a tcp://localhost:8000 -i input/shoutcast -o crashes/shoutcast -n 1000 -z
--========================--
--======| litefuzz |======--
--========================--

[STATS]
run id:     4001
cmdline:    ./sc_serv shoutcast.conf
address:    tcp://localhost:8000
crash dir:  crashes/shoutcast
input dir:  input/shoutcast
inputs:     3
iterations: 1000
mutator:    random(mutators)

@ 1000/1000 (1 crashes, 7 duplicates, ~0:00:00 remaining)

[RESULTS]
> completed (1000) iterations with (1) unique crashes and 7 dups
>> check crashes/shoutcast for more details

로컬 서버

로컬 Shoutcast 서버 퍼징

litefuzz -ls -c "./sc_serv shoutcast.conf" -a tcp://localhost:8000 -i input/shoutcast -o crashes/shoutcast -n 1000 -z

원격 서버

원격 SMTP 서버 퍼징

litefuzz -s -a tcp://10.0.0.11:25 -i input/smtp-req -pp -n 10000

명령줄```

usage: litefuzz.py [-h] [-l] [-k] [-s] [-c CMDLINE] [-i INPUTS] [-n ITERATIONS] [-x MAXTIME] [--mutator MUTATOR] [-a ADDRESS] [-o CRASHDIR] [-t TEMPDIR] [-f FUZZFILE] [-m MINFILE] [-mm SUPERMIN] [-r REPROFILE] [-e] [-p] [-pp] [-u] [--nofuzz] [--key KEY] [--click] [--tls] [--golang] [--attach ATTACH] [--cmd CMD] [--rmfile RMFILE] [--reportcrash REPORTCRASH] [--memdump] [--nomemdump] [-z [MALLOC]] [-zz] [-d]

optional arguments: -h, --help show this help message and exit -l, --local target will be executed locally -k, --client target a network client -s, --server target a network server -c CMDLINE, --cmdline CMDLINE target command line -i INPUTS, --inputs INPUTS input directory or file -n ITERATIONS, --iterations ITERATIONS number of fuzzing iterations (default: 1) -x MAXTIME, --maxtime MAXTIME timeout for the run (default: 1) --mutator MUTATOR, --mutator MUTATOR timeout for the run (default: 0=random) -a ADDRESS, --address ADDRESS server address in the ip:port format -o CRASHDIR, --crashdir CRASHDIR specify the directory to output crashes (default: crashes) -t TEMPDIR, --tempdir TEMPDIR specify the directory to output runtime fuzzing artifacts (default: OS tmp + run dir) -f FUZZFILE, --fuzzfile FUZZFILE specify the path and filename to place the fuzzed file (default: OS tmp + run dir + fuzz_random.ext) -m MINFILE, --minfile MINFILE specify a crashing file to generate a minimized version of it (bonus: may also find variant bugs) -mm SUPERMIN, --supermin SUPERMIN loops minimize to grind on until no more bytes can be removed -r REPROFILE, --reprofile REPROFILE specify a crashing file or directory to replay on the target -e, --reuse enable second round fuzzing where any crashes found are reused as inputs -p, --multibin use multiple requests or responses as inputs for fuzzing simple binary network sessions -pp, --multistr use multiple requests or responses within input for fuzzing simple string-based network sessions -u, --insulate only execute the target once and inside a debugger (eg. interactive clients) --nofuzz, --nofuzz send input as-is without mutation (useful for debugging) --key KEY, --key KEY send a particular key every iteration for interactive targets (eg. F5 for refresh) --click, --click click the mouse (eg. position the cursor over target button to click beforehand) --tls, --tls enable TLS for network fuzzing --golang, --golang enable fuzzing of Golang binaries --attach ATTACH, --attach ATTACH attach to a local server process name (mac only) --cmd CMD, --cmd CMD execute this command after each fuzzing iteration (eg. umount /Volumes/test.dir) --rmfile RMFILE, --rmfile RMFILE remove this file after every fuzzing iteration (eg. target won't overwrite output file) --reportcrash REPORTCRASH, --reportcrash REPORTCRASH use ReportCrash to help catch crashes for a specified process name (mac only) --memdump, --memdump enable memory dumps (win32) --nomemdump, --nomemdump disable memory dumps (win32) -z [MALLOC], --malloc [MALLOC] enable malloc debug helpers (free bugs, but perf cost) -zz, --nomalloc disable malloc debug helpers (eg. pageheap) -d, --debug Turn on debug statements

root@kitploit:~
# trophies

Litefuzz는 다음과 같은 다양한 소프트웨어 패키지에서 크래시를 발견했습니다.

* antiword
* AppleScript (OS X)
* ArangoDB VelocyPack
* Avast authenticode-parser
* Avast RetDec
* BBC Audio Waveform
* ColorSync (OS X)
* Dynamsoft BarcodeReader
* eot2ttf
* evernote2md
* faad2
* Facebook의 Origami Studio
* FontForge
* ForestDB
* Gifsicle
* GPUJPEG
* GPAC Multimedia Framework
* Google Draco
* Google Quipper
* GoPro GPR
* GtkRadiant
* IIPImage Server
* John The Ripper
* Kyoto Cabinet
* latex2rtf
* libMeshb
* libembroidery
* libsndfile
* Lion Vector Graphics (lvg)
* L-SMASH
* mp3-decoder
* MindNode
* minimp4
* MiniWeb Server
* MLpack
* Nvidia Data Center GPU Manager
* Numbers (OS X)
* OpenJPEG
* OpenOrienteering Mapper
* OSM Express
* Pages (OS X)
* PBRT-Parser
* Pixar USD
* Remote Apple Events (OS X)
* Samsung rlottie
* Samsung ThorVG
* Shoutcast Server
* Silo
* syslog (OS X)
* Tencent NCNN
* TinyXML2
* UEFITool
* Ulfius Web Framework
* zlib

# FAQ

## 이 프로젝트는 어떻게 시작되었나요?
퍼징은 재미있습니다! 그리고 퍼저가 항상 최신 또는 인기 있는 접근 방식을 따라야만 버그를 찾을 수 있다는 것은 아니라는 반항적인 관점을 가진 프로젝트를 하는 것도 좋습니다. 베어메탈에 가깝든, 모든 경로에서 코드 커버리지를 얻든, 또는 단순히 빠르고 유연하게 최적화하든, 근본적으로 "가정을 무효화"하는 방식으로 일을 수행하든, 어떻게 나타나든 즐기세요.

## 이 프로젝트는 적극적으로 유지 관리되나요?
프로젝트에 대한 적극적인 지원이나 유지 관리를 기대하지 마십시오. 새 기능을 추가하거나 버그를 수정하려면 자유롭게 포크하세요. 사소한 부분은 PR을 보낼 수도 있지만 응답이나 문제 해결에 대한 기대는 하지 마십시오. 이 리포지토리에서의 개발이 활발할 의도는 없습니다.

## 퍼저가 잘 작동하는지 어떻게 알 수 있으며, 다른 퍼저와 비교 측정했나요?
Litefuzz의 목적은 여러 플랫폼에서 버그를 찾는 것입니다. 그리고 실제로 그렇게 합니다. 따라서 솔직히 말해서 fuzzerX나 fuzzerY와 비교 측정하는 것은 우선순위에서 밀렸습니다. 특정 절충점이 처음부터 결정되고 인정되었으며, 자세한 내용은 [#intro](https://github.com/sec-tools/litefuzz/blob/HEAD/README.md#intro)를 참조하세요.

## 오늘 다시 작성한다면 무엇을 바꾸겠습니까?
현재 상태로도 꽤 잘 작동하며 수많은 다양한 대상과 시나리오에서 테스트되었습니다. 그렇긴 하지만, 대상과 플랫폼 간 전환 시 코드의 운영 측면에서 추가 검사가 많이 필요하지 않도록 보다 모듈 기반의 플러그인 시스템을 표준화하는 것이 도움이 될 것입니다. 물론 공식적인 테스트와 지원 OS에서 테스트할 수 있는 배포 시스템이 있으면 핵심 기능을 변경할 때 작업하기 쉬운 환경이 조성될 것입니다. 작지만 야심찬 프로젝트에서 꽤 빠르게 조금 더 큰 규모로 성장했습니다.

## litefuzz는 얼마나 안정적인가요?
명령줄, GUI, 네트워크 퍼징(주로 Linux 및 Mac), 최소화 등은 상당히 철저하게 테스트되었으며 전반적으로 꽤 안정적일 것입니다. 절연된 네트워크 GUI 퍼징, Mac용 ReportCrash 지원 등과 같은 일부 이국적인 기능은 실험적인 것으로 간주해야 합니다.

## litefuzz에서 지원되지 않는 시나리오가 있나요?
네, 몇 가지 있습니다. 하지만 대부분은 드문 시나리오로 버그가 있거나, "제대로" 구현하기 위해 더 많은 시간과 연구가 필요하거나, 플랫폼 관련 이유로 제대로 작동하지 않습니다. 그 중 많은 경우 해당 옵션으로 실행하려고 하면 명시적으로 "지원되지 않음" 메시지와 함께 종료되며, 다양한 기능을 설명할 때 위 섹션에서 몇 가지 주의 사항이 언급되었습니다. 더 세부적인 사항 중 일부는 *절연* 앱의 재현 모드가 지원되지 않으며, 절연 기능을 사용하는 Mac 앱에 대한 테스트가 제한적이라는 점, Pyautogui는 Linux와 Windows에서 잘 작동하는 것 같지만 Mac에서는 신뢰할 수 없어 기능적으로 지원되지 않는 것으로 간주한다는 점, Windows에서의 클라이언트 퍼징은 다른 플랫폼의 다른 모드보다 약간 덜 안정적일 수 있다는 점 등이 있습니다.

여기저기 몇 가지 엣지 케이스가 있을 수 있지만, 가장 일반적인 로컬 및 네트워크 퍼징 시나리오는 테스트되었고 작동 중입니다. 아, 이것이 크로스 플랫폼 도구를 작성하는 즐거움입니다: 보람되지만 항상 모든 것을 완벽하게 작동하게 만드는 것은 어렵습니다. 전반적으로 Linux/Mac에서의 퍼징이 더 안정적이고 더 많은 기능을 지원하는 것으로 보이며, 특히 Windows 플랫폼보다 네트워크 퍼징 테스트가 훨씬 많이 이루어졌지만 Win32에서 최소한의 기본 기능과 몇 가지 추가 기능을 사용할 수 있도록 노력했습니다.

이 퍼저를 포크하여 개선하거나 현재 지원되지 않는 기능을 지원하거나, 사소하지만 유용한 것에 대한 PR을 자유롭게 보내십시오.

## 이 프로젝트 또는 그 코드에 대해 어떤 보장이 제공되나요?
전혀 없습니다. 하지만 퍼징하면서 버그를 찾는 것은 꽤 재미있습니다.

## 작성자 / 참고 자료
- [Jeremy Brown](https://github.com/sec-tools/litefuzz/blob/HEAD/jbrown3264%5BNOSPAM%5Dgmail)
- [macOS 퍼징용 슬라이드 데크](https://www.slideshare.net/JeremyBrown37/summer-of-fuzz-macos)
도구 다운로드