ㅇㅂㅇ

금고문 문제가 또 나왔다. 소스를 분석해보자.

 

import java.util.*;

class VaultDoor3 {
    public static void main(String args[]) {
        VaultDoor3 vaultDoor = new VaultDoor3();
        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!");
        }
    }

    // Our security monitoring team has noticed some intrusions on some of the
    // less secure doors. Dr. Evil has asked me specifically to build a stronger
    // vault door to protect his Doomsday plans. I just *know* this door will
    // keep all of those nosy agents out of our business. Mwa ha!
    //
    // -Minion #2671
    public boolean checkPassword(String password) {
        if (password.length() != 32) {
            return false;
        }
        char[] buffer = new char[32];
        int i;
        for (i=0; i<8; i++) {
            buffer[i] = password.charAt(i);
        }
        for (; i<16; i++) {
            buffer[i] = password.charAt(23-i);
        }
        for (; i<32; i+=2) {
            buffer[i] = password.charAt(46-i);
        }
        for (i=31; i>=17; i-=2) {
            buffer[i] = password.charAt(i);
        }
        String s = new String(buffer);
        return s.equals("jU5t_a_sna_3lpm18gb41_u_4_mfr340");
    }
}

아래쪽에 입력받은 패스워드를 검사하는 함수의 for문들을 차례대로 따라가보자.

 

"jU5t_a_sna_3lpm18gb41_u_4_mfr340" 길이가 32byte이기 때문에 비교에 사용될 것 같다.

 

 

첫 번째 for 문이다.

for (i=0; i<8; i++) {
	buffer[i] = password.charAt(i);
}

"jU5t_a_s" 이 저장된다.

 

 

두 번째 for 문이다.

for (; i<16; i++) {
	buffer[i] = password.charAt(23-i);
}

i = 8 이다.

"1mpl3_an" 이 저장된다.

 

 

세 번째 for 문이다.

for (; i<32; i+=2) {
	buffer[i] = password.charAt(46-i);
}

i = 16 이다.

"4?r?m?4?u?1?b?8?" 이 저장된다.

 

 

네 번째 for 문이다.

for (i=31; i>=17; i-=2) {
	buffer[i] = password.charAt(i);
}

i = 31 이다.

"?g?4?_?_?_?f?3?0" 이 저장된다.

3번째와 4번째 for문에서 저장되는 값은 i가 교차하기 때문에 엇갈리게 해줘야 한다. (주의)

 

 

for문을 전부 차례대로 따라가 보았다.

 

이어 붙이면 플래그가 완성될 것 같다.

 

플래그는 picoCTF{jU5t_a_s1mpl3_an4gr4m_4_u_1fb380} 이다.

'PicoCTF > WriteUp' 카테고리의 다른 글

[c0rrupt] - 250p  (0) 2020.12.01
[picobrowser] - 200p  (0) 2020.12.01
[plumbing] - 200p  (0) 2020.12.01
[Based] - 200p  (0) 2020.12.01
[So Meta] - 150p  (0) 2020.12.01

+ Recent posts