[Rev] Decompile 문제 풀이

KBC·2024년 8월 30일

리버싱

목록 보기
7/11

1. rev-basic-0

IDA로 그냥 열어보면

대놓고 rodata 섹션에 flag가 존재한다.

2. rev-basic-1

이 문제도 마찬가지 IDA로 그냥 열어보고, View Strings 탭에 들어가보면 대놓고 flag가 있다.

3. rev-basic-2

IDA로 열어보면 main function이 이렇게 보인다

password를 입력받고 해당 password가 13과 XOR 연산한 결과가 flag와 일치해야 한다.
XOR 연산의 특성상 원본 데이터의 복원은 XOR 연산을 취한 값을 다시 한번 취해주면 된다.

비교하고 있는 배열을 찾아서 Python 코드를 통해 XOR연산을 취하고 원본 데이터를 유추해본다.

flag_list = ["Y", "K", "v", "u", "b", "", "R", "d", "~", "R", "h", "l", "~", "t", ",", "p"]
restored = []
for i in flag_list:
    restored.append(ord(i) ^ 13)
print("".join(chr(c) for c in restored))

TF{xor_is_easy!}

4. bubble

프로그램을 IDA로 까보면 main function은 아래와 같다

bubbleSort는 코드를 보니 진짜 bubbleSort하는 함수고 make_flag()라는 함수가 대놓고 있다.

bubbleSort 된 array를 하나씩 그냥 가져와서 출력한다.

데이터 섹션에 있는 얘를 버블정렬하고 다시 출력하면 flag값이 된다.

5. rev-basic-3

프로그램을 IDA로 까보면 main function은 다음과 같다.

좌우의 sub_401429와 sub_401196을 모두 만족해야 Correct 문자열을 반환한다.
먼저 왼쪽 함수부터 보면

이런식으로 되어있다 일단 순서대로 sub_4012DA부터 살펴봤는데

return으로 특정 문자열을 return하지만 상위 호출 함수에서 변수에 지정하지 않았기에 실제로는 아무 영향도 없다.
다음으로 sub_401254를 살펴보자

코드를 보니 올바른 input은 52글자여야 하나보다. 그리고 입력 받았던 문자열에 byte_404060배열의 값들과 XOR 연산을 취한다.
그리고 상위 함수에서 마지막으로 byte_4040A0에서 입력한 문자열의 ASCII 값의 인덱스 값으로 입력 문자열을 치환한다.
다시 main function의 우측 sub_401196을 살펴보자

살짝 어지러운 것 같지만 괜찮다. 대놓고 flag값 검증하는 알고리즘이다.
그럼 이제 python으로 무지성 대입을 하는 코드를 짜보자

def reverse_sub():
    flag = []
    for i in range(52):
        for c in range(256):  # 모든 가능한 ASCII 문자 시도
            temp = c
            c ^= byte_404060[i]
            c = byte_4040A0[c]
            if c <= byte_4041A0[i]:
                if (byte_4041A0[i] - c) == byte_4041E0[i]:
                    flag.append(temp)
                    break
            else:
                if (c - byte_4041A0[i]) == byte_4041E0[i]:
                    flag.append(temp)
                    break
    return flag
flag = reverse_sub()
print("".join(chr(c) for c in flag))

K0{bananaF.=_delic6ous_strawDerry_i8_also_delicioos
이런 문자열이 나오긴 하는데... 어딘가 나사가 하나씩 빠져있다. 대충 뜻을 유추해서 교정해보면
K0{banana_is_delicious_strawberry_is_also_delicious}
요렇게 flag값을 유추할 수 있다.

profile
AI, Security

0개의 댓글