[ Domato ] 사용법

2024. 5. 18. 18:38·Hacking/Pwnable
728x90
반응형

https://github.com/googleprojectzero/domato

 

GitHub - googleprojectzero/domato: DOM fuzzer

DOM fuzzer. Contribute to googleprojectzero/domato development by creating an account on GitHub.

github.com

 

문법 퍼징

문맥 자유 문법(Context-Free Grammar, CFG)을 사용하여 테스트 데이터를 자동으로 생성하고, 이를 통해 소프트웨어의 결함을 찾아내는 기법

 

대상으로 하는 것

  • domain
  • program
  • input
  • what needs to be tested

문법 퍼징의 과정

  1. Grammer Definition
    • specify a language
    • Expansion rule : symbol expaned to other symbol
    • nonterminal symbol
    • terminal symbol : 표현의 끝?에 오는
  2. 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 사용법

help

-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 > Pwnable' 카테고리의 다른 글

[Mitigation] Stack Canary  (0) 2024.08.24
gdb를 pwntools와 디버깅하기  (0) 2024.07.26
[Memory Corruption] Stack Buffer Overflow  (1) 2024.01.29
[Exploit] execve shell code  (2) 2024.01.27
[Exploit] orw shell code  (2) 2024.01.26
'Hacking/Pwnable' 카테고리의 다른 글
  • [Mitigation] Stack Canary
  • gdb를 pwntools와 디버깅하기
  • [Memory Corruption] Stack Buffer Overflow
  • [Exploit] execve shell code
min_zu
min_zu
  • min_zu
    민주제도
    min_zu
  • 전체
    오늘
    어제
    • ._. (176)
      • AI (2)
        • DeepLearning (2)
        • CS231n (0)
      • Web (2)
        • ReactJS (0)
      • CS (83)
        • OS (7)
        • Data Structure (23)
        • Computer Architecture (8)
        • Computer Network (20)
        • Algorithm (25)
      • Linux (3)
        • KaliLinux (0)
        • Docker (1)
      • Hacking (83)
        • Write Up (25)
        • Pwnable (13)
        • Reversing (2)
        • Cryptography (12)
        • Web Hacking (4)
        • Window (6)
        • Network (7)
        • Web3 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Web
    AI
    Mac
    Search
    Sort
    DeepLearning
    OS
    UTM
    ComputerArchitecture
    Graph
    Linux
    DataStructure
    WinAFL
    Tree
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min_zu
[ Domato ] 사용법
상단으로

티스토리툴바