본문 바로가기

CTF/SWING CTF 2023

[Rev] Random Defense

prob.py
0.00MB

import random

FLAG = b'????' # You must find it!

if __name__ == '__main__':
    random.seed(5952)
    random_table = bytearray(random.randrange(1, 255) for _ in range(32)) 
    xor_bytes = bytearray(random_table[i] ^ FLAG[i] for i in range(32)) #랜덤한 테이블과 xor
    random.shuffle(xor_bytes) #xor된 배열을 shuffle
    assert xor_bytes == b'\x0ea3\x1dq\x98\n\xab\xf9\xec\x95\xd4#\x8d+-,\xa7\x9d\x85\xd1\xf1\xa0\xbb\x89z\xc9\x83\x19\xb3\x91Z'
    print('Oh y0u f1nd th3 fl4G~!')

 

실행결과는...

 

일단 위의 코드는 flag 문자열을 읽어와서 xor하는데 이 값을 랜덤하게 셔플한다.

코드 해석은 주석으로 달아놓겠다.

 

그리고 셔플한 결과값이 '\x0ea3\x1dq\x98\n\xab\xf9\xec\x95\xd4#\x8d+-,\xa7\x9d\x85\xd1\xf1\xa0\xbb\x89z\xc9\x83\x19\xb3\x91Z'와 같으면 flag를 맞혔다는 것이다.

 

random seed가 5952로 고정된 것을 알 수 있다. 그럼 생성되는 랜덤값이 늘 같다.

 

같은 seed 값으로 셔플해서 테이블을 만들고 그걸 이용해 역연산해 flag를 구하는 코드이다.

 

import random

shuffled_enc=b'\x0ea3\x1dq\x98\n\xab\xf9\xec\x95\xd4#\x8d+-,\xa7\x9d\x85\xd1\xf1\xa0\xbb\x89z\xc9\x83\x19\xb3\x91Z'

random.seed(5952)
original_table = bytearray(random.randrange(1, 255) for _ in range(32))
random.seed(5952)
shuffled_table = bytearray(random.randrange(1, 255) for _ in range(32))
random.shuffle(shuffled_table)

shuffled_index = {original_table.index(value): shuffled_table.index(value) for value in original_table}
print(shuffled_index)

enc = [0] * 32
for i, j in shuffled_index.items():
    enc[i] = shuffled_enc[j]
    
flag = ''
for i in range(32):
    flag += chr(enc[i] ^ original_table[i])
print(flag)

 

 

'CTF > SWING CTF 2023' 카테고리의 다른 글

[Misc] Nogada  (0) 2023.08.05
[Rev] Unsolvable  (0) 2023.08.05
[Rev] README  (0) 2023.08.05
[Rev] Simple VM  (0) 2023.08.05
[Misc] Click  (0) 2023.08.05