Rolling My Own
tl;dr¶
MD5, asm
解法¶
プログラム中で、以下のデータを実行しているようです。
ただし、この時に rdi
に FLAG に関連する関数のアドレスが格納されています。
この関数は、rdi = 0x7b3dc26f1
の時に FLAG を出力してくれるようです。
+-----------------------------------+
| MD5(INPUT[0:4]+"GpLaMjEW")[16:24] |
+-----------------------------------+
| MD5(INPUT[4:8]+"pVOjnnmk")[4:12] |
+-----------------------------------+
| MD5(INPUT[8:12]+"RGiledp6")[14:22]|
+-----------------------------------+
| MD5(INPUT[12:16]+"Mvcezxls"[2:10])|
+-----------------------------------+
つまり、
mov rax, 0x7b3dc26f1
xchg rdi, rax
call rax
が実行されればいいです。メモリ上は以下。
+------------+
| 0x4889f848 |
+------------+
| 0xbff126dc |
+------------+
| 0xb3070000 |
+------------+
| 0x00ffd0?? |
+------------+
以上より、以下の条件を満たす入力を与える事で FLAG を得られます。
- MD5(INPUT[0:4]+"GpLaMjEW")[16:24] = "4889f848"
- MD5(INPUT[4:8]+"pVOjnnmk")[4:12] = "bff126dc"
- MD5(INPUT[8:12]+"RGiledp6")[14:22] = "b3070000"
- MD5(INPUT[12:16]+"Mvcezxls"[2:8]) = "00ffd0"
各条件毎に独立ですが、それぞれ \(256^4 = 4294967296\) 通りあるので、果報は寝て待てという事で寝てる間に Hash を探す事にしました。PC のスペックが悪いから仕方ないね。こういう時にチームメンバーがいると時間を短縮できるんですが。
しかし、Hash の候補も \(16^8 = 4294967296\) あるので本当にあるか分からないな...と思っていたら、朝になったら出力されていました。Foo!!
(バイナリ)
8e c6 f5 83 64 33 41 6e 64 43 30 6e 01 26 01 3c
最終更新日: 2021年4月8日