gcov 개념
- code coverage를 측정하기 위해 사용하는 프로그램
- 알 수 있는 것
- 각 라인의 코드가 얼마나 자주 실행되었는가
- 정확히 어떤 라인의 코드가 실행되었는가
- 특정 부분의 코드를 실행하는데 얼만큼의 시간이 걸렸는가
gcov 사용법
- gcc의 특정 옵션과 함께 테스트하고자하는 프로그램 컴파일
- -fprofile-arcs : 이 옵션으로 컴파일한 후, 프로그램을 실행하면 branch와 call이 얼마나 실행되었는지 그리고 리턴을 했는지 기록한다. 이 데이터는 .gcda 파일에 저장된다.
- -ftest-coverage : 이 옵션으로 컴파일되면, gcov 프로그램이 프로그램의 coverage를 보여줄 때 사용하는 .gcno 파일을 생성한다.
- --coverage : -fprofile-arcs -ftest-coverage 옵션을 모두 준 것과 같다.
- 이 옵션들은 gcc가 프로그램의 flow graph를 포함한 gcov의 사용에 필요한 부가적인 정보를 생성하도록 할 수 있으며, 프로파일링 정보를 만들기 위한 사항들을 오브젝트 파일에 추가시킬 수 있다.
- gcc --coverage -o test test.c => [$ ls] test test.c test.gcno
- 컴파일한 프로그램 실행
- ./test => [$ ls] test test.c test.gcno test.gcda
- gcov 프로그램으로 커버리지 정보 분석
- .gcda, .gcno 파일을 활용해 .gcov 파일을 생성한다.
- .gcov 파일을 해당 프로그램의 커버리지 정보를 담고있다.
- gcov test.c => [$ ls] test test.c test.c.gcov test.gcda test.gcno
./test를 또 실행하면 test.gcda가 업데이트된다.
gcov test.c를 다시 실행하면 test.c.gcov가 업데이트된다.
lcov 개념
- gcov 결과를 웹 페이지를 통해 깔끔하게 보여주기 위해 lcov를 사용한다.
적용하기
0. AFL을 실행하면 crashes/ queue/ hang/에 mutated된 인풋 파일이 존재한다.
1. binutils를 --coverage 옵션으로 컴파일한다.
CC=/usr/bin/gcc CXX=/usr/bin/g++ CFLAGS="--coverage" CXXFLAGS="--coverage" ./configure --prefix=`pwd`/build LIBS="-ldl"
make -j `nproc`
make install
< 하나만 먼저 실행해보기 >
2. objdump를 실행한다.
[**] 이때 objdump는 build/bin 밑에 있는게 아니라 binutils 밑에 있는데서 실행한다.
[**] 꼭 ./objdump로 실행해야 한다.
./objdump -x ../../../AFL/afl-2.52b/default_output/queue/id:001145\,src:000443\,op:flip1\,pos:15040
>> .gcno, .gcda 파일이 생성된 것을 볼 수 있다.
3. gcov를 실행한다.
gcov objdump.c
>> objdump.c.gcov가 생성됐다.
< AFL output에 있는 모든 파일 실행하기 >
4. 이제 crashes/ queue/ hang/에 있는 모든 파일을 대상으로 objdump를 실행하는 쉘 스크립트를 작성한다.
이때 해당 파일들 모두 chmod +x * 해야하는 듯....
sh objdump_exec.sh
dirname="/home/mj/Desktop/AFL/afl-2.52b/default_output/"
for i in $(ls $dirname/queue/)
do
echo `./objdump -x $dirname/queue/$i`
done
for i in $(ls $dirname/crashes/)
do
echo `./objdump -x $dirname/crashes/$i`
done
for i in $(ls $dirname/hangs/)
do
echo `./objdump -x $dirname/hangs/$i`
done
5. gcov objdump.c
>> cat objdump.c.gcov 로 확인할 수 있다.
+ objdump* 파일을 다른 디렉터리에 복사했다... 6번 편하게 하려고..
6. lcov --rc lcov_branch_coverage=1 --capture --directory . --output-file objdump.info
7. genhtml objdump.info --branch-coverage --output-directory output
>> 5, 6, 7도 쉘스크립트로 자동화할 수 있을듯
출처
http://korea.gnu.org/manual/release/gcov/gcov_1.ko.html
https://velog.io/@kongsub/GCOV-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0-Lab1-Triangle
'정보보안 > fuzzing' 카테고리의 다른 글
[TheFuzzingBook] Code Coverage (0) | 2022.01.29 |
---|---|
[TheFuzzingBook] Breaking Things with Random Inputs (0) | 2022.01.28 |
기본적인 fuzz testing algorithm 이해하기 + AFLFast (0) | 2022.01.24 |
[실험] AFL/AFL++ 실험설계 및 수행 (0) | 2022.01.21 |
[최종 정리] AFL의 특징과 AFL++의 개선방안 (0) | 2022.01.13 |
댓글