Try   HackMD

Hash Brown - CakeCTF 2021

tags: CakeCTF 2021 reversing

概要

x64のELF。

解析

フラグを引数として入力する。
IDAで読むとmainの処理はこんな感じ

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を読む。

def f(i, n):
    if n > 0:
        t, r = f(n, i % n)
        t -= i // n * r
        return r, t
    else:
        return 1, 0

よく分からんけどそのまま使う。

解法

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で良さそう