CTF/리버싱

[n00bzCTF] EZrev - 리버싱 / Java

SecurityMan 2023. 7. 3. 11:00

 

Java 리버싱과 관련된 문제

 

코드만 천천히 따라가면 그렇게 어렵지 않다.

 

반응형

 

 

문제에서 주어지는 파일은

 

EZrev.class 파일이다.

 

.class 파일은 바로 내용을 확인할 순 없고

 

디컴파일을 해야한다.

 

http://www.javadecompilers.com/

 

Java decompiler online

 

www.javadecompilers.com

 

.class 파일을 온라인으로 디컴파일 해주는 사이트가 있다.

 

 

해당 사이트에서

 

파일을 업로드하고 Decompile 버튼을 눌러주면 된다.

 

import java.util.Arrays;

// 
// Decompiled by Procyon v0.5.36
// 

public class EZrev
{
    public static void main(final String[] array) {
        if (array.length != 1) {
            System.out.println("L");
            return;
        }
        final String s = array[0];
        if (s.length() != 31) {
            System.out.println("L");
            return;
        }
        final int[] array2 = s.chars().toArray();
        for (int i = 0; i < array2.length; ++i) {
            if (i % 2 == 0) {
                array2[i] = (char)(array2[i] ^ 0x13);
            }
            else {
                array2[i] = (char)(array2[i] ^ 0x37);
            }
        }
        for (int j = 0; j < array2.length / 2; ++j) {
            if (j % 2 == 0) {
                final int n = array2[j] - 10;
                array2[j] = (char)(array2[array2.length - 1 - j] + 20);
                array2[array2.length - 1 - j] = (char)n;
            }
            else {
                array2[j] = (char)(array2[j] + 30);
            }
        }
        if (Arrays.equals(array2, new int[] { 130, 37, 70, 115, 64, 106, 143, 34, 54, 134, 96, 98, 125, 98, 138, 104, 25, 3, 66, 78, 24, 69, 91, 80, 87, 67, 95, 8, 25, 22, 115 })) {
            System.out.println("W");
        }
        else {
            System.out.println("L");
        }
    }
}

 

디컴파일 결과는 이렇게 나온다.

 

어떤 입력에 따라서 W 또는 L 을 프린트하는데

 

Win 과 Lose 의 약자인듯 하다.

 

Win이 나오게끔 하는 입력을 찾아야 한다.

 

우선은 입력값의 길이가 31을 만족해야 한다.

 

그런다음, 입력값의 길이만큼 for 문을 진행하면서

 

짝수번째 있는 값은 0x13과 XOR,

 

홀수번째 있는 값은 0x37과 XOR 을 한다.

 

그 다음으로 입력값 길이의 절반만큼 for 문을 진행하면서

 

짝수번째 있는 값은 뭔가 이것저것 연산을 하고,

 

홀수번째 있는 값은 해당 값에 +30을 해준다.

 

어떻게 돌아가는지 대충 알았으니

 

쉬운 Python을 이용해서 역으로 계산하는 코드를 짜주면 된다.

 

arr = [130, 37, 70, 115, 64, 106, 143, 34, 54, 134, 96, 98, 125, 98, 138, 104, 25, 3, 66, 78, 24, 69, 91, 80, 87, 67, 95, 8, 25, 22, 115]

for i in range(15):
    if(i%2 == 0):
        arr[i], arr[30-i] = arr[30-i]+10, arr[i]-20
    else:
        arr[i] -= 30
        
for i in range(31):
    if(i%2 == 0):
        arr[i] ^= 0x13
    else:
        arr[i] ^= 0x37
        
for i in range(31):
    print(chr(arr[i]), end="")

 

이렇게 하나씩 거꾸로 써내려가면 아주 쉽다.

 

 

코드를 실행시키면

 

플래그가 잘 출력되는것을 볼 수 있다.

반응형