Flag Checker Solver

Uma utilização da biblioteca angr é a criação de scripts para resolver programas que verificam se o input do usuário se corresponde à flag. O Arquivo script.py possuí um script simples para a resolução desses tipos de programas.

Utilização

Para a utilização do script, é preciso se atentar em algumas parte dos código.

No começo do script, é preciso alterar o tamanho da flag em FLAG_LEN e colocar o nome do programa. Além disso, é importante colocar o endereço base do programa. Esse endereço pode ser encontrado em ferramentas como o ghidra, porém, se o programa possui PIE, o endereço base padrão será 0x400000.

project = angr.Project("./nome_do_executavel", main_opts={'base_addr': 0x400000}, auto_load_libs=False)

Além disso, é preciso alterar o estado inicial com o argumento com o nome do executável:

state = project.factory.full_init_state(
        args=['./nome_do_executavel'],
        add_options=angr.options.unicorn,
        stdin=flag,
)

A parte mais importante do funcionamento do script, é a definição das variáveis good_address e avoid_address. Essas variáveis vão dizer para a função explore quais endereços que são acessados quando o programa recebe o input correto e quando recebe o input incorreto. Então, a variável good_address deve receber algum endereço que só é acessado quando o usuário digita a flag correta, e avoid_address deve receber algum endereço que só é acessado quando o usuário digita o input incorreto.

# Exemplo de endereços
good_address = 0x40111d

avoid_address = 0x401100

sm.explore(find=good_address, avoid=avoid_address)

Referências

Script Utilizado: https://github.com/Dvd848/CTFs/blob/master/2020_GoogleCTF/Beginner.md

Atualizado