본문 바로가기

PWN

AFLPlusplus - qemu mode - High map density

언젠가 블로그 글을 일주일에 하나씩 업로드하겠다고 결심했던 때가 있었던 것 같은데... 

 

 

AFLPlusplus에서는 shared memory로 커버리지를 측정한다. 이때 shared memory를 map이라고 하고, shared memory의 size를 map size라고 한다.

복잡하고 사이즈가 큰 바이너리를 qemu mode로 퍼징할 때, map density가 70%이상으로 높아질 때가 있다. shared memory의 70%가 특정 커버리지에 의해서 표시되었다는 뜻이다. 이 경우 새로운 커버리지가 발견되어도, 70% 확률로 이미 발견된 커버리지로 측정된다. (collision)

 

 

 

AFLPlusplus에서는 AFL_MAP_SIZE 환경변수를 통해서 map size를 바꿀 수 있다고 문서화되어 있다. 하지만 테스트 해본 결과 qemu mode에서는 해당 환경변수를 바꿔도, map size가 바뀌지 않았다.

 

qemu mode에서 커버리지를 측정하는 함수 중 하나인 afl_mabye_log에서는 cur_loc에 MAP_SIZE-1(0xffff)를 and 연산한 후 커버리지를 측정한다.

 

    target_ulong afl_loc = afl_id & (MAP_SIZE -1);
    //*afl_dynamic_size = MAX(*afl_dynamic_size, afl_loc);
    TCGv tmp0 = tcg_const_tl(afl_loc);
    gen_helper_afl_maybe_log(tmp0);

이때 사용되는 MAP_SIZE라는 값은 환경변수에의해 바뀌는 값이 아닌, #define으로 하드코딩되어 있는 값이다. 따라서 map size를 바꿔주기 위해서는 해당 값을 수정한 후 다시 컴파일해야 한다. (afl-fuzz와 afl-qemu-trace 둘 다.)

 

해당 값을 수정한 후 다시 퍼저를 실행하면 map size가 늘어난 것을 확인할 수 있다. 다만 speed가 느려졌다. 계산해야 하는 coverage가 0x10배 늘어난 탓으로 보인다. target의 size를 기반으로 적절하게 판단하자.

 

'PWN' 카테고리의 다른 글

AFLPlusplus qemu, Persistence mode 속도 느려질 때  (0) 2022.01.04
Bypass CRC check for fuzzing with pintools  (1) 2021.11.23
Linux 버그 보는 곳  (1) 2021.06.06
Ida python for bug hunting  (0) 2021.03.11
Assaultcube Fuzzing  (0) 2021.02.04