CTF/1337UP LIVE CTF 2022
[Clear]1337UP LIVE CTF Warmup Encoder Writeup
Vardy
2022. 3. 14. 06:50
주어진 파일은 아래와 같다.
# ENCRYPT.py
from sympy import isprime, prime
flag = '<REDACTED>'
def Ord(flag):
x0r([ord(i) for i in flag])
def x0r(listt):
ff = []
for i in listt:
if isprime(i) == True:
ff.append(prime(i) ^ 0x1337)
else:
ff.append(i ^ 0x1337)
b1n(ff)
def b1n(listt):
ff = []
for i in listt:
ff.append(int(bin(i)[2:]))
print(ff)
if __name__ == "__main__":
Ord(flag)
'''
OUTPUT :
[1001100000110, 1001100000100, 1001100000100, 1001100000000, 1001101100010, 1001101100111, 1001101001100, 1001101001111, 1001100000111, 1001101000101, 1001101101000, 1001100000011, 1001101011001, 1001101110011, 1001101101000, 1001101110101, 1001101011110, 1001101011001, 1001100000011, 1001011001010, 1001101100101, 1001101001110, 1001101101000, 1001101110010, 1001101011001, 1001001111100, 1001100000111, 1001101010011, 1001100000100, 1001101000101, 1001101101000, 1001100000011, 1001101000101, 1001100000100, 1001101101000, 1001101000011, 1001101111111, 1001100000100, 1001101101000, 1001101100000, 1001100000100, 1001100000011, 1000101111100, 1001100000100, 1001111000110, 1001101000011, 1001101101000, 1001100001111, 1001100000111, 1001100000000, 1001100001110, 1001100000111, 1001100000000, 1001111000110, 1001100000001, 1001101001010]
'''
isprime() 함수는 소수여부를 판단하는 함수이고, prime(n) 함수는 n번째 소수를 찾는 함수임을 참고하여 아래와같이 역연산 코드를 작성하였다.
# ex.py
from sympy import isprime, prime
import sympy
import math
flag = '1337UP{testflag}'
def Ord(flag):
x0r([ord(i) for i in flag])
def x0r(listt):
print("[*] ord(i) = ")
print(listt)
ff = []
for i in listt:
print("[*] i = "+str(i))
if isprime(i) == True:
print("[*] before prime(i) = "+str(i))
print("[*] after prime(i) = "+str(prime(i)))
ff.append(prime(i) ^ 0x1337)
else:
ff.append(i ^ 0x1337)
print("[*] ff = ")
print(ff)
b1n(ff)
def b1n(listt):
ff = []
for i in listt:
ff.append(int(bin(i)[2:]))
print(ff)
for i in range(len(ff)) :
rollback = "0b"+str(ff[i])
print(int(rollback,2))
print((ff[i]))
print(rollback)
print(type(ff[i]))
def x0r_decypt(listt) :
ff = []
for i in listt :
ff.append(i ^ 0x1337)
return ff
if __name__ == "__main__":
Ord(flag)
OUTPUT = [1001100000110, 1001100000100, 1001100000100, 1001100000000, 1001101100010, 1001101100111, 1001101001100, 1001101001111, 1001100000111, 1001101000101, 1001101101000, 1001100000011, 1001101011001, 1001101110011, 1001101101000, 1001101110101, 1001101011110, 1001101011001, 1001100000011, 1001011001010, 1001101100101, 1001101001110, 1001101101000, 1001101110010, 1001101011001, 1001001111100, 1001100000111, 1001101010011, 1001100000100, 1001101000101, 1001101101000, 1001100000011, 1001101000101, 1001100000100, 1001101101000, 1001101000011, 1001101111111, 1001100000100, 1001101101000, 1001101100000, 1001100000100, 1001100000011, 1000101111100, 1001100000100, 1001111000110, 1001101000011, 1001101101000, 1001100001111, 1001100000111, 1001100000000, 1001100001110, 1001100000111, 1001100000000, 1001111000110, 1001100000001, 1001101001010]
OUTPUT_int = []
for i in range(len(OUTPUT)) :
rollback = "0b"+str(OUTPUT[i])
a = int(rollback,2)
print(a)
print(type(a))
OUTPUT_int.append(a)
print(OUTPUT_int)
OUTPUT_int_xor = []
OUTPUT_int_xor = x0r_decypt(OUTPUT_int)
print(OUTPUT_int_xor)
primes = list(sympy.primerange(0, 1000))
realflag = ''
for i in range(len(OUTPUT_int_xor)) :
if isprime(OUTPUT_int_xor[i]) == False :
realflag += chr(OUTPUT_int_xor[i])
else :
print(OUTPUT_int_xor[i])
for j in range(1,168) :
if prime(j) == OUTPUT_int_xor[i] :
realflag += chr(j)
print(realflag)
FLAG = 1337UP{x0r_4nD_Bin4aRy_EnC0d3r_4r3_tH3_W34k35t_80790756}
반응형