1nzag

[winAFL] winAFL DynamoRIO 관련 분석

fuzzer

*dynamoRIO

 

dynamoRIO option: 기존 인자를 파싱하는 opt_arg 함수에 -D 옵션 추가. DynamoRIO (drrun.exe) 사용하기 위해 해당 파일의 path 지정하는 변수이다.

 

DynamoRIO option: 해당 DynamoRIO 실행파일에 넣어줄 인자를 따로 받는 구간이 존재한다.

 

 

 

해당 인자는 dynamorio_dir 전역변수에 저장되며, target 실행시킬 해당 인자를 drrun.exe 전달해준다.

 

 

 

이때 -c option (-client) winafl.dll 들어가는데, 이는 winafl.c 으로부터 컴파일되는 dll 파일이다.

dynamoRIO 사용자와 interact 하기 위해 client 지정할 있는데, 이를 지정해 주는 옵션이다.

 

 

클라이언트에 커스터마이징한 클라이언트 winafl.dll 넣음으로써 afl-fuzz drrun.exe 서로 interact 하며 작동될 있다.

 

둘은 서로 named pipe 통신한다.

관련된 대표적 함수는 WriteCommandFromPipe() ReadCommandFromPipe() 함수임 해당 파이프라인은 Create_target_process() 함수에서 target 실행시킬 생성시킨다.

 

 

다음은 run_target() 함수에서 파이프라인에 command 보내는 부분이다.

 

다음은 winafl.c 에서 파이프를 통해 메시지를 읽고 쓰는 함수다.

 

 

이러한 command F, Q, P, K 4가지이다.

 

F: afl-fuzz winafl.dll에게 퍼징을 시작한다는 신호를 보내는 command

Q: afl-fuzz winafl.dll에게 process exit 하라는 신호를 보내는 command

 

P: winafl.dll afl-fuzz 에게 프로그램 사이클을 끝냈다고 신호를 보내는 command

K: winafl.dll afl-fuzz 에게 프로그램 사이클을 시작한다고 신호를 보내는 command

 

또하나로, drrun winafl.dll coverage afl-fuzz 에게 전달할 때는 shared memory 사용한다.

 

 

 

커버리지를 등록하는 알고리즘은 두가지가 있다. 두가지는 다음과 같다.

 

    1. bb coverage
    2. edge coverage

 

알고리즘을 설명하기 전에 먼저 dynamorio에서 어떠한 인자(변수) 참고하는지 필요가 있다.

 

module_data_t : 로드한 모듈(바이너리) 정보를 담고 있는 구조체. module_data_t start 해당 바이너리의 start_address 담고 있다. (엔트리 포인트를 담고 있다고 생각하면 된다.)

 

app_pc: 특정 pc (program counter) 지정하는 변수명

 

dr_fragment_app_pc(): 해당 테그가 존재하는 pc 반환한다.

 

drmgr_register_bb_instrumentation_event:

Registers callback functions for the second and third instrumentation stages: application analysis and instrumentation insertion. drmgr will call func as the second of four instrumentation stages for each dynamic application basic block.

 

라고 적혀있는데 instrument 진행될때마다 call 되는 callback 함수라고 보면 같다. (정확하지 않음)

 

winafl.dll 로드 메인 함수에서 옵션에 따라 coverage 등록하는 함수를 instrument 진행될 때마다 callback 있도록 한다.

 

 

 

bb coverage:

instrument 진행되면 때의 pc 엔트리포인트의 차이를 구해 거리를 공유메모리 내의 테이블에 등록한다.

 

이때 start_pc 다음으로 구한다.

 

 

edge coverage:

처음엔 bb coverage 마찬가지로 엔트리포인트와 해당 pc 와의 거리를 구하지만 전의 거리값과 특정 연산을 그에 해당하는 테이블에 값을 더한다.

 

이러한 차이를 두는 지는 모르겠지만 edge bb 다르게 전에 있었던 pc카운터를 활용하기때문에 coverage 정확히 구분할 하다.

 

 

 

'fuzzer' 카테고리의 다른 글

[WinAFL] WinAFL 퍼저 요약  (1) 2020.04.20