ShinobiMind

basketball player and hacker will keep be childish.

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