ダウンロードしたファイルを実行すると、「Straight to the point. How many drinks you want?」、「OK. I need details of all the drinks. Give me 1 drink ids:」と、2回入力を求めてきます。ZorroPub 100 pts
ZorroPub
$ ./zorro_binまず、objdumpコマンドで逆アセンブルし、動作を確認します。
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 -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),%rax2回目の入力では17~65535の数値のみを受け付けます。
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> //終了
400a7b: e8 30 fe ff ff callq 4008b0 <__isoc99_scanf@plt>さらに、2進数で表したときに1が立つビットの数が10になる数値しか受け付けないようです。
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>
400af4: 83 85 0c ff ff ff 01 addl $0x1,-0xf4(%rbp) //e=e+1次のRubyプログラムで17~65535の範囲で2進数表記で1が立つビットが10である数値を求め、ファイル「A2.txt」に保存します。実行した結果、8008個該当しました。
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>
def numofbits1(bits)ということで、この8008個の数値を与えて結果を確認します。ファイル「A2.txt」から1行ずつ読み取り、ヒアドキュメントを使って、zorro_binに値を渡すシェルスクリプトを書きます。
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
cat A2.txt | while read lineシェルスクリプトを実行すると、入力値が59306のときにフラグが出力されました。
do
echo $line
./zorro_bin << EOS
1
$line
EOS
done
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}です。