다운받은 파일을 열어보니 이상한 문자들이 나온다.
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);
}
}
온라인 자바 플레이그라운드를 사용해 출력해준다.
수행하는 작업은 다음과 같다.
- SEKAI{...}문자열이 중괄호 사이에 36자를 포함하는 올바른 형식인지 확인 ( Sekai.main )
- 플래그 본체를 6*6 그리드에 배치 ( Sekai.transform )
- 그리드 항목을 교체 (시계 방향으로 90도 회전)( Sekai.solve )
- 0번째 및 5번째 행을 추출하고 전자를 반전된 후자 행 내용과 연결 ( 1,4및 2,3, Sekai.solve + Sekai.getArray 와 유사 ㄴ 결합된 행 내용을 다시 치환하고 Sekai.encrypt의 두 번째 인수로 XOR
- 마지막으로 세 부분이 연결되고 암호화된 문자열과 대조
이 단계는 수동으로도 쉽게 되돌릴 수 있다.
해당 방법으로 풀이한 이는 XOR 단계에만 Python을 사용했다고 한다.
솔직히, 진짜 솔직히, 뭐가 뭔지 뭘 어떻게 하는건지 모르겠다.
일단 온라인 자바 플레이그라운드에 가서 넣어봤는데 에러가 뜬다.
뭔가 입력하라길래 그 괴상한 파일 내용까지 넣어봤는데 안된다...
'CTF > SEKAI CTF' 카테고리의 다른 글
[Web] Bottle Poem (0) | 2022.11.18 |
---|---|
[Programmig(PPC)] Let's Play Osu!Mania (0) | 2022.11.18 |