본문 바로가기

CTF/SEKAI CTF

[Rev] Matrix Lab 1

 

다운받은 파일을 열어보니 이상한 문자들이 나온다.

Olly Dbg 등 리버싱 툴에 넣어봤는데 달리 열리거나 뭔가 나타나지 않았다.

 

여기서 뭘 더 어떻게 해야할지 몰라 Write Up을 참고하였는데,

리버스 엔지니어링과 자바를 사용해야한다고 한다.

제공된 파일이 .class Java이었던 모양이다.

java class decompiler online을 사용하면 되는 모양이지만 아직 자바를 안배워서 생소하다.

 

public class Sekai {
    private static int length = 6;

    public static void main(String[] arrstring) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter the flag: ");
        String string = scanner.next();
        if (string.length() != 43) {
            System.out.println("Oops, wrong flag!");
            return;
        }
        String string2 = string.substring(0, 6);
        String string3 = string.substring(6, string.length() - 1);
        String string4 = string.substring(string.length() - 1);
        if (string2.equals("SEKAI{") && string4.equals("}")) {
            assert (string3.length() == 6 * 6);
            if (Sekai.solve((String)string3)) {
                System.out.println("Congratulations, you got the flag!");
            } else {
                System.out.println("Oops, wrong flag!");
            }
        } else {
            System.out.println("Oops, wrong flag!");
        }
    }

    public static String encrypt(char[] arrc, int n) {
        int n2;
        char[] arrc2 = new char[12];
        int n3 = 5;
        int n4 = 6;
        for (n2 = 0; n2 < 6 * 2; ++n2) {
            arrc2[n2] = arrc[n3--];
            arrc2[n2 + 1] = arrc[n4++];
            ++n2;
        }
        n2 = 0;
        while (n2 < 6 * 2) {
            int n5 = n2++;
            arrc2[n5] = (char)(arrc2[n5] ^ (char)n);
        }
        return String.valueOf(arrc2);
    }

    public static char[] getArray(char[][] arrc, int n, int n2) {
        int n3;
        char[] arrc2 = new char[6 * 2];
        int n4 = 0;
        for (n3 = 0; n3 < 6; ++n3) {
            arrc2[n4] = arrc[n][n3];
            ++n4;
        }
        for (n3 = 0; n3 < 6; ++n3) {
            arrc2[n4] = arrc[n2][6 - 1 - n3];
            ++n4;
        }
        return arrc2;
    }

    public static char[][] transform(char[] arrc, int n) { // 36 letters to 6*6 grid
        char[][] arrc2 = new char[n][n];
        for (int i = 0; i < n * n; ++i) {
            arrc2[i / n][i % n] = arrc[i];
        }
        return arrc2;
    }

    public static boolean solve(String string) {
        char[][] arrc = Sekai.transform(string.toCharArray(), 6);
        for (int i = 0; i <= 6 / 2; ++i) {
            for (int j = 0; j < 6 - 2 * i - 1; ++j) {
                char c = arrc[i][i + j];
                arrc[i][i + j] = arrc[6 - 1 - i - j][i];
                arrc[6 - 1 - i - j][i] = arrc[6 - 1 - i][6 - 1 - i - j];
                arrc[6 - 1 - i][6 - 1 - i - j] = arrc[i + j][6 - 1 - i];
                arrc[i + j][6 - 1 - i] = c;
            }
        }
        return "oz]{R]3l]]B#50es6O4tL23Etr3c10_F4TD2".equals(
            Sekai.encrypt(Sekai.getArray(arrc, 0, 5), 2) +
            Sekai.encrypt(Sekai.getArray(arrc, 1, 4), 1) +
            Sekai.encrypt(Sekai.getArray(arrc, 2, 3), 0);
    }
}

 

온라인 자바 플레이그라운드를 사용해 출력해준다.

 

수행하는 작업은 다음과 같다.

 

  1. SEKAI{...}문자열이 중괄호 사이에 36자를 포함하는 올바른 형식인지 확인 ( Sekai.main )
  2. 플래그 본체를 6*6 그리드에 배치 ( Sekai.transform )
  3. 그리드 항목을 교체 (시계 방향으로 90도 회전)( Sekai.solve )
  4. 0번째 및 5번째 행을 추출하고 전자를 반전된 후자 행 내용과 연결 ( 1,4및 2,3, Sekai.solve + Sekai.getArray 와 유사 ㄴ 결합된 행 내용을 다시 치환하고 Sekai.encrypt의 두 번째 인수로 XOR
  5. 마지막으로 세 부분이 연결되고 암호화된 문자열과 대조

이 단계는 수동으로도 쉽게 되돌릴 수 있다.

해당 방법으로 풀이한 이는 XOR 단계에만 Python을 사용했다고 한다.

 

솔직히, 진짜 솔직히, 뭐가 뭔지 뭘 어떻게 하는건지 모르겠다.

 

 

일단 온라인 자바 플레이그라운드에 가서 넣어봤는데 에러가 뜬다.

 

 

뭔가 입력하라길래 그 괴상한 파일 내용까지 넣어봤는데 안된다...

 

 

'CTF > SEKAI CTF' 카테고리의 다른 글

[Web] Bottle Poem  (0) 2022.11.18
[Programmig(PPC)] Let's Play Osu!Mania  (0) 2022.11.18