PicoCTF 2019 Writeups

27-oct-2019 by AJc0de5

Click here to start from the beginning of the series.

vault-door-1 - Points 100

The vault uses some complicated array! I hope you can make sense of it, special agent. The source code for this vault is here:

import java.util.*;

class VaultDoor1 {
    public static void main(String args[]) {
        VaultDoor1 vaultDoor = new VaultDoor1();
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter vault password: ");
	String userInput = scanner.next();
	String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
	if (vaultDoor.checkPassword(input)) {
	    System.out.println("Access granted.");
	} else {
	    System.out.println("Access denied!");
	}
    }

    // I came up with a more secure way to check the password without putting
    // the password itself in the source code. I think this is going to be
    // UNHACKABLE!! I hope Dr. Evil agrees...
    //
    // -Minion #8728
    public boolean checkPassword(String password) {
        return password.length() == 32 &&
               password.charAt(0)  == 'd' &&
               password.charAt(29) == '8' &&
               password.charAt(4)  == 'r' &&
               password.charAt(2)  == '5' &&
               password.charAt(23) == 'r' &&
               password.charAt(3)  == 'c' &&
               password.charAt(17) == '4' &&
               password.charAt(1)  == '3' &&
               password.charAt(7)  == 'b' &&
               password.charAt(10) == '_' &&
               password.charAt(5)  == '4' &&
               password.charAt(9)  == '3' &&
               password.charAt(11) == 't' &&
               password.charAt(15) == 'c' &&
               password.charAt(8)  == 'l' &&
               password.charAt(12) == 'H' &&
               password.charAt(20) == 'c' &&
               password.charAt(14) == '_' &&
               password.charAt(6)  == 'm' &&
               password.charAt(24) == '5' &&
               password.charAt(18) == 'r' &&
               password.charAt(13) == '3' &&
               password.charAt(19) == '4' &&
               password.charAt(21) == 'T' &&
               password.charAt(16) == 'H' &&
               password.charAt(27) == '3' &&
               password.charAt(30) == '4' &&
               password.charAt(25) == '_' &&
               password.charAt(22) == '3' &&
               password.charAt(28) == 'f' &&
               password.charAt(26) == '0' &&
               password.charAt(31) == '1';
    }
}

Solution

This is vault-door-1 Flag Problem in this one, the Flag is compared using a charAt() String method which compares the user input String with the Flag, but the problem here is the Minons clearly changed the order of comparing the characters, to solve this you need to rearrange them in the numerical order from 0 to 31, when you're done you can clearly see the Flag, after rearranging the code

         return password.length() == 32 &&
               password.charAt(0)  == 'd' &&
               password.charAt(1)  == '3' &&
               password.charAt(2)  == '5' &&
               password.charAt(3)  == 'c' &&
               password.charAt(4)  == 'r' &&
               password.charAt(5)  == '4' &&
               password.charAt(6)  == 'm' &&
               password.charAt(7)  == 'b' &&
               password.charAt(8)  == 'l' &&
               password.charAt(9)  == '3' &&
               password.charAt(10) == '_' &&
               password.charAt(11) == 't' &&
               password.charAt(12) == 'H' &&
               password.charAt(13) == '3' &&
               password.charAt(14) == '_' &&
               password.charAt(15) == 'c' &&
               password.charAt(16) == 'H' &&
               password.charAt(17) == '4' &&
               password.charAt(18) == 'r' &&
               password.charAt(19) == '4' &&
               password.charAt(20) == 'c' &&
               password.charAt(21) == 'T' &&
               password.charAt(22) == '3' &&
               password.charAt(23) == 'r' &&
               password.charAt(24) == '5' &&
               password.charAt(25) == '_' &&
               password.charAt(26) == '0' &&
               password.charAt(27) == '3' &&
               password.charAt(28) == 'f' &&
               password.charAt(29) == '8' &&
               password.charAt(30) == '4' &&
               password.charAt(31) == '1';		
						

now you can see the code says "descramble_the_characters_03f841" and the Flag is

picoCTF{d35cr4mbl3_tH3_cH4r4cT3r5_03f841}

To know how to run a java program, please refer this link