ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Clear]1337UP LIVE CTF Warmup Encoder Writeup
    CTF/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}

    반응형

    댓글

Designed by Tistory.