# 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
