vnetが動かないqjailを無理やり動かしてみる

追記.2014/08/05
記事を修正しました。
qjail configでvnetが動きました。

qjail config -vを使う方法

# qjail config -v test01
 
At this time only ipfw firewall is vimage aware and can
run on the host and in the vnet jail at the same time.
 
Chose by entering ipfw or none and pressing the enter key.
none
 
There are two network configuration methods available for
connecting this vnet/vimage jail to the public internet.
The bridge/epair method and the netgraph method.
Chose which network method you want this vimage jail to use
by entering [ be ] for bridge/epair or [ ng ] for netgraph
and pressing the enter key.
be
Successfully enabled vnet for test01

noneを入力すると、ipfwを使いません。
epairを使うならば、beを入力します。

しかし、この方法だとqjail startした時にepairが1つ自動生成され、プライベートIPアドレスが自動で割り当てられるので、
自分で全てepairを作りたいときには正直邪魔です。
そのようなときには以下の2つの方法を使ったほうがいいです。

ソースコードを書き換える方法

ソースコードを書き換えるのに抵抗がなければ圧倒的にこちらのほうが楽です。
qjail Version 3.6のソースコードです。
/usr/local/bin/qjailを書き換えます。

echo "ip4,addr~ をコメントアウト

  echo "ip4.addr            =  ${ip4};"

    ↓

  #  echo "ip4.addr            =  ${ip4};"

echo vnet;を行う行のifをコメントアウトし、常に行われるようにする

    if [ ${vnet} ]; then 

    ↓

  #  if [ ${vnet} ]; then 
    fi 

    ↓

 #   fi 


この状態でqjail createし、startすれば、vnetが有効化されている状態になります。

qjailはBSDライセンスなので、ソースコードを改変して頒布しても著作権明記をすれば問題無いはずです。
しかしソースコードを書き換えてしまうと常にvnetが有効になってしまうので注意。

/usr/local/etc/qjail.vnet/を使う方法

まず、いつものように、qjail createをします。すると/usr/local/etc/qjail.local/test01が生成されます。

# cat /usr/local/etc/qjail.local/test01
name="test01"
ip4="0.0.0.0"
ip6=""
path="/usr/jails/test01"
interface="em1"
fstab="/usr/local/etc/qjail.fstab/test01"
securelevel=""
cpuset=""
fib=""
vnet=""
vinterface=""
rsockets=""
ruleset=""
sysvipc=""
quotas=""
nullfs=""
zfs=""
poststartssh=""
deffile="/usr/local/etc/qjail.local/test01"
image=""
imagetype=""
imageblockcount=""
imagedevice=""

ここからvnetを書き換えます。

vnet=""

    ↓

vnet="yes"

次に、/etc/jail.confを見ます。

test01 {
host.hostname       =  "test01";
path                =  "/usr/jails/test01";
mount.fstab         =  "/usr/local/etc/qjail.fstab/test01";
exec.start          =  "/bin/sh /etc/rc";
exec.stop           =  "/bin/sh /etc/rc.shutdown";
exec.consolelog     =  "/var/log/qjail.masterRouter.console.log";
mount.devfs;
ip4.addr            =  "0.0.0.0";
interface           =  "em1";
devfs_ruleset       =  "4";
}

もし作成されていなければqjail start test01;qjail stop test01をすれば作成されると思います。
/usr/local/etc/qjail.vnet/test01を作成し、この内容をコピーします。そして、
ip4,addrの行を削除し、vnet;を追加します。↓

test01 {
host.hostname       =  "test01";
path                =  "/usr/jails/test01";
mount.fstab         =  "/usr/local/etc/qjail.fstab/test01";
exec.start          =  "/bin/sh /etc/rc";
exec.stop           =  "/bin/sh /etc/rc.shutdown";
exec.consolelog     =  "/var/log/qjail.masterRouter.console.log";
mount.devfs;
interface           =  "em1";
devfs_ruleset       =  "4";
vnet;
}

そしてqjail startをすると、vnetが有効化されたjailが出来上がります。

qjailについてのTIPS

単発ネタが多いからまとめて投稿
随時更新します。

qjailでもVIMAGE vnetを使う方法


追記(07/10)
そのままではvnetを有効化できませんでした。
こちらの記事の内容で有効化できます。

vnetが動かないqjailを無理やり動かしてみる -


freebsd qjailでもvnetを有効化できます。

# qjail config -w em1 test01
Successfully enabled vnet.interface for test01
  • wのあとにはインターネットに到達できる(もしくは予定)のインターフェイスを指定。


qjailでホストへのシンボリックリンクを貼る方法

ezjailではそのままflavours/defaultに、

ln -s /basejail/pkg /usr/jails/flavours/default/pkg

して、ezjail-admin createしても何のエラーもなく通してくれますが、
qjailのflavors/defaultに

ln -s /sharedfs/pkg /usr/jails/flavours/default/pkg

上記のようにシンボリックリンクを張ったあとqjail createすると、

# qjail create -f default -4 10.0.0.1 example
Only in /usr/jails/flavors/example: pkg
Error invalid directories in flavor default.

とエラーが出て作成ができません。

しかしシンボリックリンクを張らずに先にqjail createし、その後に

ln -s /sharedfs/pkg /usr/jails/example/pkg

と打てば普通にホスト側へのシンボリックリンクが貼れます。

qjailで一気に複数のjailを作成する方法

qjail create -f default -d [jailの数] -4 10.0.0.1 test
  • dのあとに数値を入れればその数のjailを作ってくれます。

以下は例

# qjail create -f default -d 15 -4 10.0.0.1 test
Warning: Existing jail test01 is already assigned IP address 10.0.0.1
Successfully created  test-1
Successfully created  test-2
Successfully created  test-3
Successfully created  test-4
Successfully created  test-5
Successfully created  test-6
Successfully created  test-7
Successfully created  test-8
Successfully created  test-9
Successfully created  test-10
Successfully created  test-11
Successfully created  test-12
Successfully created  test-13
Successfully created  test-14
Successfully created  test-15

qjail delete -Aで全て削除できる

qjail start で全てのjailが動く

qjail stop で全てのjailが止まる

pingなどを有効化する

標準の状態では無効になっているのでpingが飛ばせません。

#jail -m name=test01 allow.raw_sockets=1

または、

#qjail config -k test01

netstatなどを有効化する

標準のdevfsでは/dev/memや/dev/kmemがないとnetstatなどルーティング系ができませんでした。
なのでdevfsに追加をします。
こちらの参考ページをどうぞ。
FreeBSD 9.1-STABLEでVIMAGEなJailを構築する | funi2.jp

jailのルールセットの変更は、

#jail -m name=test01 devfs_ruleset=5

上記でルールセットを5に変更できます。

しかしqjailでjailを作成したあとにjailコマンドで変更しても、実際は/devが変わっていないうえにjailを再起動すると4に戻ってしまいます。
その場合はやはりqjailのソースコードを書き換えるしかありません。

echo "devfs_ruleset       =  \"4\";"

      ↓

echo "devfs_ruleset       =  \"5\";"

qjail のオプションあれこれ

qjail update -pでportsのアップデート。

em-websocketで非同期処理(連続でサーバ側からクライアントにPushする)

EventMachine::WebSocket.start(host: "0.0.0.0", port: 3000) do |ws|
〜〜
sleep(1)
msg = ”test1”
ws.send(msg)
sleep(1)
msg = ”test2”
ws.send(msg)
sleep(1)
msg = ”test3”
ws.send(msg)

〜〜
end

というコードを書き、1秒毎にサーバ側がmsgをブラウザに送ることを期待したのですが、このコードでは、3秒後に3つのメッセージが同時に送信されます。

これを解決するためにEventMachine::deferを使います。
deferはその中で新しいスレッドを立て、非同期処理をしてくれる優れものです。


直したコードはこちら

EventMachine::WebSocket.start(host: "0.0.0.0", port: 3000) do |ws|
〜〜
EventMachine::defer do
  sleep(1)
  msg = ”test1”
  ws.send(msg)
  sleep(1)
  msg = ”test2”
  ws.send(msg)
  sleep(1)
  msg = ”test3”
  ws.send(msg)
end
〜〜
end

参考文献
橋本商会

指定したpkg(pkgng)の全依存関係を表示する

                      • -


追記.(2014/07/08)
スクリプトのバグにより全ての依存関係が取れない可能性がありました。

バグのあるスクリプトは依存関係を調べるスクリプトで、修正箇所は

s,e = Open3.capture3("cd #{pkg};make build-depends-list")

s,e = Open3.capture3("cd #{pkg};make run-depends-list")

if (line.include?(column) == true) then

if (line.gsub("/usr/ports/","") == column) then

となります。

1つ目のバグで生じる問題は、build-depends-listはそのPortsコンパイルするために必要なもので、これはpkgをダウンロードする場合は必要ありません。
そしてrun-depends-listは実行時に必要なもので、pkgでインストールする場合はこっちが必要なためです。

2つ目のバグで生じる問題は、例えば「python」というパッケージと「python2」というパッケージが必要な時、
先にpythonを処理してしまうと、次に「python2」を入れる時にincludeで重複リストを参照してしまうと「python」が引っかかってしまうためです。

記事のソースコードは修正済みです。

追記ここまで

                      • -

pkg search [name]で見つけたパッケージに対し、pkg fetch [name]でパッケージを取得しても、依存関係になるパッケージは取得できないし、
インストールしていない状態ではpkg infoをして依存関係も調べることができません。

しかしpkgngとPorts Collectionは同じDBを使っているのでそこから依存関係を取得できます。

今回は例としてvimの依存関係を調べます。

欲しいpkgの正式名称を調べる

まずvimを検索してみます。

# pkg search vim
ja-jvim-3.0.j2.1b_1
vim-7.4.334
vim-lite-7.4.334
vimpager-1.8.9
xpi-vimperator-3.5
# 

上記のように5つパッケージが表示されます。
vim-7.4.334」を選んだとして、以下のようにfetchしてaddしても、依存するパッケージが無いためエラーになります。(installすればいいじゃん、ってのは禁止。)

# pkg fetch vim-7.4.334
Updating repository catalogue
The following packages will be fetched:

	vim-7.4.334 (100% of 6 MB)

6 MB to be downloaded

Proceed with fetching packages [y/N]: y
vim-7.4.334.txz                                                                                    100% 5975KB 398.3KB/s 134.8KB/s   00:15    
Checking integrity... done
# pkg add /var/cache/pkg/All/vim-7.4.334.txz 
Installing vim-7.4.334...pkg: Missing dependency matching Origin: 'accessibility/atk' Version: '2.8.0'

Failed to install the following 1 package(s): /var/cache/pkg/All/vim-7.4.334.txz

pkgのPortsのパスを調べる

これがスクリプト。nameに先ほど取得した「vim-7.4.334」を代入します。

require 'open3'
ports = "/usr/ports"
name = "vim-7.4.334"

apkg = Array.new
column = Array.new
flag = false
s,e = Open3.capture3("cd #{ports}/;make search name=#{name}")
s = s.split("\n")
s.each do |line|
	if(line.index("Port:") != nil) then
		column << line.gsub("Port:	","")
		flag = true
		next
	end
	if(flag == true) then
		if(line.index("Path:") != nil) then
			column << line.gsub("Path:	","")
			apkg << column
			column = []
			flag = false
		end
	end
	if(line == "\n") then
		flag = false
		column = []
	end
end

apkg.sort!
apkg.each do |pkg|
	puts pkg[1]
end

動かします。

# ./tree.rb
/usr/ports/editors/vim
#

上記のように、「/usr/ports/editors/vim」とパスが取得できました。
通常であれば、このように1行しかでないと思います。nameに「vim」など曖昧な文字列を入れると複数行出ます。
このスクリプトは、以下の結果からPathだけを抜き出すようにしています。

# make search name=vim-7.4.334
Port:	vim-7.4.334
Path:	/usr/ports/editors/vim
Info:	Improved version of the vi editor
Maint:	sunpoet@FreeBSD.org
B-deps:	atk-2.8.0 cairo-1.10.2_10,2 compositeproto-0.4.2 cups-client-1.7.3 damageproto-1.2.1 dejavu-2.34_3 encodings-1.0.4_1,1 expat-2.1.0_1 fixesproto-5.0 font-bh-ttf-1.0.3_1 font-misc-ethiopic-1.0.3_1 font-misc-meltho-1.0.3_1 font-util-1.3.0_1 fontconfig-2.11.0_3,1 freetype2-2.5.3_2 gdk-pixbuf2-2.28.2_1 gettext-0.18.3.1_1 glib-2.36.3_3 gnomehier-3.0 graphite2-1.2.4 gtk-update-icon-cache-2.24.22 gtk2-2.24.22_3 harfbuzz-0.9.28 hicolor-icon-theme-0.12 icu-53.1 indexinfo-0.2 inputproto-2.3 intltool-0.50.2 jasper-1.900.1_14 jbigkit-2.1_1 jpeg-8_5 kbproto-1.0.6 libICE-1.0.8_2,1 libSM-1.2.2_2,1 libX11-1.6.2_2,1 libXau-1.0.8_2 libXcomposite-0.4.4_2,1 libXcursor-1.1.14_2 libXdamage-1.1.4_2 libXdmcp-1.1.1_2 libXext-1.3.2_2,1 libXfixes-5.0.1_2 libXft-2.3.1_2 libXi-1.7.2_2,1 libXinerama-1.1.3_2,1 libXpm-3.5.11_2 libXrandr-1.4.2_2 libXrender-0.9.8_2 libXt-1.1.4_2,1 libexecinfo-1.1_3 libffi-3.0.13_1 libfontenc-1.1.2_2 libiconv-1.14_3 libpthread-stubs-0.3_5 libxcb-1.10_2 libxml2-2.9.1_1 libyaml-0.1.6 lua52-5.2.3_2 mkfontdir-1.0.7 mkfontscale-1.1.1_1 p5-XML-Parser-2.41_1 pango-1.34.1_5 pcre-8.34_1 perl5-5.16.3_11 pixman-0.32.4_2 pkgconf-0.9.6 png-1.5.18 python-2.7_1,2 python2-2_2 python27-2.7.6_4 randrproto-1.4.0 readline-6.3.6_1 renderproto-0.11.1 ruby-1.9.3.484_2,1 shared-mime-info-1.1_1 tcl86-8.6.1 tiff-4.0.3_4 xcb-util-0.3.9_3,1 xcb-util-renderutil-0.3.9 xextproto-7.3.0 xineramaproto-1.2.1 xorg-fonts-truetype-7.7_1 xproto-7.0.25
R-deps:	atk-2.8.0 cairo-1.10.2_10,2 compositeproto-0.4.2 cscope-15.8a ctags-5.8 cups-client-1.7.3 damageproto-1.2.1 dejavu-2.34_3 encodings-1.0.4_1,1 expat-2.1.0_1 fixesproto-5.0 font-bh-ttf-1.0.3_1 font-misc-ethiopic-1.0.3_1 font-misc-meltho-1.0.3_1 font-util-1.3.0_1 fontconfig-2.11.0_3,1 freetype2-2.5.3_2 gdk-pixbuf2-2.28.2_1 gettext-0.18.3.1_1 glib-2.36.3_3 gnomehier-3.0 graphite2-1.2.4 gtk-update-icon-cache-2.24.22 gtk2-2.24.22_3 harfbuzz-0.9.28 hicolor-icon-theme-0.12 icu-53.1 indexinfo-0.2 inputproto-2.3 jasper-1.900.1_14 jbigkit-2.1_1 jpeg-8_5 kbproto-1.0.6 libICE-1.0.8_2,1 libSM-1.2.2_2,1 libX11-1.6.2_2,1 libXau-1.0.8_2 libXcomposite-0.4.4_2,1 libXcursor-1.1.14_2 libXdamage-1.1.4_2 libXdmcp-1.1.1_2 libXext-1.3.2_2,1 libXfixes-5.0.1_2 libXft-2.3.1_2 libXi-1.7.2_2,1 libXinerama-1.1.3_2,1 libXpm-3.5.11_2 libXrandr-1.4.2_2 libXrender-0.9.8_2 libXt-1.1.4_2,1 libexecinfo-1.1_3 libffi-3.0.13_1 libfontenc-1.1.2_2 libiconv-1.14_3 libpthread-stubs-0.3_5 libxcb-1.10_2 libxml2-2.9.1_1 libyaml-0.1.6 lua52-5.2.3_2 mkfontdir-1.0.7 mkfontscale-1.1.1_1 pango-1.34.1_5 pcre-8.34_1 perl5-5.16.3_11 pixman-0.32.4_2 png-1.5.18 python-2.7_1,2 python2-2_2 python27-2.7.6_4 randrproto-1.4.0 readline-6.3.6_1 renderproto-0.11.1 ruby-1.9.3.484_2,1 shared-mime-info-1.1_1 tcl86-8.6.1 tiff-4.0.3_4 xcb-util-0.3.9_3,1 xcb-util-renderutil-0.3.9 xextproto-7.3.0 xineramaproto-1.2.1 xorg-fonts-truetype-7.7_1 xproto-7.0.25
WWW:	http://www.vim.org/

# 

依存関係を調べる

依存関係を調べるためには以下のスクリプトを使います。pathに先ほど調べた「/usr/ports/editors/vim」を代入します。

#!/usr/local/bin/ruby

require 'open3'
ports = "/usr/ports"
path = "/usr/ports/editors/vim"
db = Array.new

def recPkg(db,pkg)
	s,e = Open3.capture3("cd #{pkg};make run-depends-list")
	s.each_line do |line|
		flag = false		#重複してたよフラグ
		line = line.chomp
		db.each do |column|
			if (line.gsub("/usr/ports/","") == column) then
				flag = true		#重複してたよ
				break
			end
		end
		if(flag == false) then	#重複していない場合はdbに依存情報を挿入
			db << line.gsub("/usr/ports/","")	
			recPkg(db,line.chomp)
		end
	end
end

recPkg(db,path)
db.sort!
puts db

動かします。

# ./recursive.rb
accessibility/atk
converters/libiconv
devel/autoconf
devel/bison
devel/cmake
devel/gettext
devel/glib20
devel/gmake
devel/gobject-introspection
devel/icu
devel/libcheck
devel/libexecinfo
devel/libffi
devel/libpthread-stubs
devel/libtool
devel/m4
devel/p5-Locale-gettext
devel/patch
devel/pcre
devel/pkgconf
devel/readline
devel/xorg-macros
graphics/cairo
graphics/gdk-pixbuf2
graphics/graphite2
graphics/gtk-update-icon-cache
graphics/jasper
graphics/jbigkit
graphics/jpeg
graphics/png
graphics/tiff
lang/lua52
lang/perl5.16
lang/python2
lang/python27
lang/ruby19
lang/tcl86
misc/help2man
ports-mgmt/pkg
print/cups-client
print/freetype2
print/harfbuzz
security/libgcrypt
security/libgpg-error
textproc/expat2
textproc/intltool
textproc/libxml2
textproc/libxslt
textproc/libyaml
textproc/p5-XML-Parser
x11-fonts/fontconfig
x11-fonts/libXft
x11-fonts/xf86bigfontproto
x11-toolkits/gtk20
x11-toolkits/libXt
x11-toolkits/pango
x11/bigreqsproto
x11/compositeproto
x11/damageproto
x11/fixesproto
x11/inputproto
x11/kbproto
x11/libICE
x11/libSM
x11/libX11
x11/libXau
x11/libXcomposite
x11/libXcursor
x11/libXdamage
x11/libXdmcp
x11/libXext
x11/libXfixes
x11/libXi
x11/libXpm
x11/libXrandr
x11/libXrender
x11/libxcb
x11/pixman
x11/randrproto
x11/renderproto
x11/xcb-proto
x11/xcb-util
x11/xcb-util-renderutil
x11/xcmiscproto
x11/xextproto
x11/xproto
x11/xtrans
#

依存関係が全て出ます。

このスクリプトは、下記のようにvimPortsの中で「make run-depends-list」で表示したPortsをまた再帰的に依存情報を調べています。

# cd /usr/ports/editors/vim ; make run-depends-list
/usr/ports/accessibility/atk
/usr/ports/devel/gettext
/usr/ports/devel/glib20
/usr/ports/devel/patch
/usr/ports/devel/pcre
/usr/ports/devel/pkgconf
/usr/ports/lang/lua52
/usr/ports/lang/perl5.16
/usr/ports/lang/python27
/usr/ports/lang/ruby19
/usr/ports/lang/tcl86
/usr/ports/ports-mgmt/pkg
/usr/ports/textproc/intltool
/usr/ports/x11-toolkits/gtk20
/usr/ports/x11-toolkits/libXt
/usr/ports/x11-toolkits/pango
/usr/ports/x11/libXpm
#

上記に表示されたpkgも全てfetchすればvimが正常にインストールできます。



もっと簡単に依存関係が分かる方法を知っていたら教えて下さい(`;ω;´)

以上。

嫌がらせに片っ端から名前解決したらDNS名前衝突ブロックリストに載るの?




というわけでスクリプト
辞書はOpenWallからいただきました。
Index of /pub/wordlists/languages/Japanese

#!/usr/bin/ruby

require 'open3'

wordlist = "lower_jp"
domain = "nom"
s,e = Open3.capture3("cat #{wordlist}")
s.each_line do |str|
	lne,e = Open3.capture3("dig #{str.chomp}.#{domain}")
	puts lne
	sleep(1)
end

これで日本語をローマ字にしたドメインがブロックリストに載るのかな?

jail内でpkgng初回起動時のダイアログが出ないようにする

FreeBSD10.0でpkgngが出ましたが、
jail内でpkgを初回起動する際に、

Do you want to fetch and install it now? [y/N]:

というダイアログが表示されます。
通常使用のFreeBSDであれば自分でyを入力して進めればいいのですが、
今回はスクリプトで動かすので途中で止まると厄介です。
しかもjail作成直後はネットワークに接続されていない状態なのでサーバからpkgngを取得することもできません。

そういう時はpkg-staticを使用します。

ホスト側のpkg-staticをbasejailにコピーします。

# cp /usr/local/sbin/pkg-static /usr/jails/basejail/sbin/

そしてjexecでpkg-staticを動かします。

jexec $1 pkg-static add /pkg/$pkg

これでダイアログは出なくなります。

以上。

 
参考文献
pkg-static(8)
The FreeBSD Forums • View topic - pkg unattended install

(ネタバレ注意)#RECRUIT_CODE、全問を解いてみた(?)

f:id:shutingrz:20140604224140p:plain
クリア画像。q1からq5、そしてlast questionを解くと表示されます。
クリアしたところで何も良いことはないけど。



というわけで、このたびリクルートが出したインターンシップの特設ページの暗号解読サイトを解いてみます。

解読できる学生求む!ターミナルに残された暗号 #RECRUIT_CODE|リクルートホールディングス サマーインターンシップ 2014

といっても正攻法では解けないんですけど。
どうしてもクリアしたかったので裏道からクリアしてみました。


↓↓↓※ネタバレ注意です※↓↓↓




























それでは見て行きましょう。おもむろにFireBugを開き、回答を送信した際のレスポンスを確認してみます。

f:id:shutingrz:20140604224913p:plain

うーん、何も通信はしていないのにWrong Answerと応答がされますねー。ということで、全てクライアントで処理しているってことがわかります。
つまりjsのコードに解答が存在し、その解答と比較して正解かどうかを判定しているんですね。

というわけで、ページのソースコードを確認してみましょう。こういう時はscriptタグのsrcを見ると該当処理のソースがあるんですよ。

今回このページがインポートしてるjsは、

<script src="../js/lib/md5.js"></script>
    <script src="../js/lib/jquery.js"></script>
    <script src="../js/lib/underscore.js"></script>
    <script src="../js/app.min.js"></script>
    <script>

の4つです。上3つはlibディレクトリに存在するので、これは自作ではなさそうなので一番下のapp.min.jsが怪しいです。見てみましょう。

app.min.jsの中身を見ると、ターミナルを形付けるソースコードだとわかります。
しかしソースコードが長いので、解答がありそうなところだけ探してみます。
先ほど回答を入力した際に表示された、「Wrong Answer」を検索ワードにし、前後のソースコードを見ます。

f:id:shutingrz:20140604225621p:plain
すると、左下付近に、answerHashがあるのがわかります。これは、解答をハッシュして比較しているんでしょう。
また、これはどんなアルゴリズムでハッシュされたのでしょうか。先ほどの特設ページのscriptタグを見てみます。

<script src="../js/lib/md5.js</span>"></script>
    <script src="../js/lib/jquery.js"></script>
    <script src="../js/lib/underscore.js"></script>
    <script src="../js/app.min.js"></script>
    <script>

1行目を見てください。これはmd5ですね。
まあこれは別にわからなくてもいいです。
というのは、ハッシュをそのままググれば検索結果にハッシュのレインボーテーブルが載ったサイトがヒットするからです。

とりあえず、全ての解答のハッシュを抜き出してみましょう。

{answerHash:["e155e1bb4a9c38e3baf90637ab7865df"],name:"answer_1",question:"Q1"}),c.app.answer_2=new i({answerHash:["7d9a0d11cb36e12a68817aff945390de"],name:"answer_2",question:"Q2"}),c.app.answer_3=new i({answerHash:["312db69f5bf4447dfe3c58983083b54f"],name:"answer_3",question:"Q3"}),c.app.answer_4=new i({answerHash:["9c8d9e1d80fc923ca7d532e46a3d606f"],name:"answer_4",question:"Q4"}),c.app.answer_5=new i({answerHash:["5494af1f14a8c19939968c3e9e2d4f79","9300f2256529efedc2300a9d4e1879d0"],name:"answer_5",question:"Q5"})}


わかりますか?例えばq1の答えはe155e1bb4a9c38e3baf90637ab7865dfを平文に変換したものです。
このハッシュにsaltがなく、また平文が英字で構成されたものであればほぼ100%、検索に引っかかります。
このハッシュでググってみましょう。

f:id:shutingrz:20140604230706p:plain
でました。q1の答えは「life」です。
以下、同様にググっていけば全ての解答が判明します。
あ、last questionもありますが、それもこの方法が使えます。




以上。