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