전체 글
AFL++ download
$ sudo apt update $ sudo apt install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools 우선 패키지들을 설치한다. 여기서 중요한것은 llvm 설치이다. 여기서 llvm은 주로 다양한 컴파일러 기능을 위해 사용한다. $ sudo apt install -y lld-11 llvm-11 llvm-11-dev clang-11 그 밖의 필요한 것들을 설치해준다. $ sudo apt install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\\..*//')-plugin-dev libstdc++-$(gc..
AFL++
AFL란? American Fuzzy Lop의 약자로, mutational 방식의 coverage guided fuzzer이다. 브르투포스로 입력을 받고 coverage를 넓혀가며 프로그램 제어 흐름에 대한 변경사항을 기록하고,이를 로깅하여 유니크한 crash를 발경해 낼 수 있다. AFL의 특징 coverage 기반 fuzzer이기 때문에 매우 효율적인 fuzzing이 가능하다. code coverage 측을 위한 코드를 컴파일 타임에 삽입한다. QEMU를 이용해서 컴파일 타임이 아닌, 런타임시에 코드삽입도 가능하다. 여기서 말하는 코드는 코드가 어디가 실행됬고, 어디가 실행 안됬는지를 측정해주는 코드를 뜻한다. Coverage Guided Feedback : AFL의 커버리지 피드백 기법은 하이브리드..
FUZZING의 과정
PreProcess 초기 준비 단계이다. 아래와 같은 작업을 한다. 1. PUT에 대한 instrumentation 적용 2. 쓸모없는 configureation 제거 3. seed trimming 4. dirver app 생성 PUT 코드 사이사이에 instrumentation 코드를 삽입해 새로 컴파일한다. code coverage를 높이기 위한 작업으로 instrumentation이라고 한다. gray-box와 white-box는 PUT에 instrumentation을 적용해 execution feedback을 수집하고 그에 맞춰 더 정교한 퍼징을 수행한다. Program instrumentation을 static과 dynamic으로 나뉜다. Static 방식은 PUT 실행전 Preprocess 단..
FUZZING에 대해서
Fuzzing이란? fuzzing이란 fuzz input을 사용해 PUT(Program Under Test)를 실행하는 것이고, fuzz input 이란 PUT가 예상하지 못할 input을 뜻한다. PUT이 잘못 처리하는 input 혹은 개발 의도와는 다른 행동을 보이는 input을 넣어 PUT을 실행하는 것이라고 볼 수 있다. 즉 fuzzing이란, 자동화 테스트로 기형/반기형적 데이터를 주입하여 소프트웨어 버그를 찾는 블랙박스 테스팅 기술이다. PUT은 테스트 실행중인 프로그램이라고 해석하자 Fuzzing을 왜 쓰나? 결론적으로는 fuzzing을 통해 버그를 자동으로 찾을 수 있다는 것이다. 일반적인 정적분석으로도 버그를 찾을 수 있지만 많은 시간과 노력이 들며 자신의 실력에 따라 버그를 찾을 수도,..
Tcache function(2.31)
2.31부터 tcache 관련 함수들도 조금씩 바뀌었다. tcache_entry typedef struct tcache_entry { struct tcache_entry *next; /* This field exists to detect double frees. */ struct tcache_perthread_struct *key; } tcache_entry; key 라는 포인터 변수가 생겼다. tcache double free를 막기 위해서 2.29에서 추가되었다. tcache_put static __always_inline void tcache_put (mchunkptr chunk, size_t tc_idx) { tcache_entry *e = (tcache_entry *) chunk2mem (chu..
Tcache function
이번에는 Ubuntu GLIBC 2.27-3ubuntu1.2 기준 Tcache에 관한 함수들을 설명하겠다. tcache_entry typedef struct tcache_entry { struct tcache_entry *next; } tcache_entry; tcache chunk의 list를 만드는 요소이다. next 포인터로 연결리스트를 관리한다. tcache_perthread_struct typedef struct tcache_perthread_struct { char counts[TCACHE_MAX_BINS]; tcache_entry *entries[TCACHE_MAX_BINS]; } tcache_perthread_struct; tcache_entry를 관리하기 위해 사용된다. 2.26이전 버전..
Tcache
tcache란? thread local cache는 멀티 스레드 환경에서 메모리 할당 속도를 높이기 위한 것으로 각 스레드에 독립적으로 할당되는 캐시 저장소이다. 작은 단위의 메모리는 arena를 참조하지 않고 바로 메모리를 할당한다. tcache는 glibc 버전 2.26에서 도입되었으며, 멀티 스레드 환경에 더욱 최적화된 메모리 관리 메커니즘을 제공한다. tcache의 특징 - 각 스레드는 64개의 tcache를 가지고 있다. - tcache는 LIFO방식으로 사용되는 단일 연결리스트이며, 하나의 tcache는 같은 크기의 chunk들만 보관한다. - 리눅스는 각 tcache에 보관할 수 있는 chunk의 갯수를 7개로 제한하고 있다. - tcache에 들어간 chunk들은 병합되지 않는다. - tc..