Matriochka - Step 2

Description

Can you help me?

Recently, I found an executable binary.

As I'm a true newbie,

Certainly, to solve it, I will have difficulties.

Keep in mind, the first step is quite easy.

Maybe the last one will be quite tricky.

Emulating it could be a good idea.

You must solve step 1 first.


Details

Points
100
Category
Crack Me
Validations
98

Attachments

This challenge has no attachment.

Step1の最後で出力されたBase64エンコードデータ(bbb.txtファイルとして保存)をデコードします。改行コードが邪魔なので取り除いてデコードします。
$ cat bbb.txt | tr -d '\r\n' | base64 -d > ccc
fileコマンドでファイルタイプを確認します。
$ file ccc

ccc: POSIX tar archive (GNU)

tarコマンドで解凍します。stage2.binファイルが出来ました。

$ tar xvf ccc
stage2.bin

fileコマンドでstage2.binファイルのファイルタイプを確認します。Linuxの64bitバイナリのようです。

$ file stage2.bin
stage2.bin: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=7b2fd52d0de50c9e575793a0fd17fdd2574c5c53, stripped

実行してみると、コマンドライン引数にパスワードを指定しなければいけないことが分かります。

$ ./stage2.bin
Usage: ./stage2.bin <pass>

ここで、逆アセンブルして動作を解析します。

$ objdump -s -D stage2.bin > ddd.txt

まず以下の箇所でコマンドライン引数の文字列の長さをチェックしています。長さは11文字である必要があります。

  400742:    e8 c9 fd ff ff           callq  400510 <strlen@plt> #引数の文字列長を求める

  400747:    48 8d 50 01              lea    0x1(%rax),%rdx      #+1して
  40074b:    48 89 d0                 mov    %rdx,%rax
  40074e:    48 c1 e0 02              shl    $0x2,%rax               #*4して
  400752:    48 01 d0                 add    %rdx,%rax               #この時点で(文字列長+1)を5倍
  400755:    48 c1 e0 02              shl    $0x2,%rax               #さらに*4
  400759:    48 01 d0                 add    %rdx,%rax               #この時点で(文字列長+1)を21倍
  40075c:    48 01 c0                 add    %rax,%rax               #この時点で(文字列長+1)の42倍
  40075f:    48 3d f8 01 00 00        cmp    $0x1f8,%rax       #1f8=504/42=12→12-1=11文字

次に以下の箇所で0文字目の文字をチェックしています。0文字目はPです。
  40077a:    48 8b 00                 mov    (%rax),%rax          #rax=引数

  40077d:    0f b6 00                 movzbl (%rax),%eax         #0文字目
  400780:    3c 50                    cmp    $0x50,%al               #0x50=P

さらに以下の箇所で3文字目のチェックをしています。3文字目はdです。

  400793:    48 8b 00                 mov    (%rax),%rax           #rax=引数
  400796:    48 83 c0 03              add    $0x3,%rax             #+3
  40079a:    0f b6 00                 movzbl (%rax),%eax          #3文字目
  40079d:    0f be c0                 movsbl %al,%eax
  4007a0:    01 c0                    add    %eax,%eax               #2倍して
  4007a2:    3d c8 00 00 00           cmp    $0xc8,%eax       #c8=200/2=100=d

続いて6文字目のチェックです。6文字目はpです。

  4007c1:    8d 50 10                 lea    0x10(%rax),%edx        #0文字目=P(80)+16=96
  4007c4:    48 8b 45 d0              mov    -0x30(%rbp),%rax
  4007c8:    48 83 c0 08              add    $0x8,%rax
  4007cc:    48 8b 00                 mov    (%rax),%rax
  4007cf:    48 83 c0 06              add    $0x6,%rax                   #+6

  4007d3:    0f b6 00                 movzbl (%rax),%eax              #6文字目
  4007d6:    0f be c0                 movsbl %al,%eax
  4007d9:    83 e8 10                 sub    $0x10,%eax                #-16して
  4007dc:    39 c2                    cmp    %eax,%edx                  #edx=96+16=112=p

続いて5文字目のチェックです。5文字目は_です。
  4007f2:    48 83 c0 05              add    $0x5,%rax                 #+5

  4007f6:    0f b6 00                 movzbl (%rax),%eax              #5文字目
  4007f9:    48 0f be d8              movsbq %al,%rbx
  4007fd:    48 8b 45 d0              mov    -0x30(%rbp),%rax
  400801:    48 83 c0 08              add    $0x8,%rax
  400805:    48 8b 00                 mov    (%rax),%rax               #引数の先頭
  400808:    48 89 c7                 mov    %rax,%rdi
  40080b:    e8 00 fd ff ff           callq  400510 <strlen@plt>
  400810:    48 89 c2                 mov    %rax,%rdx                  #長さ=11
  400813:    48 89 d0                 mov    %rdx,%rax
  400816:    48 c1 e0 03              shl    $0x3,%rax                  #8倍=88
  40081a:    48 01 d0                 add    %rdx,%rax                  #加算して99
  40081d:    48 83 e8 04              sub    $0x4,%rax                #99-4=95
  400821:    48 39 c3                 cmp    %rax,%rbx                 #95=_

続いて以下の箇所で1文字目と7文字目が同じでなければいけないことが分かります。

  400838:    48 83 c0 01              add    $0x1,%rax                 #+1
  40083c:    0f b6 10                 movzbl (%rax),%edx              #1文字目
  40083f:    48 8b 45 d0              mov    -0x30(%rbp),%rax
  400843:    48 83 c0 08              add    $0x8,%rax
  400847:    48 8b 00                 mov    (%rax),%rax
  40084a:    48 83 c0 07              add    $0x7,%rax                 #+7
  40084e:    0f b6 00                 movzbl (%rax),%eax              #7文字目
  400851:    38 c2                    cmp    %al,%dl                        #1文字目=7文字目

さらに1文字目と10文字目も同じです。

  400867:    48 83 c0 01              add    $0x1,%rax                 #+1
  40086b:    0f b6 10                 movzbl (%rax),%edx             #1文字目
  40086e:    48 8b 45 d0              mov    -0x30(%rbp),%rax
  400872:    48 83 c0 08              add    $0x8,%rax
  400876:    48 8b 00                 mov    (%rax),%rax
  400879:    48 83 c0 0a              add    $0xa,%rax                #+10
  40087d:    0f b6 00                 movzbl (%rax),%eax             #10文字目
  400880:    38 c2                    cmp    %al,%dl                       #1文字目=10文字目

そして次の箇所で1文字目が確定します。したがって、1,7,10文字目がaになります。

  400896:    48 83 c0 01              add    $0x1,%rax                #+1
  40089a:    0f b6 00                 movzbl (%rax),%eax             #1文字目
  40089d:    0f be c0                 movsbl %al,%eax
  4008a0:    8d 50 ef                 lea    -0x11(%rax),%edx       #-17して
  4008a3:    48 8b 45 d0              mov    -0x30(%rbp),%rax
  4008a7:    48 83 c0 08              add    $0x8,%rax
  4008ab:    48 8b 00                 mov    (%rax),%rax              #引数の先頭
  4008ae:    0f b6 00                 movzbl (%rax),%eax
  4008b1:    0f be c0                 movsbl %al,%eax                 #0文字目
  4008b4:    39 c2                    cmp    %eax,%edx                #1文字目=0文字目(80)+17=97=a

次に以下の箇所で3文字目と9文字目を比較しています。9文字目はdです。

  4008ca:    48 83 c0 03              add    $0x3,%rax                #+3
  4008ce:    0f b6 10                 movzbl (%rax),%edx             #3文字目
  4008d1:    48 8b 45 d0              mov    -0x30(%rbp),%rax
  4008d5:    48 83 c0 08              add    $0x8,%rax
  4008d9:    48 8b 00                 mov    (%rax),%rax
  4008dc:    48 83 c0 09              add    $0x9,%rax                #+9
  4008e0:    0f b6 00                 movzbl (%rax),%eax            #9文字目

  4008e3:    38 c2                    cmp    %al,%dl                      #3文字目=d=9文字目

続いて、4文字目はiです。

  4008f9:    48 83 c0 04              add    $0x4,%rax              #+4
  4008fd:    0f b6 00                 movzbl (%rax),%eax           #4文字目
  400900:    3c 69                    cmp    $0x69,%al                #0x69=i

続いて1文字目と2文字目を比較しています。2文字目はnです。

  400916:    48 83 c0 02              add    $0x2,%rax                #+2
  40091a:    0f b6 00                 movzbl (%rax),%eax             #2文字目
  40091d:    0f be d0                 movsbl %al,%edx
  400920:    48 8b 45 d0              mov    -0x30(%rbp),%rax
  400924:    48 83 c0 08              add    $0x8,%rax
  400928:    48 8b 00                 mov    (%rax),%rax
  40092b:    48 83 c0 01              add    $0x1,%rax                #+1
  40092f:    0f b6 00                 movzbl (%rax),%eax              #1文字目
  400932:    0f be c0                 movsbl %al,%eax
  400935:    29 c2                    sub    %eax,%edx                  #2文字目-1文字目
  400937:    89 d0                    mov    %edx,%eax
  400939:    83 f8 0d                 cmp    $0xd,%eax                 #d=13+1文字目(97)=110=n

続いて7文字目と8文字目を比較しています。8文字目はnです。

  400950:    48 83 c0 08              add    $0x8,%rax                #+8
  400954:    0f b6 00                 movzbl (%rax),%eax             #8文字目
  400957:    0f be d0                 movsbl %al,%edx
  40095a:    48 8b 45 d0              mov    -0x30(%rbp),%rax
  40095e:    48 83 c0 08              add    $0x8,%rax
  400962:    48 8b 00                 mov    (%rax),%rax
  400965:    48 83 c0 07              add    $0x7,%rax                #+7
  400969:    0f b6 00                 movzbl (%rax),%eax             #7文字目
  40096c:    0f be c0                 movsbl %al,%eax
  40096f:    29 c2                    sub    %eax,%edx                   #8文字目-7文字目
  400971:    89 d0                    mov    %edx,%eax
  400973:    83 f8 0d                 cmp    $0xd,%eax                #d=13+7文字目(97)+13=110=n

以上により、コマンドライン引数にPandi_pandaを指定すればよさそうです。実際に試してみます。

$ ./stage2.bin Pandi_panda
Good good!
f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAEAdAAAAAAABAAAAAAAAAANBBAAAAAAAAAAAAAEAAOAAJ

(略)

AA==

Goodと表示されました。したがって、フラグは、

Pandi_panda

です。



アセンブリ言語スタートブック
高田美樹
技術評論社
2015-08-08