W tym poście chciałbym opisać rozwiązania zadania Binary Search z działu General Skills picoCTF.
Do zadania dołączony skrypt:
- #!/bin/bash
- # Generate a random number between 1 and 1000
- target=$(( (RANDOM % 1000) + 1 ))
- echo "Welcome to the Binary Search Game!"
- echo "I'm thinking of a number between 1 and 1000."
- # Trap signals to prevent exiting
- trap 'echo "Exiting is not allowed."' INT
- trap '' SIGQUIT
- trap '' SIGTSTP
- # Limit the player to 10 guesses
- MAX_GUESSES=10
- guess_count=0
- while (( guess_count < MAX_GUESSES )); do
- read -p "Enter your guess: " guess
- if ! [[ "$guess" =~ ^[0-9]+$ ]]; then
- echo "Please enter a valid number."
- continue
- fi
- (( guess_count++ ))
- if (( guess < target )); then
- echo "Higher! Try again."
- elif (( guess > target )); then
- echo "Lower! Try again."
- else
- echo "Congratulations! You guessed the correct number: $target"
- # Retrieve the flag from the metadata file
- flag=$(cat /challenge/metadata.json | jq -r '.flag')
- echo "Here's your flag: $flag"
- exit 0 # Exit with success code
- fi
- done
- # Player has exceeded maximum guesses
- echo "Sorry, you've exceeded the maximum number of guesses."
- exit 1 # Exit with error code to close the connection
Zadanie polega na zgadywaniu liczb. Na samym początku losowane jest wartość z zakresu od 1 do 1000, z maksymalną liczbą prób zgadnięcia wynoszącą 10. W odpowiedzi na wartości przekazuje informacje Lower/Higher lub Congratulation.
Procedurę należy przeprowadzić w oparciu o wyszukiwanie binarne. Tutaj całą tablicę dzielimy na pół, i wiemy czy następne ma być większe czy niższe.
- Welcome to the Binary Search Game!
- I'm thinking of a number between 1 and 1000.
- Enter your guess: 500
- Lower! Try again.
- Enter your guess: 250
- Lower! Try again.
- Enter your guess: 125
- Lower! Try again.
- Enter your guess: 65
- Lower! Try again.
- Enter your guess: 30
- Lower! Try again.
- Enter your guess: 15
- Higher! Try again.
- Enter your guess: 23
- Lower! Try again.
- Enter your guess: 18
- Higher! Try again.
- Enter your guess: 20
- Congratulations! You guessed the correct number: 20
- Here's your flag: picoCTF{g00d_gu355_bee04a2a}
Należy wykonywać odpowiednio duże skoki najlepiej, zgodnie z zasadą w wyszukiwaniu binarnym. Czyli należy dzielić pozostały zakres na pół i przechodzić do kolejnego zgadywania. Jeśli kroki będą zbyt niskie, może nie udać się odgadnąć flagi w 10 krokach.