관리 메뉴

개발자비행일지

The Fuzzing Book 공부2 본문

▶ 퍼징

The Fuzzing Book 공부2

Cyber0946 2020. 2. 21. 16:01

https://www.fuzzingbook.org/html/Fuzzer.html

 

Fuzzing: Breaking Things with Random Inputs - The Fuzzing Book

In this chapter, we'll start with one of the simplest test generation techniques. The key idea of random text generation, also known as fuzzing, is to feed a string of random characters into a program in the hope to uncover failures.Prerequisites You shoul

www.fuzzingbook.org

Bugs Fuzzers Find

Fuzzer를 통해서 오류가 발생하는 것을 알려진 UNIX를 사용해서 많은 회사들은 네트워크 입력값을 처리하는데 사용했었다. 그런데 이 사태로 인해 프로그래머들은 자체 Fuzzer를 구현하기 시작했고 Fuzzer를 활용해 버그 테스트를 하기 시작했다. "이제 입력값에 대한 신뢰는 깨졌다."

Buffer Overflows

많은 프로그램들은 입력과 인자에 대한 길이 제한을 가지고 있다. 

예를 들어 

char weekday[9];  라는 8개의 문자열과 문자열의 종료를 나타내는 '\0'로 이루어진 배열이 있을 때, 

strcpy(weekday, inpu); 이 문장은 위험하다. 

왜냐하면, 쉽게 입력밤위를 초과하는 임의의 문장을 ,fuzzing을 통해 만들 수 잇기 때문이다. 

한 번 파이썬 코드와 만들었던 Fuzzer를 사용해서 알아보자. 

자 다음은 실행결과이다. 

위의 코드에서 with ExpectError() 아래 부분은 예상된 오류에 대해서 우리가 미리 설정한 상태 메시지를 표준 입력으로 출력하고 난 다음 실행을 계속한다. 우리는 추후 마주할 예기치 않은 오류의 발생과는 구분된다. 

 

Missing Error Checks

 많은 프로그램 언어는 예외처리 대신에 특정한 오류 코드를 반환하는 경우가 있다. C 프로그램에서 getchar()  함수의 경우 보통 표준 입력값을 리턴하지만, 입력이 가능하지 않을 경우 이 함수는 EOF(End Of File)을 리턴한다. 

자, 프로그램이 사용자가 공백문자를 입력할 때까지 입력을 scanning 하고, 그 다음 입력값을 기다린다고 해보자. 

while (getchar() != ' ')

{

}

이때 만약 입력이 조기에 종료되어, 퍼징이 가능한 것으로 보이면 어떻게 될 까?

getchar()는 EOF를 반환하고 재 실행되며 계속 EOF를 반환하고 재실행되는 무한 루프에 빠지게 된다. 

이러한 상황을 한번 스크립트로 구현해 보자.

아래는 실행 결과이다.

위 코드에서 with ExpectTimeout () 행을 사용하면 2 초 후에 코드 실행이 중단되어 오류 메시지가 출력된다.

Rogue Numbers

퍼징 테스트는, 쉽게 흔하지 않은 입력값을 생성가능하며, 이는 온갖 종류의 프로그램 행위를 야기한다. 아래 C 코드는 먼저 buffer의 크기를 입력값을 통해 읽어오고, 주어진 크기 만큼 버퍼를 할당해 주는 코드이다. 

char *read_input()

{

size_t size = read_buffer_size();

char *buffer = (char *)malloc(size);

// fill buffer return (buffer);

}

이때, 만약 사이즈가 프로그램의 메모리보다 크게 되면 어떻게 될까? 또 사이즈가 작으면 어떻게 될까? 임의의 숫자 생성을 통해 퍼징은 온갖 종류의 데미지를 입힐 수 있다. 

이를 스크립트로 확인해 보자. 

다음은 사용된 입력값과 오류출력 문이다. 

Catching Errors

Fuzzer는 프로그램이 정지하거나 충돌이 일어나도록 하는 두 가지 상태를 야기한다.

Generic Checkers

위에서 언급 된 것 처럼 버퍼 오버 플로우는  C, C++ 처럼 임의의 메모리 영역에 접근 가능한 프로그램 언어에서 일반적인 문제이다.

Checking Memory Accesses

우리는 잘못된 매모리 접근을 잡기 위해, 사용하는 메모리 점검 환경 중 유명한 것은 LLVM Address Sanitizer로, 잠재적으로 위험한 모든 메모리 안전 위반을 탐지 한다. 

 아래의 예는 간단한 c 프로그램을 컴파일 하는 스크립트이다. 이를 이용해 테스팅을 진행해 보자. 

우리는 다음의 명령어를 통해서 address sanitization기능을 사용할 수 있다. 

$lang -fsanitize=address -g -o program program.c

$./program 99; echo $?

로 수행하면 42가 반환된다. 

우리가 buf[100]으로 프로그램에 접근하면, 바운더리 오류를 반환한다. 

 

 

 

이런 C 프로그램의 오류를 찾고 싶다면 퍼징을 사용하면 간단하다. 

'▶ 퍼징' 카테고리의 다른 글

The Fuzzing Book 공부 3  (0) 2020.02.24
The Fuzzing Book 공부1  (0) 2020.02.19