TMin: Fuzzing Test Case Optimizer

Tmin é um simples utilitário para facilitar a depuração de test cases complexos efetuados atraves de fuzzing. Ele é muito parecido com outra ferramenta deste tipo, delta, mas ele é melhor especialmente em caso de depurações de saídas desconhecidas, fora de padrão ou que o parse format seja difícil de lidar (sem a necessidade de utilizar tokens para re-serializar os dados), e por sua facil integração com UI externas para automatizar os testes.

Uma das features interessantes nele é a normalização alfabética para simplificar os test cases que não podem ser abreviados.

Exemplo de uso:

$ cat testcase.in

This is a lengthy and annoying hello world testcase.

$ cat testme.sh

#!/bin/bash

grep “el..*wo” || exit 0

exit 1

$ ../tmin -x ./testme.sh

tmin – complex testcase minimizer, version 0.03-beta (lcamtuf@google.com)

[*] Stage 0: loading ‘testcase.in’ and validating fault condition…

[*] Stage 1: recursive truncation (round 1, input = 53/53)

[*] Stage 1: recursive truncation (round 2, input = 27/53)

[*] Stage 1: recursive truncation (round 3, input = 14/53)

[*] Stage 1: recursive truncation (round 4, input = 10/53)

[*] Stage 1: recursive truncation (round 5, input = 8/53)

[*] Stage 1: recursive truncation (round 6, input = 7/53)

[*] Stage 2: block skipping (round 1, input = 7/53)

[*] Stage 2: block skipping (round 2, input = 6/53)

[*] Stage 2: block skipping (round 3, input = 5/53)

[*] Stage 3: alphabet normalization (round 1, charset = 5/5)

[*] Stage 3: alphabet normalization (round 2, charset = 5/5)

[*] Stage 4: character normalization (round 1, characters = 4/5)

[*] All done – writing output to ‘testcase.small’…

== Final statistics==

Original size : 53 bytes

Optimized size : 5 bytes (-90.57%)

Chars replaced : 1 (1.89%)

Efficiency : 9 good / 49 bad

Round counts : 1:6 2:3 3:2 4:1

$ cat testcase.small

el0wo

Detalhes

A ferramenta procura por um arquivo chamado testcase.in no mesmo diretório, e irá escrever um testcase.small minimo para aquele teste em especial. Para otimizar o test case para uma aplicação alvo, você pode simplesmente executar:

./tmin /path/to/program

Deste modo, tmin irá executar /path/to/program a cada ciclo, alimentando com o test case modificado o stdin do programa, e examinando a saída. O programa saindo com um sinal igual SIGSEGV será interpretado que o test case ainda esta funcionando. Você pode também utilizar –x command-line switch para modificar a lógica e tratar non-zero return codes como condições de erro.

non-zero return codes as fault conditions likewise, and -w file to save data to a specified location to be read by the tested application, instead of supplying it on stdin.

Para testes remotes, tmin suporta o –s command-line switch. Neste modo, o comportamento do programa especificado é ignorado e o tool espera por um sinal SIGUSR1 (clean execution) e SIGUSR2 (fault execution). Dois exemplos comuns são os abaixo:

./tmin -s -w local_file.txt /bin/true

./tmin -s nc 127.0.0.1 1234

Como mostrado acima, o nc será utilizado como um wrapper para a interação com o network service, e /bin/true será utilizado como um “decoy” enquanto o tmin escreve em arquivos locais.

Download:

Pode ser baixado aqui.

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s