コンテンツにスキップ

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日