Program-aware fuzzing is a way to utilize knowledge about program behaviors during a fuzzing campaign. In this dissertation, we argue that we can extend the capacity of program-aware fuzzing by applying binary-level static analysis on previously less-explored targets. First, OS-level system binaries are significantly larger than regular application binaries, and they could hardly become a target for static
analysis. We enable a scalable static analysis on system binaries with the help of modular analysis and demonstrate the first Windows kernel fuzzer that is aware of high-level system call semantics. Second, there are recently emerging execution environments, such as EVM, where traditional binary-level analysis does not apply. We broaden the scope of static binary analysis to the EVM architecture and achieve the program-awareness in smart contract fuzzing by inferring meaningful function call orders with data-flow knowledge. With the two systems, we demonstrate that the program knowledge obtained from our static analyses can indeed enhance the performance of fuzzing.
프로그램 인식형 퍼징이란 프로그램의 행동에 대한 정보를 활용하는 퍼징 방식을 의미한다. 본 학위 논문에서는 기존에 많이 다뤄지지 않았던 바이너리 코드에 정적 분석을 적용함으로써 프로그램 인식형 퍼징의 범위 및 역량을 확장할 수 있음을 보인다. 첫째로, 이 논문에서는 운영 체제 단의 시스템 바이너리들에 주목한다. 이 바이너리들은 일반적인 어플리케이션 바이너리에 비해 크고 복잡하기 때문에 정적 분석의 대상이 되기 어려운 것으로 여겨져 왔다. 본 연구는 모듈식 분석 기법을 활용하여 큰 규모의 바이너리 코드에 정적 분석을 가능케 하며, 이를 통해 윈도우 시스템 콜의 개략적인 실행 의미를 파악하여 활용하는 커널 퍼저를 구현한다. 둘째로, 이 논문은 최근에 등장하여 기존의 바이너리 분석 기술을 적용할 수 없는 스마트 컨트랙트 실행 환경을 다룬다. 본 연구는 바이너리 정적 분석을 확장하여, 대표적인 스마트 컨트랙트 실행 환경인 이더리움 가상 머신 아키텍쳐에 적용한다. 이를 기반으로, 스마트 컨트랙트의 데이터 흐름 정보를 활용하여 유의미한 함수 호출 순서를 유추하는 프로그램 인식형 퍼징을 실현한다. 이러한 두 퍼징 시스템을 통해, 정적 분석을 통해 얻은 프로그램 정보를 사용함으로써 퍼징의 성능을 실제로 향상시킬 수 있음을 보인다.