crackme1
Baby's First, 15 points
crackme1_f92e0ab22352440383d58be8f046bebe.quals.shallweplayaga.me:10001
Files
objdumpコマンドで逆アセンブルします。
$ objdump -s -D 4a2181aaf70b04ec984c233fbe50a1fe600f90062a58d6b69ea15b85531b9652
まずenter code:とプロンプトが表示されます。次に入力した文字列を読み込んでc6c関数を呼び出しています。最後にsum isと出力してプログラム終了となっています。
0000000000000770 <.text>:
770: 53 push %rbx
771: be 51 00 00 00 mov $0x51,%esi
776: bf 01 00 00 00 mov $0x1,%edi
77b: e8 c8 ff ff ff callq 748 #calloc
780: 48 8d 3d 42 07 00 00 lea 0x742(%rip),%rdi #enter code:
787: 48 89 c3 mov %rax,%rbx
78a: e8 a1 ff ff ff callq 730 #puts
78f: 48 8b 3d 8a 18 20 00 mov 0x20188a(%rip),%rdi #<stdout>
796: e8 a5 ff ff ff callq 740 #fflush
79b: 48 8b 15 86 18 20 00 mov 0x201886(%rip),%rdx #<stdin>
7a2: be 50 00 00 00 mov $0x50,%esi
7a7: 48 89 df mov %rbx,%rdi
7aa: e8 79 ff ff ff callq 728 #fgets
7af: 48 89 df mov %rbx,%rdi
7b2: e8 b5 04 00 00 callq c6c #
7b7: 48 8d 3d 17 07 00 00 lea 0x717(%rip),%rdi #sum is %ld
7be: 48 89 c6 mov %rax,%rsi
7c1: 31 c0 xor %eax,%eax
7c3: e8 58 ff ff ff callq 720 #printf
7c8: 31 c0 xor %eax,%eax
7ca: 5b pop %rbx
7cb: c3 retq
それではc6c関数を見てみます。c6c関数の中では93b関数、955関数、971関数、・・・というように何度も関数をcallしています。
c6c: 55 push %rbpc6d: 53 push %rbxc6e: 48 89 fd mov %rdi,%rbpc71: 48 83 ec 08 sub $0x8,%rspc75: 48 0f be 3f movsbq (%rdi),%rdic79: e8 bd fc ff ff callq 93bc7e: 48 0f be 7d 01 movsbq 0x1(%rbp),%rdic83: 48 c1 f8 03 sar $0x3,%raxc87: 48 89 c3 mov %rax,%rbxc8a: e8 c6 fc ff ff callq 955c8f: 48 0f be 7d 02 movsbq 0x2(%rbp),%rdic94: 48 01 c3 add %rax,%rbxc97: 48 c1 fb 03 sar $0x3,%rbxc9b: e8 d1 fc ff ff callq 971(略)
93b関数では下記のとおり"y"と比較し、一致しない場合は1を終了コードとしてexit(プログラム終了)しています。
93b: 48 83 ff 79 cmp $0x79,%rdi #y93f: 74 0e je 94f <_init+0x257>941: 48 83 ec 08 sub $0x8,%rsp945: bf 01 00 00 00 mov $0x1,%edi94a: e8 09 fe ff ff callq 758 <_init+0x60> #exit94f: b8 a7 00 00 00 mov $0xa7,%eax954: c3 retq
955関数では"e"と比較して、一致しない場合は2を終了コードとしてexitしています。
955: 48 83 ff 65 cmp $0x65,%rdi #e959: 74 0e je 969 <_init+0x271>95b: 48 83 ec 08 sub $0x8,%rsp95f: bf 02 00 00 00 mov $0x2,%edi964: e8 ef fd ff ff callq 758 <_init+0x60> #exit969: 48 c7 c0 9b ff ff ff mov $0xffffffffffffff9b,%rax970: c3 retq
971関数では"s"と比較して、一致しない場合は3を終了コードとしてexitしています。
971: 48 83 ff 73 cmp $0x73,%rdi #s975: 74 0e je 985 <_init+0x28d>977: 48 83 ec 08 sub $0x8,%rsp97b: bf 03 00 00 00 mov $0x3,%edi980: e8 d3 fd ff ff callq 758 <_init+0x60> #exit985: b8 a0 00 00 00 mov $0xa0,%eax98a: c3 retq
以降も同様に1文字ずつ比較しています。その文字を全てつなげると下記の文字列になります。
ncコマンドでサーバに接続すると、base64で送信するように指示されます。yes and his hands shook with ex
$ nc crackme1_f92e0ab22352440383d58be8f046bebe.quals.shallweplayaga.me 10001send your solution as base64, followed by a newline
先ほど得た文字列をbase64でエンコードします。
このbase64エンコード文字列を入力すると、下記の通りフラグが得られます。$ echo yes and his hands shook with ex | base64eWVzIGFuZCBoaXMgaGFuZHMgc2hvb2sgd2l0aCBleAo=
フラグは、The flag is: important videos best playlist Wigeekuk8
important videos best playlist Wigeekuk8です。