Chromeのflashって組み込みなのを今頃知った

元々無効化してたflashをアンインストールした。しかし、Chromeだけよくみたら「プリインストールされています」とか書いてあるのでなんかと思ったら組み込みだった。Chromeと一緒に更新されるらしい...というか、flashが更新されるとChromeのバージョンも上がるのねって思った。まぁ無効のままなんだけど。以下参考にしたURLのメモ。

Windowsでbcrypt gemを使うのに一癖あった

Windowsでbundle installで入ったbcryptを使おうとしたら以下のような感じで怒られた。

LoadError: cannot load such file -- bcrypt_ext
C:/.../config/application.rb:7:in `'
C:/.../Rakefile:4:in `require_relative'
...

確かにbcrypt_ext.soがないのでコンパイルされてなさそうだとコンパイル(DevKitが必要)。というか作っては削除し作っては削除しという稀有な環境なので一時的にインストールまでしてしまった。site-ruby以下にあると思うので、gem uninstallの時に注意しとこう。あるいは違うバージョン使う時とか。makeだけでもいい気もするけどそれで動くかは確認していない。

> cd \path\to\ruby\lib\ruby\gems\2.3.0\gems\bcrypt-3.1.11-x86-mingw32\ext\mri
> ruby extconf.rb
> make
> make install

さて当面は問題なくなったので、Issueがなければ報告しようとおもったらすでにあった。なんか長引いてるみたいなので修正にはしばらくかかるのかもしれない。

2018/08/12追記: 3.1.12で直ったらしい。これはうれしい。

Apache+passengerでRailsアプリを動かす場合は必要なくてもGemfileにpassengerを書くことにした

Rails側からは使わないから不要なんだけど、書くというお話し。

自分が使ってるLinux(主にVM)にはだいたいruby_auditbundler-auditがセットで仕込まれてて、cronでRuby本体/RubyGems/入れてるgemの脆弱性に未対応のものがないかメールで通知するようにしてる。

bundler-auditは当たり前だけどGemfileを見る必要があるのでそれに書いてないものは見てくれない。passengerはBundlerから読まれないのでうっかり見落としてしまう事があったので対策としてpassengerと関係する側のRailsアプリのGemfileに書いておく事で同じくくりでメールが飛んでくるようにした。

git configで名前とメールアドレスにを設定してもちゃんと無視される

git logの名前とか正規表現で抜き出したくなったので、<や>が使えない事を確認。
設定はできるんだけどコミットしたら削除されちゃうようだった。

この辺の話かなぁ。

(nb "<", ">" and "\n"s are stripped)

やってみる。

$ git config --local user.name "Sho>__<@example.com"
...
user.name=Sho>__<@example.com

(何かしらコミット)
$ git log
...
Author: Sho_Hashimoto 

おぉ。確かに消された。

ところでnbはnota beneの事かなぁ?

reveal-ck便利

SITW#33で常設CTFをもくもくする回をやった。この時にずっともくもくしてても詰まった時から残り時間が辛いものになるかもと思ったので、ヒントスライドを作る事にした。

以下などができるreveal.jsを使う事にしたんだけど、新しい悩み事としてスライド作る度にreveal.jsをcloneなどしないといけないのが嬉しくなかった。作った資料を手元のgitレポジトリにコミットし辛い。

  • スライドの内容をランダムに表示できる
  • スライドの遷移を自動化できる

最初はsubmoduleで対応していたが、ヒント用と解説用で別々にスライドを作りだしたら管理にまた困ったので最終的にreveal-ckを使うようにした。普通の目的に使う分には既に色々見つける事ができるからいいとして、個人的にはslides.mdと同じディレクトリに置くconfig.ymlで以下のような設定が事前にできるのがよかった。

title: "..."
theme: "simple"
revealjs_config:
  # 延々と流すのでヒストリを残さない。
  'history': false
  # スライドをシャッフルする。
  'shuffle': true
  # 一定時間で自動遷移する。
  'autoSlide': 30000
  # ループ再生する。
  'loop': true
  # コントロールを表示しない
  'controls': false
  'progress': false

ソース読んだけど、ドキュメント的にはFAQの辺りに少々載ってる様子。自動遷移やランダム再生だけじゃなくて、ヒストリに残さないなども設定できて便利だった。

reveal.jsの機能かreveal-ckの機能かわからないけど、ファイルの更新を監視してるから更新してもすぐに反映される。config.ymlも見てるみたいだからreveal-ckの機能かもしれない。とても便利だ。

しばらく使ってみようなどと思った。

RailsInstaller 3.3.0は動かないけど3.2.1は動く

少し前の話だけど、Windows向けのRailsInstallerの新しいバージョンがでていてイベントの準備で動作確認をした。以前よりパスがハードコーディングされててそのままでは動かないみたいな話があったりする。

可能なら直してPRしようと思ってmasterをビルドしてみたら動くのではて?と思いもう少し追いかけたらPRがあった。masterである3.2.1の方はscaffoldしてみるくらいまで試したが動くようだ。

「リリース前にテストしてるん?」みたいなチケットも見かけたのでもうメンテナンスしないのかもと思って探してみるとそんな記事も見つかったりした。

3.2.1/3.3.0タグのどちらも存在しないようだし困る人がいるならその人が引き取らないとダメそう。たぶん3.3.0が動かないのは3.2.1の修正が適切にマージされてないのだろう。タグがないのでちゃんと比較してはないけど。

せめてビルドするまでに引っかかった所だけPRして自分はおしまい。

追記: 3.4.0がダウンロードできるみたいだ。差分はRuby/Railsのバージョン更新とバッチまわりのみっぽい。

Plaid CTF 2016 Write Up

2016/04/15-17でやってたPlaid CTF 2016のWrite Up...だけど一問も解けなかったなぁ。難しかった...でもこれくらいのレベルのものが解けると面白いなぁ。

用事もあった関係でまともにチャレンジしたのは以下くらいだった。どちらもスタートラインに立ったくらいで死んでる。ので、以下はただのメモ。

reversing 175: quick

何者か確認する。

$ file quick_a2f3cce1589f4fb6d339a785cfe78c4d
quick_a2f3cce1589f4fb6d339a785cfe78c4d: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, stripped

$ ./quick_a2f3cce1589f4fb6d339a785cfe78c4d
./quick_a2f3cce1589f4fb6d339a785cfe78c4d: error while loading shared libraries: libswiftCore.so: cannot open shared object file: No such file or directory

$ ldd ./quick_a2f3cce1589f4fb6d339a785cfe78c4d
	linux-vdso.so.1 =>  (0x00007ffc967dd000)
	libswiftCore.so => not found
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fed74c89000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fed74980000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fed74769000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fed7439f000)
	/lib64/ld-linux-x86-64.so.2 (0x0000560b18fe9000)

Linuxの実行ファイルでlibswiftCore.soがみえないのでそれをくべてやったら
よさそうだ。以下によるとUbuntuでもできるのね。へー。

libswiftCore.soの素性にもよるけど、以下を見るにここからダウンロードしたものっぽい。展開してみるとビルド済みのものみたいだからそれを使う。

$ strings quick_a2f3cce1589f4fb6d339a785cfe78c4d
...
/home/ctf/swift-2.2-RELEASE-ubuntu15.10/usr/lib/swift/linux
...

/home/ctf/swift-2.2-RELEASE-ubuntu15.10に配置するか、`$ LD_LIBRARY_PATH=/path/to/展開した場所 ./quick_a2f3cce1589f4fb6d339a785cfe78c4d` とすればlddから「not found」が消えると思うけど仮想環境でやってたので雑に前者でやった。

さて、実行できるようになったはいいんだけど、これが何かわからなくて解けず。

$ ./quick_a2f3cce1589f4fb6d339a785cfe78c4d
Please provide your input.

Good job!
$ ./quick_a2f3cce1589f4fb6d339a785cfe78c4d
Please provide your input.
a
Nope!

コード書いて解くかgdbで頑張るかだと思うけど後者だと解けないなぁ。

ひとさまのwrite upを見た後

以下を見るに更にgdbで処理の一部を回避したりすると抜けるようだが...うーん、難しい(諦めた)。

misc 50: morset

  • まずはtelnetで繋いでみる
  • ...-- - .--. といったテキストを受け取るのでmorsetなだけにモールス信号として読んでみる
$ telnet morset.pwning.xxx 11821
Trying 40.117.46.42...
Connected to morset.pwning.xxx.
Escape character is '^]'.
...-- - .--. ..--- . ..-. .. --- ----- -.-- -.-. ... .-. ...- .--- .... -.- ..-. .- -... .-.. ...-- ...- -. .-.. -.- ----- ... -.... . .-.. .--- --.- .-. ...-- .--- -- --. -- .. ..... -.-- -... ----. - -..- ---.. ...-- .... .. .- - -..- .-- .. -.- ----- -.- .-.. --. ...-- ..... .--- .- --.- -.... -. -.-. -... .- --.. -.- -. ...--

"3TP2EFIO0YCSRVJHKFABL3VNLK0S6ELJQR3JMGMI5YB9TX83HIATXWIK0KLG35JAQ6NCBAZKN3" などが手に入るがbase64でもないし換字暗号にしては空白がないなぁ。単語の区切りが使ってるgemの想定と違ってるのだろうか?morse gemを使ってたんだけど止めてみても同じだ。

ひとさまのwrite upを見た後

結局わからなかった。以下を見るに更にbase36でdecodeしてsha1を計算したらよかったようだ。そうか空白をなくすためにbase36ね...頭いいなぁ。

という事でコードを書いておわり。Rubyだとbase36はto_i(36)すればいいの楽ね。base36 gemが存在しない訳だ。

$ cat solve.rb

# gem install net-telnet morse
require 'net/telnet'
require 'digest/sha2'
require 'morse'

module Base36
  def encode36(s)
    s.unpack("H*").first.to_i(16).to_s(36)
  end

  def decode36(s)
    hex = s.to_i(36).to_s(16)
    size = hex.length % 2 == 0 ? hex.length : hex.length + 1
    [hex.rjust(size, "0")].pack("H*")
  end

  module_function :encode36, :decode36
end

telnet =
  Net::Telnet.new("Host" => "morset.pwning.xxx", "Port" => 11821, "Timeout" => 10)
begin
  telnet.login("", "") do |s1|
    problem = Base36.decode36(Morse.decode(s1))
    puts problem
    if md = /What is the SHA256\(([^)]+)\)/.match(problem)
      digest = Digest::SHA256.hexdigest(md[1])
      res1 = Base36.encode36(digest)
      res2 = Morse.encode(res1)
      puts "sha256: #{digest}"
      puts "res(base36): #{res1}"
      puts "res(morse): #{res2}"
      telnet.cmd(res2) do |flag|
        puts Base36.decode36(Morse.decode(flag))
      end
    end
  end
rescue
ensure
  telnet.close
end

$ ruby solve.rb

 ,+.
((|))
 )|(
((|))
 `-'
What is the SHA256(Peanut2219310921)?
sha256: fdc0470c02ae587b49028dc7f63b511517ab2826203c13bcf7c6bd78383d7202
res(base36): ga709sl0xr5ubktb7qbvgbaocwfz7yjor3yg80024agbfxx2kjlo77wpsh76lkyrobcjm4ggn90o0cs1uildrptzgdk804broky
res(morse): --. .- --... ----- ----. ... .-.. ----- -..- .-. ..... ..- -... -.- - -... --... --.- -... ...- --. -... .- --- -.-. .-- ..-. --.. --... -.-- .--- --- .-. ...-- -.-- --. ---.. ----- ----- ..--- ....- .- --. -... ..-. -..- -..- ..--- -.- .--- .-.. --- --... --... .-- .--. ... .... --... -.... .-.. -.- -.-- .-. --- -... -.-. .--- -- ....- --. --. -. ----. ----- --- ----- -.-. ... .---- ..- .. .-.. -.. .-. .--. - --.. --. -.. -.- ---.. ----- ....- -... .-. --- -.- -.--

Nice! Here's a flag for you: PCTF{c0c0c0nutBaze_4__d4ys}.
flag: PCTF{c0c0c0nutBaze_4__d4ys}