일단 문제는 정말 간단한데… 이게 순간 머리가 띵했다. 처음에 brute force를 시도했다가 너무 안 나와서 아닌줄 알았는데…ㅠㅜㅜㅠㅜㅠ
진짜 bruteforce 문제였다. 일단 내 아이디어는 결국 랜덤값의 범위를 잘 알면 풀기 쉽다.
PY</>
from secrets import randbelowimport stringwith open('flag', 'rb') as f: flag = f.read()fuzzy = [c + randbelow(len(string.ascii_letters)) for c in flag]print(fuzzy)
요기 보면 randbelow는 051의 값을 가져온다. (string.ascii_letters가 소문자, 대문자 영문의 개수를 더한 값이라..)
그래서 원래의 값들 중에서 +051의 값들이 랜덤으로 나온다는 것을 알 수 있다.
그러면 도대체 어떻게 알 수 있을까????
당연하게도 bruteforce로 풀 수 있다.
내가 푼 방법은 각 자리에서 저장했던 최솟값과 최댓값들의 차이가 모두 51이 난다면??? 그러면 아 그럼 지금 저장했던 최솟값이 정답인 것을 알 수 있다.
(생각보다 많이 오래걸린다…)
PY</>
from pwn import *p = remote("host3.dreamhack.games", 15552)encrypted_flag = list(map(int, p.recvline()[1:-2].split(b", ")))result = [256] * len(encrypted_flag)cmp_list = [0] * len(encrypted_flag)complete = Falsewhile not complete: p = remote("host3.dreamhack.games", 15552) current_flag = list(map(int, p.recvline()[1:-2].split(b", "))) complete = True for i in range(len(encrypted_flag)): result[i] = min(result[i], current_flag[i]) cmp_list[i] = max(cmp_list[i], current_flag[i]) if complete and cmp_list[i] - result[i] < 51: complete = Falsefor i in result: print(chr(i), end="")