ASIS CTF Final 2017 Reversing ABC
今回は問題を解くことができませんでした。備忘録として残します。
Challenge
Description: Start Reverse
Solution
64bitのELFファイルが与えられます。ひとまず実行してみます。
$ ./abc
give me flag... :D
$ ./abc 12345
Sorry, try harder :(
引数に期待される文字列を入力する問題のようです。
$ ltrace ./abc 12345
...
...
...
strcmp("fb644351560d8296fe6da332236b1f8d"...,"69fc8b9b1cdfe47e6b51a6804fc1dbdd"...) = 48
puts("Sorry, try harder :("Sorry, try harder :( ) = 21
入力した文字列に対して、なんらかの文字列変換を行った後、固定値"69fc8b9b1cdfe47e6b51a6804fc1dbdd"と文字列比較をしています。入力文字列が9文字の場合と、10文字の場合で比較する文字列が変わらないことから、入力文字列は9文字かもしれません。
デコンパイルをしてみます。0x400876の引数入力チェック後の0x4008baの関数が怪しそうです。mallocで3回に分けてメモリ領域を確保しており、それぞれを、0x4024dfの関数に食わせてます。var_168に4byte、var_158に4byte、var_160に4byte入れておりますが、var_158は4byte目から6byteなので、入力値は12文字であることが分かります。
何故、(var_190 + 0x8)が入力引数の先頭アドレスなのか分かりません…分かる方は教えて頂けると幸いです。
おそらく、0x4024dfが何らかの文字列変換をさせる関数なんじゃないかと思います。中に入っていくと、かなり複雑なことをしていそうです。。。0x400cc6を見るといくつかの固定文字列(例 0x5a827999)とAND演算をしていました。0x5a827999をググってみると、SHA-1の記事が多数引っ掛かります。0x4024dfはSHA-1のハッシュ関数だと推定します。(推定ばっかりだなぁ org…)
0x4008baの最後のif文を見ると、次の条件でflagを手に入れる事が出来ることが分かります。
- 入力引数3-8文字のSHA-1ハッシュ値が"69fc8b9b1cdfe47e6b51a6804fc1dbdd"
- 入力引数1-4文字が入力引数9-12文字未満であること。
- 入力引数1-4文字のハッシュ値の先頭4文字が、自身と同じであること。
- 入力引数9-12文字のハッシュ値の先頭4文字が、自身と同じであること。
1-4文字と入力引数9-12を求めるスクリプトを書きました。無駄のあるスクリプトですが、数分で2パターンが見つかりました。
#!/usr/bin/env python import random import hashlib while True: arg = '' for num in range(4): arg += random.choice('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') hash = hashlib.sha1(arg).hexdigest() if hash[:4] == arg: print "arg is " + arg print "sha1 hash is " + hash break #arg is 57d9 #arg is b53a
入力引数は57d9****b53aであることが分かりました。
ここまでは、CTF開催時間で出来ました。
残りの4byteを調べます。 hashcatを使うと早いようです。不明文字は4文字ですが、推定のところが間違っているかもしれないですし、6文字で調べてみます。
hashcat64 -m 100 -a 3 69fc8b9b1cdfe47e6b51a6804fc1dbddba1ea1d9 ?a?a?a?a?a?a
結果まで9時間かかりました。
69fc8b9b1cdfe47e6b51a6804fc1dbddba1ea1d9:$HEX[393a2d2a2962]
asciiコード表と照らし合わせると、6文字は"9:-)b"であることが分かります。
つまり、入力引数は"57d9:-)b53a"です。
Sweets
“57d9:-*)b53a"を入力引数にして実行させてみます。
$ ./abc 57d9:-*)b53a
bash: syntax error near unexpected token `)'
$ ./abc 57d9:-*\)b53a
gj, you got the flag: ASIS{477408a4d4ad68aa7abdfd2be0e4717154497c42}
flagを入手できました。
brush
表面をなめただけの気がします。アセンブラともっと仲良くなりたいorg