CTF for ビギナーズ 2016 金沢 に行った (writeup)

2016-11-27 日記

行きました

東京から参りました成瀬順と申します。

CTF4b東京は大人気だったらしく行けなかったので、金沢へ参加しました。

Web

  • ChromeのDevToolsの使い方
  • ディレクトリトラバーサル
  • SQLインジェクション
  • XSS(の紹介だけ)

演習中心で、実際にやってみよう!って感じなので楽しくて分かりやすかったです。

あとディレクトリトラバーサルとかSQLインジェクションの演習になんか隠しFLAGみたいなものが置いてあって、 †ビギナー†の人も楽しめそうでした。

SQLiの方の隠しFLAGは見つけられました web4b{can_access_another_table}

Forensics

  • Forensicsとは
  • ネットワークについて
  • ツールの使い方
    • Wireshark
    • binwalk
    • exiftool
    • The Sleuth Kit

Forensicsは全く知識がなかったので色々勉強になりました。 Wiresharkの便利な機能をたくさん知れたので強くなった気がします💪

Reversing

  • プログラム実行の仕組み
  • x86アセンブリ入門

ちょうど大学でx86を勉強したところだったので、なんとかついていけました。 上達のコツはたくさん読むことだそうです(がんばります><)

CTF

講義で学んだことを活かしてみよう!というやつです。

がんばって全部解きました!

FLAGためて10分前にまとめて出してみました。 いわゆるサブマリン戦法です。(一度やってみたかったんです><)

以下Writeup

Warmup (Misc 10)

やるだけ

てけいさん for ビギナーズ (Misc 200)

めっちゃ簡単な計算問題が100問出されるので全部解いてねって問題でした。 与えられたURLにアクセスすると計算式が書いてあって、その下にあるフォームに値を入力してSubmitするようになってます。 たぶんPHPのSESSIONで何問解いたかをカウントしてるので、ここはどうにもできなさそうです。

最初ふつうに100問解こうかなと思ったんだけど間違えたらリセットされるみたいなのでやめました。

JavaScriptを書いて(Web講義で習ったDevToolsを使って)100回走らせました。

document.querySelector("input[type=text]").value = eval(document.querySelector("div").textContent);
document.querySelector("input[type=submit]").click();

模範解答はPython(?)でやってたけどスクレイピングして……とかが面倒そうでした。

CountUp Game (Misc 200)

交互にカウントアップしていこう ただし,21を言ってはいけません

コンピュータと交互に1〜3づつ値を増やしていって、21を踏んだら負けるゲームを10連勝してねって問題でした。 なんか競プロでありそうな問題ですね。

そんなに難しくなくて、自分が必ず後攻なので、自分が必ず4の倍数を踏むようにしていれば勝てます。 たった10勝でOKなので、手でやりました。

Fix it (Web 100)

ページ遷移を行うプログラムを書いたが何かを間違っているらしく正常に動作しないそうだ。何がおかしいのか調べてほしい。

講義でやったやつだ!

送られてくるヘッダをよく見てみると、 Locatin: /web100/flag_is_here.php Typoしてます。

ということで、このURLにに行くとFlagが落ちてました。

Login as Admin (Web 200)

これも講義でやったやつだ!

SQLインジェクションっぽいですね。 ので、

username: admin
password: ' OR 1 --

とかしてみたらイケました。

1M4G3 V13W3R (Web 200)

画像アップローダです。 アップされた画像を開いてみると、URLが/web200-2/view.php?file=f5b5a9b812d45f55.jpgとかで、怪しい。

講義でやったディレクトリトラバーサルかな!?

じゃあ/web200-2/view.php?file=../index.phpとかすると、 PHPコメントでFlagが書いてありました。

Login Lv2 (Web 300)

またログインフォームです。 普通にSQLインジェクションを試行するんですが、どうも上手く行かないようです。 (でもエラーにはなります。うーん?)

適当にログインを試行していると、「ユーザー名かパスワードが間違っています。」と怒られるんですけど、 このときのURLが/web300/index.php?error=invalid_user.txtとかなってて、アレかなってなりました。

ということで、POSTリクエストの宛先である/web300/index.php?error=login.phpを見てみると、

$sql = "SELECT username, password FROM users WHERE username = ('{$username}') AND password = ('{$password}');";

カッコで囲んでいたんですね! じゃあこうすれば……

username: admin
password: ') OR 1 --

イケました。

FileSystem (Forensics 100)

謎のファイルが渡されます。 (なんのファイルかは問題名から察せそうですけど、)とりあえず講義で学んだように、どんなファイルであるかを調べてみます。

# file for100
for100: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, root entries 512, sectors 8192 (volumes <=32 MB) , Media descriptor 0xf8, sectors/FAT 6, sectors/track 32, heads 64, serial number 0x742adb6b, unlabeled, FAT (12 bit)

FATですね。 ではでは、講義で習ったThe Sleuth Kitを使ってみます。

# fls for100
r/r 4:   flag.txt
r/r * 6: .flag.txt.swp
v/v 130867: $MBR
v/v 130868: $FAT1
v/v 130869: $FAT2
d/d 130870: $OrphanFiles

ありますね!

# icat for100 4
ctf4b{

消えてる……

ここで削除済みの.flag.txt.swpに注目します。 このファイルはvimが編集履歴を保持しておくファイルで、通常はファイルが保存されたらこのswpは削除されます。

でもこのイメージにはバッチリ(削除済みファイルとして)残ってるので、

# icat for100 6
U3210#"! Utpad????ctf4b{ff97e486da08bfec774688ca3ef6ac42}

ラクをする

問題名から察するに、講義で紹介したThe Sleuth Kitを使ってなんかしてね!って問題なんだろうなって思ったんですけど、 stringsでゴリ押してしまいました><

strings for100 | grep ctf4b{

みてみよう (Forensics 200)

pcapファイルが渡されます。

そんなにリクエスト数が多くなくて、PNGをダウンロードしてるHTTP通信が1つだけです。 授業で習ったように、ファイル>オブジェクトをエクスポートでこのPNGをファイルを取り出してみます。

そうするとただの真っ白な画像ファイルでした。(困った……) ここで、講義で習ったbinwalkを使ってみます。

# binwalk flag.png

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             PNG image, 320 x 240, 8-bit/color RGB, non-interlaced
41            0x29            Zlib compressed data, best compression
744           0x2E8           Unix path: /www.w3.org/1999/02/22-rdf-syntax-ns#'>

なんかRDFのデータがくっついてますね。 じゃあ、講義で習ったexiftoolを使ってみます。

# exiftool flag.png
ExifTool Version Number         : 10.20
File Name                       : flag.png
Directory                       : ..
File Size                       : 1010 bytes
File Modification Date/Time     : 2016:11:27 03:02:03+00:00
File Access Date/Time           : 2016:11:27 03:06:03+00:00
File Inode Change Date/Time     : 2016:11:27 03:02:33+00:00
File Permissions                : rwxrwx---
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 320
Image Height                    : 240
Bit Depth                       : 8
Color Type                      : RGB
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
XMP Toolkit                     : Image::ExifTool 9.74
Keywords                        : ctf4b{f970e2767d0cfe75876ea857f92e319b}
Image Size                      : 320x240
Megapixels                      : 0.077

見えました!

ラクをする

たぶん講義で紹介したWiresharkを使ってFlag探してね!って問題なんだろうなって思ったんですけど、 stringsでゴリ押してしまいました><

strings for200 | grep ctf4b{

ICMP? (Forensics 200)

pcapファイルが渡されます。

Wiresharkで普通に開くと、pingのrequestとreplyだけが記録されています。 眺めていると、1つだけサイズが大きい通信があります。(統計>パケット長を見ても良かったかも。)

で、このパケットを見ると、pingのDataに何故かHTTPレスポンスがのっています。

Y'VERM]@@ {T HTTP/1.1 200 OK
Date: Thu, 14 Jul 2016 14:28:30 GMT
Server: Apache/2.4.20 (Debian)
Last-Modified: Thu, 14 Jul 2016 14:21:21 GMT
ETag: "35-537993754cce4"
Accept-Ranges: bytes
Content-Length: 53
Content-Type: text/plain

Y3RmNGJ7NTM2ZGFjMzcxYWE2NTJmODY1YzIwYWJlN2I0MDk0ZGJ9
n

この文字列、講義で習ったbase64っぽくないですか? ということでデコードしてみます。

# echo Y3RmNGJ7NTM2ZGFjMzcxYWE2NTJmODY1YzIwYWJlN2I0MDk0ZGJ9 | base64 -d
ctf4b{536dac371aa652f865c20abe7b4094db}

ラクをする

まぁとりあえずstringsします!!!

strings for200-2

そしたらbase64っぽい文字列が見えてしまったのでデコードしたらFLAGでした。 (なんかbase64ってなんとなくわかりますよね)

adminでログインしろ! (Forensics 300)

pcapとサービスのURLが渡されます。

とりあえずSQLインジェクションとか試して見るんですけど、(まぁForensicsだし)ダメでした。 で、よく見るとパスワードリセットができるようになっています。 が、リセットしようとするとメールアドレスと郵便番号を入力しろと言われます。

ということで、サービス管理者の通信を盗聴したっぽいpcapを見に行きます。 とりあえず脳死stringsしましたが成果がなかったので、Wiresharkを使って講義で習ったヤツをやってみました。

Wiresharkの統計>プロトコル階層を見てみたところ、 なんか大量の通信の中にちょっとだけSMTP(メール送信)の通信が記録されていました。 (少ないやつは怪しいって講義で習いました。)

で、この通信を覗いてみる(講義で習ったFollow TCP Stream)と、 どうやら管理者と思しきアドレスから、画像つきで「引っ越しました!」みたいなメールを送っていました。

220 4a256f335dbb Python SMTP proxy version 0.2
ehlo debian.debian
502 Error: command "EHLO" not implemented
helo debian.debian
250 4a256f335dbb
mail FROM:<admin@poe.ctf4b>
250 Ok
rcpt TO:<john@poe.ctf4b>
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
Content-Type: multipart/mixed; boundary="===============1980392290290904787=="
MIME-Version: 1.0
To: john@poe.ctf4b
From: admin@poe.ctf4b
Subject: 引越しました

--===============1980392290290904787==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit


会津若松に引越しました.
お近くにお越しの節はどうぞお気軽にお立ち寄り下さい.

新居から見える景色を画像で添付します.


--===============1980392290290904787==
Content-Type: image/jpeg
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="./keshiki.jpg"

<<<略>>>
--===============1980392290290904787==--
.
250 Ok
quit
221 Bye

とりあえずこれで管理者のメールアドレスadmin@poe.ctf4bは手に入ったので、次はメールに添付されている画像です。 画像はbase64化されてメールにくっついているので、デコードしてみるんですが、見ても写っているのが何処かなんてピンと来ません。

じゃあ、ということで講義で紹介されたexiftoolでEXIFを見ると…… 撮影した位置情報(GPS Position)がバッチリ残っていました。

# exiftool -GPSPosition keshiki.jpg
GPS Position                    : 37 deg 29' 54.83" N, 139 deg 56' 9.00" E

このGPS座標をGoogleMapとかに入れれば大体の場所がわかるので、あとは適当にググって郵便番号を割り出します。 で、この2つの情報でパスワードリセットすればログインしてFlagが見れます。

Welcome Reversing World! (Reversing 100)

実行するとEnjoy CTF!って出てきて終わります。

バイナリがいきなりstrippedで読むのが辛い>< 頑張って読むと、Enjoy CTF!を表示するちょっと手前に、なんか怪しいことをしてます。

 804841c:   c7 45 f0 00 00 00 00    mov    DWORD PTR [ebp-0x10],0x0
 8048423:   c7 45 f4 e0 84 04 08    mov    DWORD PTR [ebp-0xc],0x80484e0
 804842a:   83 7d f0 00             cmp    DWORD PTR [ebp-0x10],0x0
 804842e:   74 10                   je     8048440 <__libc_start_main@plt+0x150>
 8048430:   83 ec 0c                sub    esp,0xc
 8048433:   ff 75 f4                push   DWORD PTR [ebp-0xc]
 8048436:   e8 a5 fe ff ff          call   80482e0 <puts@plt>

C言語っぽく書けば

int num = 0;
char* flag = 0x80484e0;
if(num != 0){
   puts(flag);
}

みたいなカンジですね。 まぁどう考えてもif文の中が実行されるワケがないですね。 でもアドレスがわかるので、ココを見れば表示されるはずの文字列がわかります。

0x80484e0は.rodataセクションの中なので、

# objdump -s -j.rodata bin100

bin100:     file format elf32-i386

Contents of section .rodata:
 80484d8 03000000 01000200 63746634 627b3537  ........ctf4b{57
 80484e8 72316e36 355f6330 6d6d346e 645f6631  r1n65_c0mm4nd_f1
 80484f8 6e645f66 6c34367d 00456e6a 6f792043  nd_fl46}.Enjoy C
 8048508 54462100                             TF!.

ありました。

ラクをする

脳死stringsで見つかってしまった

strings bin100

作問者さんによる解説でもstringsが想定解って言ってました(?)

Lecture Review (Reversing 200)

与えられたバイナリの指定された部分(nopで囲まれたところ)を抜けると%eaxの値はいくつになっているか? 講義の演習でやった計算をやってみよう!ってやつですね。

がんばって読んで計算するだけです。

ラクをする

gdbを使うとちょっとラクできます。

# gdb -q ./bin200_1
Reading symbols from ./bin200_1...(no debugging symbols found)...done.
(gdb) disas main
Dump of assembler code for function main:
   0x08048416 <+0>:  push   ebp
   0x08048417 <+1>:  mov    ebp,esp
   0x08048419 <+3>:  sub    esp,0x10
   0x0804841c <+6>:  nop
   0x0804841d <+7>:  nop
   0x0804841e <+8>:  mov    DWORD PTR [ebp-0xc],0x14
   0x08048425 <+15>: mov    DWORD PTR [ebp-0x8],0x8
   0x0804842c <+22>: mov    DWORD PTR [ebp-0x4],0xfffffffd
   0x08048433 <+29>: push   DWORD PTR [ebp-0x4]
   0x08048436 <+32>: push   DWORD PTR [ebp-0x8]
   0x08048439 <+35>: push   DWORD PTR [ebp-0xc]
   0x0804843c <+38>: call   0x80483db <calc>
   0x08048441 <+43>: add    esp,0xc
   0x08048444 <+46>: mov    ds:0x804a01c,eax
   0x08048449 <+51>: mov    eax,ds:0x804a01c
   0x0804844e <+56>: nop
   0x0804844f <+57>: nop
   0x08048450 <+58>: mov    eax,0x0
   0x08048455 <+63>: leave
   0x08048456 <+64>: ret
End of assembler dump.
(gdb) b*0x0804844e
Breakpoint 1 at 0x804844e
(gdb) r
Starting program: /media/sf_share/bin200_1

Breakpoint 1, 0x0804844e in main ()
(gdb) i r
eax            0xffffffe5	-27
ecx            0xd4024da0	-738046560
edx            0xffffffe8	-24
ebx            0x0	0
esp            0xffffdc18	0xffffdc18
ebp            0xffffdc28	0xffffdc28
esi            0x1	1
edi            0xf7fc6000	-134455296
eip            0x804844e	0x804844e <main+56>
eflags         0x296	[ PF AF SF IF ]
cs             0x23	35
ss             0x2b	43
ds             0x2b	43
es             0x2b	43
fs             0x0	0
gs             0x63	99

Not Print FLAG (Reversing 200)

渡されたバイナリを動かすと Sorry. I forgot to display the FLAG. This message is not FLAG. って言われて終わります。

(strippedなのでつらいのですが><)バイナリをよく読んでみると、 なんだか怪しいことをしてる部分が見つかります。(↑を表示するちょっと手前の部分です)

 8048471:   c7 45 f0 00 00 00 00    mov    DWORD PTR [ebp-0x10],0x0
 8048478:   eb 11                   jmp    804848b <putchar@plt+0x13b>
 804847a:   8b 45 f0                mov    eax,DWORD PTR [ebp-0x10]
 804847d:   8b 04 85 40 a0 04 08    mov    eax,DWORD PTR [eax*4+0x804a040]
 8048484:   89 45 f4                mov    DWORD PTR [ebp-0xc],eax
 8048487:   83 45 f0 01             add    DWORD PTR [ebp-0x10],0x1
 804848b:   8b 45 f0                mov    eax,DWORD PTR [ebp-0x10]
 804848e:   83 f8 19                cmp    eax,0x19
 8048491:   76 e7                   jbe    804847a <putchar@plt+0x12a>

どこかから何かを読んでebp-0xcへ格納していますが、読み出した値は使ってませんね。 あー!_forgot to display_ってそういうことか!

で、読み出し元の0x804a040というのは.dataセクションなので、ココを見ると……

# objdump -s -j.data ./bin200_2

./bin200_2:     file format elf32-i386

Contents of section .data:
 804a020 00000000 00000000 00000000 00000000  ................
 804a030 00000000 00000000 00000000 00000000  ................
 804a040 31000000 6e000000 37000000 5f000000  1...n...7..._...
 804a050 76000000 34000000 6c000000 75000000  v...4...l...u...
 804a060 33000000 5f000000 33000000 71000000  3..._...3...q...
 804a070 75000000 34000000 6c000000 5f000000  u...4...l..._...
 804a080 63000000 68000000 34000000 72000000  c...h...4...r...
 804a090 34000000 63000000 37000000 33000000  4...c...7...3...
 804a0a0 72000000 00000000                    r.......

それっぽいのが見つかりました。

Encrypted FLAG (Reversing 300)

FLAGを入力するとそれが正解かどうかを判定してくれるバイナリです。

.dataセクションになにやらそれっぽいflagっていう変数があります。

(gdb) x/s 0x804a02c
0x804a02c <flag>:	"\226\201\223\301\227\216\215\232\207\252\215\232\207\252\206\234\230\205\231\220\252\226\207\214\205\201\324\324\210\365"

どうやら暗号化されているようで、そのままでは読めないです。

バイナリを読んでみると、flagdecryptという関数で変換して、そのデータをstrcmpで入力と比較しています。

実際にflagを変換している部分がココ

 8048558:   83 c4 10                add    esp,0x10
 804855b:   83 ec 04                sub    esp,0x4
 804855e:   6a 42                   push   0x42
 8048560:   6a 1e                   push   0x1e
 8048562:   68 2c a0 04 08          push   0x804a02c
 8048567:   e8 73 00 00 00          call   80485df <decrypt>
 804856c:   83 c4 10                add    esp,0x10
 804856f:   83 ec 04                sub    esp,0x4
 8048572:   6a b7                   push   0xffffffb7
 8048574:   6a 1e                   push   0x1e
 8048576:   68 2c a0 04 08          push   0x804a02c
 804857b:   e8 5f 00 00 00          call   80485df <decrypt>

講義でやった関数呼び出しの話を思い出すと、 どうやらdecryptflagのアドレス、何らかの値①、何らかの値②を順番に渡しています。

0x804a02cがflagのアドレスなので、C言語っぽく書いてみると、

decrypt(flag, 0x1e, 0x42);
decrypt(flag, 0x1e, 0xffffffb7);

この0x1e、strlen(flag) == 0x1eなので、どうやらflagの長さっぽいですね。

で、decryptが何をしているかというと、

080485df <decrypt>:
 80485df:   55                      push   ebp
 80485e0:   89 e5                   mov    ebp,esp
 80485e2:   83 ec 14                sub    esp,0x14
 80485e5:   8b 45 10                mov    eax,DWORD PTR [ebp+0x10]
 80485e8:   88 45 ec                mov    BYTE PTR [ebp-0x14],al
 80485eb:   c7 45 fc 00 00 00 00    mov    DWORD PTR [ebp-0x4],0x0
 80485f2:   eb 1c                   jmp    8048610 <decrypt+0x31>
 80485f4:   8b 55 fc                mov    edx,DWORD PTR [ebp-0x4]
 80485f7:   8b 45 08                mov    eax,DWORD PTR [ebp+0x8]
 80485fa:   01 c2                   add    edx,eax
 80485fc:   8b 4d fc                mov    ecx,DWORD PTR [ebp-0x4]
 80485ff:   8b 45 08                mov    eax,DWORD PTR [ebp+0x8]
 8048602:   01 c8                   add    eax,ecx
 8048604:   0f b6 00                movzx  eax,BYTE PTR [eax]
 8048607:   32 45 ec                xor    al,BYTE PTR [ebp-0x14]
 804860a:   88 02                   mov    BYTE PTR [edx],al
 804860c:   83 45 fc 01             add    DWORD PTR [ebp-0x4],0x1
 8048610:   8b 45 fc                mov    eax,DWORD PTR [ebp-0x4]
 8048613:   3b 45 0c                cmp    eax,DWORD PTR [ebp+0xc]
 8048616:   7c dc                   jl     80485f4 <decrypt+0x15>
 8048618:   90                      nop
 8048619:   c9                      leave
 804861a:   c3                      ret

こうなので、C言語っぽく書くとこうでしょうか?

void decrypt(char* flag, int len, int num){
	for(int i = 0; i < len; i++){
		flag[i] ^= num;
	}
}

じゃあ、flagを実際に復号してみます。

#include <stdio.h>

char flag[] = "\226\201\223\301\227\216\215\232\207\252\215\232\207\252\206\234\230\205\231\220\252\226\207\214\205\201\324\324\210\365";

void decrypt(char* flag, int len, int num){
   for(int i = 0; i < len; i++){
      flag[i] ^= num;
   }
}

int main(){
   decrypt(flag, 0x1e, 0x42);
   decrypt(flag, 0x1e, 0xffffffb7);
   puts(flag);
   return 0;
}

イケました!

ラクをする

strcmpで比較するために、実行中にメモリにFLAGが乗っているはずなので、gdbで探してみます。 strcmpの直前でブレークしてflagを見てみると、

# gdb -q ./bin300
Reading symbols from ./bin300...(no debugging symbols found)...done.
(gdb) b*0x0804858f
Breakpoint 1 at 0x804858f
(gdb) x/s 0x0804a02c
0x804a02c <flag>: "ctf4b{xor_xor_simple_crypt!!}"

もっとラクをする

ltraceっていう便利なモノがあります。 コレを使うと、ライブラリ関数の呼び出しをトレースできます。 つまり、strcmpに何を渡しているのかが見えます。

# ltrace ./bin300
__libc_start_main(0x804851b, 1, 0xff932834, 0x8048620 <unfinished ...>
printf("Please input flag... ")                                      = 21
__isoc99_scanf(0x80486b6, 0xff93273c, 0xff932740, 0x80482a9)         = 0xffffffff
strcmp("\024", "ctf4b{xor_xor_simple_crypt!!}")                      = -1
puts("Wrong flag...")                                                = 14
+++ exited (status 0) +++

おまけ

angrを使ってみる

# python2
>>> import angr
>>> p = angr.Project("./bin300", load_options={"auto_load_libs":False})
>>> state = p.factory.blank_state(addr=0x804851b)
>>> path = p.factory.path(state)
>>> pg = p.factory.path_group(path)
>>> e = pg.explore(find=0x80485a7, avoid=0x80485b9)
>>> e.found[0].state.posix.dumps(0)
'ctf4b{xor_xor_simple_crypt!!}\x00\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'