-
[Clear]1337UP LIVE CTF Warmup Encoder WriteupCTF/1337UP LIVE CTF 2022 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}
반응형'CTF > 1337UP LIVE CTF 2022' 카테고리의 다른 글
[Clear] 1337UP LIVE CTF 2022 Traveler Writeup (0) 2022.03.14 [Clear]1337UP LIVE CTF Mirage Writeup (0) 2022.03.14 [Clear]1337UP LIVE CTF Lovely Kitten Pictures 1 Writeup (0) 2022.03.14