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 |