ZorroPub 100 pts

ZorroPub



zorro_bin

ダウンロードしたファイルを実行すると、「Straight to the point. How many drinks you want?」、「OK. I need details of all the drinks. Give me 1 drink ids:」と、2回入力を求めてきます。
$ ./zorro_bin
Welcome to Pub Zorro!!
Straight to the point. How many drinks you want?1   
OK. I need details of all the drinks. Give me 1 drink ids:2
Invalid Drink Id.
Get Out!!
まず、objdumpコマンドで逆アセンブルし、動作を確認します。
$ objdump -s -D zorro_bin > aaa.txt
以下の箇所でscanf関数で1回目の入力を受け付けています。入力値は%eaxに格納されていますので、test %eax, %eaxで0との比較を行い、jg(より大きい場合jump)命令が続いています。入力値が0以下の場合は、”You are too drunk!! Get Out!!”とメッセージを表示して、プログラム終了します。
  400a08:    48 8d 85 fc fe ff ff     lea    -0x104(%rbp),%rax
  400a0f:    48 89 c6                 mov    %rax,%rsi
  400a12:    bf c1 0d 40 00           mov    $0x400dc1,%edi                //%d
  400a17:    b8 00 00 00 00           mov    $0x0,%eax
  400a1c:    e8 8f fe ff ff           callq  4008b0 <__isoc99_scanf@plt>
  400a21:    8b 85 fc fe ff ff        mov    -0x104(%rbp),%eax
  400a27:    85 c0                    test   %eax,%eax                    //if(eax==0)
  400a29:    7f 19                    jg     400a44 <rand@plt+0x184>        //より大きい場合jump
  400a2b:    bf c4 0d 40 00           mov    $0x400dc4,%edi                //You are too drunk!! Get Out!!
  400a30:    b8 00 00 00 00           mov    $0x0,%eax
  400a35:    e8 b6 fd ff ff           callq  4007f0 <printf@plt>
  400a3a:    bf ff ff ff ff           mov    $0xffffffff,%edi                //-1
  400a3f:    e8 ec fd ff ff           callq  400830 <exit@plt>            //終了
2回目の入力では17~65535の数値のみを受け付けます。
  400a7b:    e8 30 fe ff ff           callq  4008b0 <__isoc99_scanf@plt>
  400a80:    8b 85 00 ff ff ff        mov    -0x100(%rbp),%eax
  400a86:    83 f8 10                 cmp    $0x10,%eax                    //if(eax==16)
  400a89:    7e 0d                    jle    400a98 <rand@plt+0x1d8>        //小さいか等しい場合jump
  400a8b:    8b 85 00 ff ff ff        mov    -0x100(%rbp),%eax
  400a91:    3d ff ff 00 00           cmp    $0xffff,%eax                    //if(eax==65535)
  400a96:    7e 23                    jle    400abb <rand@plt+0x1fb>        //小さいか等しい場合jump
  400a98:    bf 24 0e 40 00           mov    $0x400e24,%edi                //Invalid Drink Id.
  400a9d:    e8 7e fd ff ff           callq  400820 <puts@plt>
さらに、2進数で表したときに1が立つビットの数が10になる数値しか受け付けないようです。
  400af4:    83 85 0c ff ff ff 01     addl   $0x1,-0xf4(%rbp)                //e=e+1
  400afb:    8b 85 04 ff ff ff        mov    -0xfc(%rbp),%eax                //eax=c
  400b01:    83 e8 01                 sub    $0x1,%eax                    //eax=eax-1
  400b04:    21 85 04 ff ff ff        and    %eax,-0xfc(%rbp)                //c=eax&c
  400b0a:    83 bd 04 ff ff ff 00     cmpl   $0x0,-0xfc(%rbp)                //if(c==0)
  400b11:    75 e1                    jne    400af4 <rand@plt+0x234>        //等しくない場合jump
  400b13:    83 bd 0c ff ff ff 0a     cmpl   $0xa,-0xf4(%rbp)                //if(e==10)
  400b1a:    74 1e                    je     400b3a <rand@plt+0x27a>        //等しい場合jump
  400b1c:    bf 40 0e 40 00           mov    $0x400e40,%edi                //Looks like its a dangerous combination of drinks right there.
  400b21:    e8 fa fc ff ff           callq  400820 <puts@plt>
次のRubyプログラムで17~65535の範囲で2進数表記で1が立つビットが10である数値を求め、ファイル「A2.txt」に保存します。実行した結果、8008個該当しました。

def numofbits1(bits)
  num = 0
  eax = bits - 1
  aaa = bits & eax
  num = num + 1
  while(aaa != 0) do
    num = num + 1
    eax = aaa - 1
    aaa = aaa & eax
  end
  num
end

for num in 17..65535 do
  if numofbits1(num) == 10
    p num
  end
end
ということで、この8008個の数値を与えて結果を確認します。ファイル「A2.txt」から1行ずつ読み取り、ヒアドキュメントを使って、zorro_binに値を渡すシェルスクリプトを書きます。
cat A2.txt | while read line
do
echo $line
./zorro_bin << EOS
1
$line
EOS
done
シェルスクリプトを実行すると、入力値が59306のときにフラグが出力されました。
59306
Welcome to Pub Zorro!!
Straight to the point. How many drinks you want?OK. I need details of all the drinks. Give me 1 drink ids:
You choose right mix and here is your reward: The flag is nullcon{nu11c0n_s4yz_x0r1n6_1s_4m4z1ng}
フラグは、
nullcon{nu11c0n_s4yz_x0r1n6_1s_4m4z1ng}
です。

デバッガによるx86プログラム解析入門【x64対応版】
Digital Travesia管理人 うさぴょん
秀和システム
2014-10-22