Security/시스템 해킹(PWN, System)

AFL을 통한 unegg 실습

그믐​ 2023. 7. 27. 01:52
반응형

저번 시간에 AFL에 대한 정리를 했었는데,

이번에 AFL을 통해 unegg라는 프로그램을 실습해보고자 한다.

 

AFL setting


이미 afl 환경이 구축되어 있는 docker 내에서 실습을 진행한다.

unegg를 설치하고 AFL을 통해 실습을 진행한다.

 

/work/unegg/release-x64에서 make 를 수행하면 에러가 나온다.

 

getcwd 함수는 unistd.h 파일을 include 해야하는데 없나보다.

 

UnEgg.cpp 에 unstd.h를 include 한다.

 

make를 해주면 성공적으로 빌드가 된다. 그러나 자세히 보면 gcc 혹은 g++로 컴파일되는데, 이를 afl을 사용해주어야 한다.

 

따라서, gcc, g++ 부분을 afl-gcc, afl-g++로 변경하여야 한다.

#!/bin/bash

find . -type f -name '*.mk' -exec grep -l 'g++' {} \; | while read file
do
  sed -i 's/g++/afl-g++/g' "$file"
done
#!/bin/bash

find . -type f -name '*.mk' -exec grep -l 'gcc' {} \; | while read file
do
  sed -i 's/gcc/afl-gcc/g' "$file"
done

 

이를 위해서 .mk파일들에 있는 gcc, g++을 afl-gcc, afl-g++로 바꿔주는 쉘 스크립트를 작성한다.

makefile은 release-x64에만 있으므로, 그냥 수동으로 바꿔준다.

 

sudo chmod 777 replace_*
sudo ./replace_c.sh
sudo ./replace_cxx.sh
sudo make

모든 빌드에 대해 afl 컴파일이 잘 작동한다.

 

RUN AFL


 

이제 afl을 사용해보자.

 

sudo sysctl -w kernel.core_pattern=core

core 파일 생성을 설정해두어 afl이 확인하도록 한다.

 

input, output 디렉토리를 생성하고 input에 테스트할 a.egg를 둔다.

 

sudo afl-fuzz -i input -o output ./unegg @@

 

afl이 작동한다.

 

output 디렉토리에서는 이러한 파일들이 생겼다.

 

일반적인 상황에서는 잘 작동하지만

crash 디렉토리 내의 파일을 사용하면 segfault가 나타난다.

 

crash와 ASAN, 디버거를 통해 크래시를 분석하고 취약점을 찾을 수 있다.

각 크래시에 대한 code coverage 측정은 다른 도구를 써야하나보다..

반응형