Step1の最後で出力されたBase64エンコードデータ(bbb.txtファイルとして保存)をデコードします。改行コードが邪魔なので取り除いてデコードします。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.
$ cat bbb.txt | tr -d '\r\n' | base64 -d > cccfileコマンドでファイルタイプを確認します。
$ file cccccc: 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文字である必要があります。
次に以下の箇所で0文字目の文字をチェックしています。0文字目はPです。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文字
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です。
続いて5文字目のチェックです。5文字目は_です。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 #+64007d3: 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
4007f2: 48 83 c0 05 add $0x5,%rax #+54007f6: 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
です。