728x90
반응형
https://github.com/googleprojectzero/domato
문법 퍼징
문맥 자유 문법(Context-Free Grammar, CFG)을 사용하여 테스트 데이터를 자동으로 생성하고, 이를 통해 소프트웨어의 결함을 찾아내는 기법
대상으로 하는 것
- domain
- program
- input
- what needs to be tested
문법 퍼징의 과정
- Grammer Definition
- specify a language
- Expansion rule : symbol expaned to other symbol
- nonterminal symbol
- terminal symbol : 표현의 끝?에 오는
- Test Case Generation
Domato
- DOM & javascript engine에 초점
- used to find vulnerabilities and bugs in the DOM
DOM
문서 객체 모델 (The document object model)
HTML, XML 문서의 프로그래밍 interface
프로그래밍 언어가 문서의 내용과 구조를 조작할 수 있게 해주는 인터페이스
- 웹 페이지를 수정하거나 생성하는데 사용되는 모든 property, method, event 들은 object로 구성됨
- 문서(document) 와 문서의 요소(element) 에 접근하기 위해 DOM 이 사용됨
API (web or XML page) = DOM + JS (scripting language)
Domato의 구성
generator.py
- 테스트 케이스 생성
- 사용자 입력을 받아 테스트 케이스를 생성하고 이를 파일로 저장함
- grammer.py를 라이브러리로 사용하여 테스트 케이스를 생성하는데 피요한 헬퍼 코드를 포함하고 있음
grammer.py
- 생성 엔진을 포함하는 파일
- application-agnostic (애플리케이션에 구애받지 않음) 하게 사용
.txt
- html, css, js의 문법 정의를 포함함
- 다른 문법 파일의 내용을 포함
- 복잡한 규칙 문법을 정의할 때 사용
generator.py 사용법
-f : File name which is to be generated in the same directory
-o : the output directory to put the generated files in
-n : number of files to be generated
-t : tamplate file you want to use
python generator.py --file output.html
Domato가 무작위로 생성한 HTML,CSS, JavaScript파일 (output.html)
python generator.py --file output.html --template custom_template.html
사용자 정의 템플릿 파일 (custom_template.html) 을 이용하여 output.html 파일 생성
python generator.py --output_dir testcases --no_of_files 10
testcases 디렉토리에 testcase_0.html, testcase_1.html, ..., testcase_9.html과 같은 이름의 파일 10개를 생성
generation engine and writing grammars
from grammar import Grammar
my_grammar = Grammar()
my_grammar.parse_from_file('input_file.txt')
result_string = my_grammar.generate_symbol('symbol_name')
- 설명: Grammar 클래스를 사용하여 문법 파일을 파싱하고, 지정된 심볼을 기반으로 문자열을 생성합니다.
- parse_from_file('input_file.txt'): 'input_file.txt' 파일에서 문법 규칙을 읽어들임.
- generate_symbol('symbol_name'): 'symbol_name' 심볼을 확장하여 문자열을 생성.
기본 문법 작성법
<symbol> = a mix of constants and <other_symbol>s
- 왼쪽: 확장할 심볼.
- 오른쪽: 심볼이 확장되는 방법을 정의. 고정 문자열과 다른 심볼을 혼합하여 작성.
- 각 규칙은 한 줄로 작성.
확장 규칙에 확률 적용
<selector p=0.9> = a
<selector p=0.1> = b
HTML 샘플 생성 예제
<html> = <lt>html<gt><head><body><lt>/html<gt>
<head> = <lt>head<gt>...<lt>/head<gt>
<body> = <lt>body<gt>...<lt>/body<gt>
- **<lt>**와 **<gt>**는 각각 '<'와 '>' 문자를 의미. 이들은 내장 심볼로 정의되어 있어 별도로 정의할 필요 없음.
프로그래밍 언어 코드 생성
!varformat fuzzvar%05d #생성될 변수의 형식 지정
# 변수이름이 fuzzervar로 시작하고 뒤에 5자리 숫자가 뭍는 형식
!lineguard try { <line> } catch(e) {} #각 코드 라인을 감싸는 형식 지정
# try블록 내에서 실행
!begin lines
#실제 코드 라인
<new element> = document.getElementById("<string min=97 max=122>");
<element>.doSomething();
!end lines
- 설명: 프로그래밍 언어 코드를 생성할 때는 문법이 보다 자유로운 형식으로 작성됩니다. 각 줄이 출력될 때, 변수들이 생성되고 재사용될 수 있습니다.
- !varformat: 변수 이름의 형식을 정의.
- !lineguard: 각 줄을 보호하기 위해 추가되는 코드 블록을 정의.
주석
- # 문자 이후의 모든 내용은 주석으로 간주.
무한 재귀 방지
!max_recursion 10
<test root=true> = <foobar>
<foobar> = foo<foobar>
<foobar nonrecursive> = bar
- !max_recursion: 최대 재귀 깊이를 정의 (기본값은 50).
- nonrecursive 속성은 최대 재귀 수준에 도달했을 때 무한 재귀를 피하기 위해 사용됨.
다른 문법 파일 포함 및 가져오기
!include other.txt
!import other.txt
<cssrule> = <import from=css.txt symbol=rule>
- !include: 다른 문법 파일의 내용을 현재 문법에 포함.
- !import: 다른 문법 파일을 별도의 네임스페이스로 가져옴. <import> 심볼을 사용하여 참조.
파이썬 코드 포함
!begin function savesize
context['size'] = ret_val
!end function
!begin function createbody
n = int(context['size'])
ret_val = 'a' * n
!end function
<foo root> = <header><cr><lf><body>
<header> = Size: <int min=1 max=20 beforeoutput=savesize>
<body> = <call function=createbody>
- 설명: 사용자 정의 파이썬 코드를 문법에 포함하여 보다 복잡한 작업을 수행할 수 있음.
- context: 샘플 생성 과정에서 값을 저장하고 검색하는 데 사용.
- ret_val: 함수 호출의 결과로 출력될 값.
내장 심볼
- <lt>, <gt>, <hash>, <cr>, <lf>, <space>, <tab>, <ex>, <char>, <hex>, <int>, <float>, <double>, <string>, <htmlsafestring>, <lines>, <import>, <call> 등의 내장 심볼은 특정 의미를 가지며 사용자가 재정의할 수 없음.
심볼 속성
- root, nonrecursive, new, from, symbol, count, id, min, max, b, be, code, minlength, maxlength, up, function, beforeoutput 속성을 지원.
728x90
반응형
'Hacking > Window' 카테고리의 다른 글
[Mitigation] Window VS Linux (0) | 2024.11.27 |
---|---|
[IDA Pro] 사용법 정리 (3) | 2024.07.21 |
MuseScore DoS Vulnerability Write Up (2) | 2024.07.18 |
PE(Portable Executable) file format (0) | 2024.05.06 |
[Fuzzing] WinAFL을 이용한 개념정리 (2) | 2024.05.05 |