소개
이 문서는 VMware에서 glsl 퍼저를 돌리는 방법을 설명한다. Vulkan 드라이버가 작동하지 않을 때 어떻게 작동할 수 있을지에 대해 이야기한다.
본론
퍼저 구조
퍼저는 전체적으로 서버와 클라이언트 구조로 되어 있다. 서버의 경우 클라이언트들을 웹 환경으로 관리할 수 있으며 클라이언트는 서버로부터 파일을 받아 이를 구동시키는 역할을 한다. 클라이언트의 경우 worker로 불리며 서버 웹 페이지를 이용하여 worker에 일을 할당할 수 있다.
서버의 경우 prebuilt binary (위 링크의 graphicsfuzz.zip
)를 통해 구동할 수 있다. 압축을 풀고난 뒤 python/drivers
에 가면 glsl-server
가 있다. 해당 서버를 구동하면 된다.
예시 : glsl-server --port 31337
(pwd는 작업할 위치로 바이너리 위치와 상관 없이 따로 생성해야 한다)
클라이언트의 경우 마찬가지로 prebuilt binary (위 링크의 gles-worker-desktop.jar
)가 있으며 이를 다운로드 받아서 실행시켜주어야 한다. VM guest 안에서 실행시켜주면 되며 마찬가지로 폴더를 하나 생성해서 그 안에서 실행시켜주면 된다.
예시 : java -ea -jar gles-worker-desktop.jar --server http://localhost:31337
자세한 퍼저 작동은 링크에 있다. 해당 문서의 Running the server
와 gles-desktop-worker
파트를 보면 된다.
준비물
준비물은 간단하다. Release에 동봉되어 있는 (graphicsfuzz.zip
) 셰이더 파일들을 준비해주면 된다. 해당 파일들을 통해 이후 단계에서 variant를 생성할 것이기 때문에 이를 미리 준비해놓자.
퍼저 구동
퍼저를 구동하기 위해서 3가지 단계를 거쳐야 한다.
- glsl-generate 실행
- glsl-server 실행, worker 실행
- worker에 job 할당
glsl-generate
glsl-generate의 경우 shader family를 생성하는데 사용된다. 지금 단계에서 생성하는 shader family는 퍼징을 수행할 때 worker가 실행하는 입력으로 들어가게 된다. 아래 명령어를 통해 실행할 수 있다.
glsl-generate ../prebuilt/shaders/samples/100 ../prebuilt/shaders/samples/100 100 family_100 shaderfamilies
첫째로 reference와 donor를 요구하는데 둘 모두 같은 위치로 shader 파일들이 들어있는 폴더를 지정하면 된다.
둘째로 variant를 몇개 생성할 것인지 요구한다. 위 예시에서는 100
을 주었다.
셋째로 variant 이름을 지정한다. 위에서는 family_100
으로 주었다.
넷째로 variant를 만들 대상 폴더를 지정한다. 위에서는 shaderfamilies 폴더로 지정했으며, 해당 이름은 고정으로 필수로 shaderfamilies로 주어야 한다. (다른 이름을 사용할 경우 서버 실행에 옵션으로 주어야 한다)
glsl-server 실행
shaderfamilies가 있는 곳에 pwd를 옮기고 glsl-server를 실행한다. --port
옵션으로 포트를 지정할 수 있다.
서버를 실행하고 나면 http://<ip address>:<port>/webui로 웹 인터페이스를 볼 수 있다.
job 할당
Job 할당의 경우 Run shader families on workers
를 선택한 후 worker와 shader families를 지정해주면 된다. 이 이전에 worker가 실행되어야 worker 목록에 나오게 된다.
Worker를 실행하는 방법은 매우 간단히 주어진 gles-worker-desktop.jar
를 실행하면 된다.
예시 : java -ea -jar gles-worker-desktop.jar
--server
옵션으로 서버를 지정할 수도 있다. webui가 열려있는 서버를 지정해주면 된다.
예시 : java -ea -jar gles-worker-desktop.jar --server http://localhost:31337
'보안 > Fuzzing' 카테고리의 다른 글
AFLNET: A Greybox Fuzzer for Network Protocols (0) | 2021.01.19 |
---|