Compy's Blog
330 words
2 minutes
[DreamHack] fuzzy flag

일단 문제는 정말 간단한데… 이게 순간 머리가 띵했다. 처음에 brute force를 시도했다가 너무 안 나와서 아닌줄 알았는데…ㅠㅜㅜㅠㅜㅠ

진짜 bruteforce 문제였다. 일단 내 아이디어는 결국 랜덤값의 범위를 잘 알면 풀기 쉽다.

from secrets import randbelow
import string

with 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이 난다면??? 그러면 아 그럼 지금 저장했던 최솟값이 정답인 것을 알 수 있다. (생각보다 많이 오래걸린다…)

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 = False

while 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 = False

for i in result:
    print(chr(i), end="")
[DreamHack] fuzzy flag
https://compy07.github.io/Blog/posts/security/crypto/dreamhack/level_1/fuzzy_flag/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2024-09-18