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

行きました

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

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回走らせました。

1
2
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インジェクションっぽいですね。
ので、

1
2
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を見てみると、

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

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

1
2
username: admin
password: ') OR 1 --

イケました。

FileSystem (Forensics 100)

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

1
2
# 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を使ってみます。

1
2
3
4
5
6
7
# 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

ありますね!

1
2
# icat for100 4
ctf4b{

消えてる……

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

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

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

ラクをする

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

1
strings for100 | grep ctf4b{

みてみよう (Forensics 200)

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

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

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

1
2
3
4
5
6
7
# 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を使ってみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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でゴリ押してしまいました><

1
strings for200 | grep ctf4b{

ICMP? (Forensics 200)

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

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

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

1
2
3
4
5
6
7
8
9
10
11
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っぽくないですか?
ということでデコードしてみます。

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

ラクをする

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

1
strings for200-2

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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)がバッチリ残っていました。

1
2
# 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!を表示するちょっと手前に、なんか怪しいことをしてます。

1
2
3
4
5
6
7
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言語っぽく書けば

1
2
3
4
5
int num = 0;
char* flag = 0x80484e0;
if(num != 0){
puts(flag);
}

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

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

1
2
3
4
5
6
7
8
9
# 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で見つかってしまった

1
strings bin100

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

Lecture Review (Reversing 200)

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

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

ラクをする

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 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なのでつらいのですが><)バイナリをよく読んでみると、
なんだか怪しいことをしてる部分が見つかります。(↑を表示するちょっと手前の部分です)

1
2
3
4
5
6
7
8
9
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セクションなので、ココを見ると……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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っていう変数があります。

1
2
(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を変換している部分がココ

1
2
3
4
5
6
7
8
9
10
11
12
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言語っぽく書いてみると、

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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言語っぽく書くとこうでしょうか?

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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を見てみると、

1
2
3
4
5
6
# 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に何を渡しているのかが見えます。

1
2
3
4
5
6
7
# 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を使ってみる

1
2
3
4
5
6
7
8
9
# 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'
このエントリーをはてなブックマークに追加