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