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 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)の全依存関係を表示する
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
バグのあるスクリプトは依存関係を調べるスクリプトで、修正箇所は
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 #
依存関係が全て出ます。
このスクリプトは、下記のようにvimのPortsの中で「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名前衝突ブロックリストに載るの?
http://t.co/U2qKqlCkwg のドメインが既にとれないっていうのはどういうこと。まだ、ランドラッシュだよね。だれかが押さえたって事?それとも、インターリンク社が取れないように拒否しているとか、そういうのあるの?
— tomocha @転職活動中 (@tomocha0) 2014, 6月 30
俺俺TLDで遊ぶ場合は、rootにクエリを送るなよ。万が一その俺俺TLDが正式に登録された場合、俺俺ドメインがDNS名前衝突ブロックリストにのるぞ!気をつけろ!って事か。
— こんごー@頑張らないために頑張る (@kongou_ae) 2014, 7月 1
というわけでスクリプト。
辞書は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、全問を解いてみた(?)
クリア画像。q1からq5、そしてlast questionを解くと表示されます。
クリアしたところで何も良いことはないけど。
というわけで、このたびリクルートが出したインターンシップの特設ページの暗号解読サイトを解いてみます。
解読できる学生求む!ターミナルに残された暗号 #RECRUIT_CODE|リクルートホールディングス サマーインターンシップ 2014
といっても正攻法では解けないんですけど。
どうしてもクリアしたかったので裏道からクリアしてみました。
↓↓↓※ネタバレ注意です※↓↓↓
それでは見て行きましょう。おもむろにFireBugを開き、回答を送信した際のレスポンスを確認してみます。
うーん、何も通信はしていないのに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」を検索ワードにし、前後のソースコードを見ます。
すると、左下付近に、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%、検索に引っかかります。
このハッシュでググってみましょう。
でました。q1の答えは「life」です。
以下、同様にググっていけば全ての解答が判明します。
あ、last questionもありますが、それもこの方法が使えます。
以上。