crackme1

Baby's First, 15 points


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   %rbp
 c6d: 53                   push   %rbx
 c6e: 48 89 fd             mov    %rdi,%rbp
 c71: 48 83 ec 08           sub    $0x8,%rsp
 c75: 48 0f be 3f           movsbq (%rdi),%rdi
 c79: e8 bd fc ff ff       callq  93b
 c7e: 48 0f be 7d 01       movsbq 0x1(%rbp),%rdi
 c83: 48 c1 f8 03           sar    $0x3,%rax
 c87: 48 89 c3             mov    %rax,%rbx
 c8a: e8 c6 fc ff ff       callq  955
 c8f: 48 0f be 7d 02       movsbq 0x2(%rbp),%rdi
 c94: 48 01 c3             add    %rax,%rbx
 c97: 48 c1 fb 03           sar    $0x3,%rbx
 c9b: e8 d1 fc ff ff       callq  971
 (略)
93b関数では下記のとおり"y"と比較し、一致しない場合は1を終了コードとしてexit(プログラム終了)しています。
 93b: 48 83 ff 79           cmp    $0x79,%rdi #y
 93f: 74 0e                 je     94f <_init+0x257>
 941: 48 83 ec 08           sub    $0x8,%rsp
 945: bf 01 00 00 00       mov    $0x1,%edi
 94a: e8 09 fe ff ff       callq  758 <_init+0x60> #exit
 94f: b8 a7 00 00 00       mov    $0xa7,%eax
 954: c3                   retq   
 955関数では"e"と比較して、一致しない場合は2を終了コードとしてexitしています。
 955: 48 83 ff 65           cmp    $0x65,%rdi #e
 959: 74 0e                 je     969 <_init+0x271>
 95b: 48 83 ec 08           sub    $0x8,%rsp
 95f: bf 02 00 00 00       mov    $0x2,%edi
 964: e8 ef fd ff ff       callq  758 <_init+0x60> #exit
 969: 48 c7 c0 9b ff ff ff mov    $0xffffffffffffff9b,%rax
 970: c3                   retq   
 971関数では"s"と比較して、一致しない場合は3を終了コードとしてexitしています。
 971: 48 83 ff 73           cmp    $0x73,%rdi #s
 975: 74 0e                 je     985 <_init+0x28d>
 977: 48 83 ec 08           sub    $0x8,%rsp
 97b: bf 03 00 00 00       mov    $0x3,%edi
 980: e8 d3 fd ff ff       callq  758 <_init+0x60> #exit
 985: b8 a0 00 00 00       mov    $0xa0,%eax
 98a: c3                   retq   
以降も同様に1文字ずつ比較しています。その文字を全てつなげると下記の文字列になります。
yes and his hands shook with ex
ncコマンドでサーバに接続すると、base64で送信するように指示されます。
$ nc crackme1_f92e0ab22352440383d58be8f046bebe.quals.shallweplayaga.me 10001
send your solution as base64, followed by a newline
先ほど得た文字列をbase64でエンコードします。
$ echo yes and his hands shook with ex | base64
eWVzIGFuZCBoaXMgaGFuZHMgc2hvb2sgd2l0aCBleAo=
このbase64エンコード文字列を入力すると、下記の通りフラグが得られます。
The flag is: important videos best playlist Wigeekuk8
フラグは、
important videos best playlist Wigeekuk8
です。