Avatar
Interest: Web Exploitation.
Activities: DreamHack, Baekjoon
I occasionally blogs about web security, tricks, and development.

C/C++ Fuzzing Framework

Development Period

21.08 ~ 21.12

Technique Stack

Tool: gcov
Language: C
Multi-processing, IPC(InterProcess Communication)

Details

Source code

Contribution

  1. Introduction to Software Testing
    Unit Test 코드 작성

  2. Lexical Fuzzing
    Child Process가 Target program을 실행하고 Parent Process가 Random Fuzzer로 무작위 문자열을 생성한 후, pipe로 입력을 줘서 테스트

  3. Mutation Fuzzing
    초기 Seed 값을 주고, 여러 Mutation 기법을 적용하여 변형된 Seed를 입력으로 주는 Mutation Fuzzer 구현, Line Coverage, Branch Coverage 측정

  4. BlackBox Fuzzing
    Mutation Fuzzer에서 Seed Scheduling을 위해 Normalization, Seed Choose 기법 추가, 테스트 결과 csv에 저장

  5. GrayBox Fuzzing
    Muation 기법 추가, 초기 Seed Corpus 저장 및 가중치 높이는 Seed 저장, BlackBox Fuzzer에서 Code Coverage 값을 읽어 새로운 Path를 발견한 Seed에 가중치 높이는 기능 추가, Seed 랜덤 선택

  6. Boosted GrayBox Fuzzing
    가중치 기반으로 계산식을 활용하여 Seed 선택

Testing Programs

URL parser Testing
troff Testing
bc calculator Open Source Testing
cJSON Open Source Testing
json parser Open Source Testing

Review

프로그램에 버그 및 취약점 여부를 확인하기 위해 테스팅 과정을 거치는데, Fuzzer를 통해 자동화 테스트를 해보는 경험을 해보았다.

Fuzzer를 개발하며 무작위한 입력만 주는 것이 아닌 실제 유효한 Seed 값을 입력으로 주고 이를 변형(Mutation)하여 프로그램에 입력으로 준 후, Code coverage 값을 읽어 가중치에 따라 Seed Scheduling을 수행하며 프로그램을 테스트한다는 것을 배울 수 있었다.

이후엔, OSS Fuzzer로 다른 Open-source software들을 테스팅 해보았고, 추가로 AFL++ Fuzzer를 여러 Open-source software에 Test Driver를 작성하여 테스팅하는 좋은 경험을 해볼 수 있었다.