[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를 사용한다.
커버리지를 등록하는 알고리즘은 두가지가 있다. 그 두가지는 다음과 같다.
|
두 알고리즘을 설명하기 전에 먼저 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 |
---|