# Hash Brown - CakeCTF 2021 ###### tags: `CakeCTF 2021` `reversing` ## 概要 x64のELF。 ## 解析 フラグを引数として入力する。 IDAで読むとmainの処理はこんな感じ ```python assert len(flag) // 2 == 31 for i in range(31): j = f(i, 31) if v4 < 0: v4 += 31 a = md5(flag[i*2])[:5] b = sha256(flag[i*2+1])[:5] assert a == md5_ansList[i] assert b == sha256_ansList[j] ``` `f`を読む。 ```python def f(i, n): if n > 0: t, r = f(n, i % n) t -= i // n * r return r, t else: return 1, 0 ``` よく分からんけどそのまま使う。 ## 解法 ```python= import hashlib with open("hash_browns", "rb") as f: f.seek(0x20a0) md5List = [] for i in range(31): md5List.append(f.read(11).rstrip(b'\x00').decode()) f.seek(0x2200) sha256List = [] for i in range(31): sha256List.append(f.read(11).rstrip(b'\x00').decode()) def f(i, n): if n > 0: t, r = f(n, i % n) t -= i // n * r return r, t else: return 1, 0 flag = '' for i in range(31): j = f(i, 31)[0] if j < 0: j += 31 for c in range(0x100): if hashlib.md5(bytes([c])).hexdigest()[:10] == md5List[i]: break else: print("[-] Not found") exit(1) flag += chr(c) for c in range(0x100): if hashlib.sha256(bytes([c])).hexdigest()[:10] == sha256List[j]: break else: print("[-] Not found") exit(1) flag += chr(c) print(flag) ``` 動かすとすごい頭が悪そうなフラグが出てくる。 ## 感想・意見 - `f`何これ - 簡単解としてはstrcmpをltraceで見て総当りできるのでeasyで良さそう