CTF/암호학

[angstromCTF] impossible - 암호학 / Python

SecurityMan 2023. 5. 24. 11:00

 

암호학 두번째 문제

 

문제를 어이없게 풀어버려서 제대로된 풀이가 아니다.

 

반응형

 

서버에 원격접속할 수 있는 주소와

 

서버에서 돌아가고 있는 파이썬 코드가 주어진다.

 

#!/usr/local/bin/python

def fake_psi(a, b):
    return [i for i in a if i in b]

def zero_encoding(x, n):
    ret = []

    for i in range(n):
        if (x & 1) == 0:
            ret.append(x | 1)

        x >>= 1

    return ret

def one_encoding(x, n):
    ret = []

    for i in range(n):
        if x & 1:
            ret.append(x)

        x >>= 1

    return ret

print("Supply positive x and y such that x < y and x > y.")
x = int(input("x: "))
y = int(input("y: "))

if len(fake_psi(one_encoding(x, 64), zero_encoding(y, 64))) == 0 and x > y and x > 0 and y > 0:
    print(open("flag.txt").read())

 

문제에서 주어지는 코드는 이렇다.

 

사용자로부터 x 와 y 를 입력받고

 

x 에 대해 one_encoding,

 

y 에 대해 zero_encoding 함수를 수행한 다음

 

두 결과를 가지고 fake_psi 함수를 수행하고

 

그 길이가 0인지 검증한다.

 

이에 더해 x > y, x > 0, y > 0 인 상황이 만족되면

 

플래그가 출력되게 된다.

 

print(one_encoding(x, 64))
print(zero_encoding(y, 64))
print(fake_psi(one_encoding(x, 64), zero_encoding(y, 64)))
print(len(fake_psi(one_encoding(x, 64), zero_encoding(y, 64))) == 0)
print(x>0)
print(y>0)

 

이렇게 각 단계별로 print 를 추가해서

 

어떤 값이 나오는지 살펴봤다.

 

 

x 와 y 에 1을 각각 넣으면

 

첫번째와 두번째 줄처럼 결과가 나오는데

 

fake_psi 결과의 len 이 0 이 되려면

 

두 집합이 겹치는 원소가 없어야 한다.

 

몇가지 숫자를 조합해 넣어봤는데

 

무조건 1이 들어가서

 

이거 진짜 impossible 아니야? 라고 생각하면서

 

 

아무렇게나 대충 때려넣었는데

 

문제가 풀려버렸다;;

 

[493213433154296875, 246606716577148437, 61651679144287109, 15412919786071777, 481653743314743, 240826871657371, 120413435828685, 30103358957171, 15051679478585, 1881459934823, 940729967411, 470364983705, 58795622963, 29397811481, 3674726435, 1837363217, 114835201, 448575, 224287, 112143, 56071, 28035, 14017, 219, 109]

[1010111111110001, 505055555555001, 252527777777501, 126263888888751, 7891493055547, 1972873263887, 123304578993, 61652289497, 30826144749, 15413072375, 1926634047, 30103657, 15051829, 7525915, 1881479, 235185, 117593, 58797, 29399, 3675, 919, 115, 29, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

[]

True

True

True

 

각 단계를 print 해보면 이런 결과값이 나온다.

 

 

이런 간단한 코드로 된 암호학 문제는

 

ChatGPT 에 넣으면 풀 수 있지 않을까 하는 생각에

 

문제를 주고 어떤 입력값이 올바른지 물어봤다.

 

ChatGPT는 이진수 10000000 과 01111111 을 넣으면 된다고 알려줬다.

 

 

2진수 형태로도 넣어보고 10진수로도 넣어봤지만

 

넣어봤는데 아무일도 일어나지 않았다.

 

아직.. 인공지능이 갈길은 먼거같다.

반응형