YDiary

メモ的な

VPNを使うとWSLからTLS接続ができなくなる

問題について

タイトルの通りです。
リモートワーク等でWindows標準のVPN機能を利用すると、何故かWSL内からTLS接続ができなくなるという現象が発生していました。

完全にインターネット通信が出来なくなる訳ではなく、例えばpingや平文HTTPなどは問題なく通信できます。

> ping google.com
PING google.com (172.217.174.110) 56(84) bytes of data.
64 bytes from nrt12s28-in-f14.1e100.net (172.217.174.110): icmp_seq=1 ttl=117 time=51.8 ms
64 bytes from nrt12s28-in-f14.1e100.net (172.217.174.110): icmp_seq=2 ttl=117 time=69.8 ms
64 bytes from nrt12s28-in-f14.1e100.net (172.217.174.110): icmp_seq=3 ttl=117 time=40.1 ms
64 bytes from nrt12s28-in-f14.1e100.net (172.217.174.110): icmp_seq=4 ttl=117 time=66.1 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 40.121/56.953/69.763/11.801 ms
> curl http://google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

ところがTLSHTTPS)接続を試してみると…。

> curl -vvv https://google.com
*   Trying 172.217.174.110:443...
* TCP_NODELAY set
* Connected to google.com (172.217.174.110) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* OpenSSL SSL_connect: Connection reset by peer in connection to google.com:443
* Closing connection 0
curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection to google.com:443

このように途中でコネクションがリセットされてしまいます。

TLS接続だけかと思いきや、 apt install のような一部のHTTP通信でも通信できなくなる場合があります。

解決策

とりあえずWSLとVPNに関する通信関連のトラブルについて探してみると下のドキュメントがヒットします。

VPN に接続されると、bash のネットワーク接続が切断される
WindowsVPN に接続した後、bash のネットワーク接続が切断される場合は、bash 内からこの回避策を試してください。 この回避策により、/etc/resolv.conf を使用して DNS 解決を手動で上書きできます。

Windows Subsystem for Linux のトラブルシューティング | Microsoft Docs

症状的には似ていますが、どうやらDNSサーバを手動で設定する方法のようです。
今回の症状は、先に述べたようにpingやHTTPが通っているためドメイン名の名前解決自体は何の問題もなく行えています。
そのため、この対処法は今回のトラブルとは無関係でしょう。

さらに探しているとmicrosoft/WSLリポジトリのissueで次のようなコメントを見つけます。

May this could be a fix for you:
Set MTU to the value of the VPN interface:
sudo ifconfig eth0 mtu 1350

While connected to VPN the curl command hangs up · Issue #4517 · microsoft/WSL · GitHub

あー、なるほど。MTU値が原因ね。

というわけでMTU値を調べてみます。

まずはWindows側から

> netsh interface ipv4 show subinterfaces

   MTU  MediaSenseState  受信バイト   送信バイト  インターフェイス
------  ---------------  -----------  ----------  -----------------
  1376                1    1484402     847609  VPN
//...

ふむふむ。次はWSL側

# ip link show
//...
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
//...

はい、ビンゴです。
VPNによってMTU値が減少していたのが正しくWSL側に伝わっておらず、1376バイトを超えるパケットが経路上で破棄されていたため上手く通信できていなかったのでしょう。 pingやHTTPが通ったのはパケットのサイズが1376バイト以内に収まっていたからだと考えられます。
一方で、HTTP通信であるのも関わらず apt install が通らなかったのは、パケットのサイズが1376バイトを超えていたからでしょう。

対処法は上のコメントの通り、WSL側のインタフェースにも適切なMTU値を設定することです。
そうすることで、次のようにVPN経由でも問題なくインターネット通信が行えるようになりました。

# ip link set eth0 mtu 1376
# curl https://google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.com/">here</A>.
</BODY></HTML>

めでたしめでたし。

新しいEdgeでChromecastを使う

新しくなったEdge

2020年1月16日にChromiumベースの新しいEdgeがリリースされましたね.
自分はWindows Updateで適用されるのを待とうと思ってたのですが,どうも日本に対してはその稀有なIT事情*1に考慮して,Windows Updateでの配信は4月以後となるようです.
なので,早めに試してみたい場合は公式サイトからサクッとインストールしてしまいましょう.

Download New Microsoft Edge Browser | Microsoft

なんか環境によってLPは英語なのにライセンス条項がフランス語だったりするみたいですが,インストーラはちゃんと日本語のようです.

拡張機能

さて,ご存じの通りChromiumベースになったので,Chromeの機能が多数使えるようになっています.その中でも拡張機能は基本中の基本ですね.

パッと見Microsoft Storeにある拡張機能しかインストールできないような雰囲気ですが,拡張機能ページの左下にこっそりと配置されているスイッチをオンにすることで,なんとChrome Web StoreからGoogle Chrome向けの拡張機能を直接インストールできるようになります.

f:id:YDKK:20200118183645p:plain
f:id:YDKK:20200118183936p:plain

いやー,他社のインフラにそのままタダ乗りするスタイル.すごく良いですね.

ただし,ほとんどの拡張機能はそのまま動くようですが,Googleアカウントを用いた認証を行うような拡張機能*2などは上手く動作しないようです.おそらくその辺はChromiumではなくChrome側にある独自実装などと連携して動作しているのでしょうね.

Chromecast

さて,拡張機能の他にも,Chromiumベースになったことで使える機能に,Chromecastがあります.
ご存じの通り,Chromecastとはブラウザで再生してる動画や音声などをChromecastデバイスに対してキャストする機能です.例えば,SoundCloudの音楽を,Chromecast Audioを接続したスピーカで再生する,という風に便利に使えます.*3

ところが,どうも公式リリースされたEdgeでは,このChromecast機能が動作しないようです.

f:id:YDKK:20200118190028p:plain
SoundCloudのプレーヤ部分(上:Chrome,下:Edge)

自分はInsider版の頃から新しいEdgeを使っていたのですが,だいぶ前からChromecastには対応しており,技術的にEdgeがChromecastに対応可能であるのは間違いありません.

f:id:YDKK:20200118185547p:plain
Chromecast対応を伝えるInsider向け更新情報

単なるバグなのか,はたまたGoogle側と折り合いがつかなくなって削除されたのかなどは定かではありませんが,ともかく今のEdgeではChromecast機能が使えなくなっています.

EdgeでChromecastを使えるようにする

それでは不便なので,今回はEdgeで使えなくなっているChromecast機能を使えるようにする方法を探してみます.

とりあえずそれっぽいところを探してみると, edge://flags 内に #cast-media-route-provider という項目があり,コレを Enabled にすることで メニュー→その他のツール→メディアをデバイスにキャスト が使えるようになります.

f:id:YDKK:20200118190727p:plain

ただし,コレによって有効になるのはメディアのミラーリング*4のようで,WebサイトのCastボタンは相変わらず表示されないのでメディアのソースをキャストすること*5は出来ません.

ただ,ミラーリングだけでも使えるようになったことから,この辺のコンポーネントがChromecast機能に絡んでいることは間違いなさそうです.そこで,説明文中にある the Media Router component extension とやらについて調べてみます.

すると,どうもそのChrome Media Routerという組み込み拡張機能がChromecast機能の中核を担っているようです.
恐らく,Edgeではこの組み込み拡張機能が削除されたり,無効化されてしまっているのでしょう.

となれば話は早いもので,Chromecastが使える他のブラウザからこの Chrome Media Router 拡張機能を取ってくればいいのです.

Chromecastが使えるブラウザと言えばChromeですね.早速インストールしましょう.

Chrome内では,Chrome Media Router 拡張機能pkedcjkdefgpdelpbcmbmeomcjbeemfm というIDでインストールされているようです.Chromeのプロファイルディレクトリの中(たぶん %LocalAppData%\Google\Chrome\User Data\Default\Extensions あたり)を見てみると,同名のディレクトリが見つかると思います.

f:id:YDKK:20200118192608p:plain

このディレクトリを適当な場所にコピーしましょう.

そして,Edgeの 拡張機能 ページの左下から 開発者モード を有効化し,右上の 展開して読み込み ボタンからコピーした先のディレクトリ内にある 7919.1028.0.0_0 みたいな名前のフォルダ*6を指定して拡張機能を読み込みます.

f:id:YDKK:20200118193027p:plain

するとこんな感じで Chrome Media Router が読みこまれるので,この状態でChromecastに対応しているサイトにアクセスすればちゃんといつものCastボタンが表示され,きちんと機能するはずです.*7

ブラウザ起動時に表示される警告を抑制する

さて,コレで一件落着かと思いきや,ブラウザを再起動すると毎回こんなダイアログが表示されることに気が付くと思います.

f:id:YDKK:20200118193446p:plain

コレは文字通り,非正規の方法でインストールされた拡張機能*8は危険な可能性があるため,必要が無ければ無効化するように促すものです.

Chromeは少し前からChrome Web Store以外からの拡張機能のインストールを完全にブロックする方針であり,Chromiumを使ったEdgeもそのままこの実装に倣っています.先ほど Chrome Media Router をインストールした方法は,開発者が開発した拡張機能をテストするための方法であり,一般ユーザが野良拡張機能インストールの抜け道として使わないように毎回しつこく警告を出しているものです.

さて,このままでは毎回ブラウザを起動するたびにうっとおしいので,Chromecast機能が正式にサポートされるようになるまでのつなぎとして,少しでもこのダイアログの表示を抑制する方法を考えます.

調べてみると,Edgeの実行バイナリを書き換えて当該のダイアログを表示するコードを無効化する方法があるようですが,実行バイナリを書き換えた場合,DRMモジュールであるWidevineの呼び出し元バイナリの正当性検証が通らなくなってしまい,Amazon Prime VideoなどをはじめとするWidevine DRMを利用しているサイトのコンテンツが閲覧できなくなってしまいます.

なので,ここでは Chrome Media Router 拡張機能マニフェストを書き換えて,拡張機能をバックグラウンド実行するように改変します.

先ほどコピーしたディレクトリ内にある manifest.json ファイルを開き,permissions 配列の中に "background" を追加し,拡張機能をインストールし直しましょう.

f:id:YDKK:20200118195144p:plain

コレによって,ブラウザを閉じても Chrome Media Router 拡張機能がバックグラウンドで動作し続けるようになります.

f:id:YDKK:20200118195249p:plain

結果的に,警告の表示頻度がブラウザを起動する度たびから,PCを再起動するたびまで減るので,何とか実用に耐えうるんじゃないかと思います.

なお、Chromeの場合グループポリシで拡張機能のIDをホワイトリストに登録することでこのダイアログを抑制できるようですが、EdgeではグループポリシテンプレートがChromeのものと異なっており、同じ方法は使えませんでした。

フィードバックを送ろう

こんな面倒な作業をしなくても済むように,みんなで早く公式でChromecastをサポートするようにお願いするフィードバックを送りましょう.

f:id:YDKK:20200118195826p:plain

*1:日本のお客様に対しては、確定申告への影響を考慮し、Windows Updateを通じた新しいMicrosoft Edgeの配信は令和2年4月1日以降、順次開始される予定です。 https://blogs.windows.com/japan/2020/01/16/new-year-new-browser-the-new-microsoft-edge-is-out-of-preview-and-now-available-for-download/

*2:例えば,Google Keep Chrome 拡張機能など

*3:関係ないけどChromecast Audio再販してほしいな….

*4:ブラウザ内で再生した音声・動画を転送すること.帯域を多く使うし不安定.

*5:動画や音声のソースURLを送信して,Chromecast内で再生してもらうこと.

*6:多分一つしかないはず.

*7:edge://flags から設定を変更してた場合は元に戻しておきましょう.

*8:いわゆる野良拡張機能

SlackからLINEを使う

はじめに

個人的にLINEが嫌いなので普段は使ってないのですが,その場合LINEで形成されてしまったコミュニティの情報にアクセスすることができなくなってしまいます.

そこで,SlackのチャンネルとLINEのグループなどとの間でメッセージを相互にやり取りするツールを作成し公開しました.

github.com

コレを使うことによって,Slackを使っている人はSlackのチャンネルに,LINEを使っている人はLINEのグループなどにそれぞれメッセージを投稿することで,もう片方のプラットフォームを利用していない場合でも相互にコミュニケーションを図ることが可能になります.

仕組み

f:id:YDKK:20191101220243p:plain

仕組みは単純で,上の図のようにSlack側はIncoming/Outgoing Webhooksを,LINE側はMessaging APIを利用してそれぞれのメッセージを相互に転送することで実現しています.

スクリーンショット

Slack側
f:id:YDKK:20191101223418p:plain

LINE側
f:id:YDKK:20191101223428p:plain

実際に利用している際のスクリーンショットは上のような感じで,お互いにプラットフォームの違いを意識することなくシームレスに利用することが可能です.
(アイコンやスタンプに対応していなかったりはしますが.)

おわりに

実はモノ自体はかなり前から出来ていてずっと使っていたのですが,急いで実装したので他のサービスに相乗りしていたうえに,IDなどがコード中にベタ書きというひどい状態でした.

公開したものは,今後ちょっと使用機会が増えそうだったので,関連付けを拡張しやすいように一から作り直したものです.ちょうど自宅サーバを移行してたり .NET Core 3.0 が出てたので触ってみたかったりというのもあります.

おまけでDockerにも対応してみました.ちょうどGitHub Package Registryもリリースされたので試しに置いてみたのですが,どうもパブリックリポジトリにも関わらずpullするにはGitHubアカウントでの認証が必要なんですね.Actionsとかから使う分には問題ないんでしょうけど,一般に公開する用途だと普通にDocker Hubに置くのが良さそうだなーという気がします.この辺ひょっとしたら自分の理解不足で実はどっかから認証外したりできるのかもしれませんが.

というわけで,SlackからLINEを使うツールでした.

第二種電気工事士を取得した

social.0ko.me

先日,第二種電気工事士試験に合格し,第二種電気工事士を取得*1しました.

IPA試験なんかと違い,業務独占資格なので持ってると一般用電気工作物の工事を行うことが出来るという特典があります.一般用電気工作物とは,ざっくりいうと普通の家などの600V以下の電圧で受電する電気設備のことを言います.

つまり,これを持ってると合法的に家のコンセントやスイッチなんかを弄れるわけです!壁のコンセントを増やしたり,USB給電が可能なソケットに付け替えたり,壁のスイッチをIoTスイッチに取り換えたり,インターホンを交換したりすることなどなどを業者を呼ばずに自分でできるようになるのです.夢が広がりますね.

さて,せっかくなのでそんな便利な資格を取るまでに必要な手順や勉強したことなどを紹介したいと思います.

タイムライン

上期試験に申し込んで合格するまでの流れはこんな感じです.

日付 できごと
3月14日 試験申し込み
5月20日 筆記試験の受験票が届く
5月31日~ 勉強や写真の準備を始める
6月2日 筆記試験
7月4日 技能試験の受験票が届く
7月15日~ 技能試験の勉強を始める
7月20日 技能試験
8月19日 結果発表

3月14日 申し込み

social.0ko.me

兎にも角にも申し込みをしないことには始まりません.逆に言えば,申し込みさえしてしまえば(受験料を無駄にしたくないという思いから)大抵は何とかなります.

取ろうか迷っている資格がある場合はとりあえず申し込みましょう.

5月20日 筆記試験の受験票が届く

social.0ko.me

申し込みをすると,忘れた頃に筆記試験の受験票が届きます.この辺から,そろそろ試験勉強を意識し始めます*2

5月31日~ 筆記試験の勉強や写真の準備を始める

social.0ko.me

social.0ko.me

social.0ko.me

流石にノー勉で試験に臨むのはまずいので,ぼちぼち筆記試験の勉強を始めます.受験票に貼る写真のサイズが45mm×35mmとやや特殊なので,注意しましょう.

6月2日 筆記試験

social.0ko.me

social.0ko.me

social.0ko.me

筆記試験の会場は立教大学の池袋キャンパスでした.

受験票には「会場には時計が無い場合があります」って書いてありましたが,大学の教室なので流石に時計ぐらい置いてあるだろうと思って何も持たずに行ったら*3本当に置いてありませんでした.普段どうやって授業してるんですかね.

social.0ko.me

自己採点

無事に筆記試験を終え,良さそうな手ごたえを感じつつ帰宅.気になるので解答速報を調べたら,その日のうちに上がってたのでそれをもとに自己採点.

social.0ko.me

自己採点の結果は84点でした.

social.0ko.me

筆記試験の合格ラインは6割なので,この時点で勝ちを確信します.

social.0ko.me

7月4日 技能試験の受験票が届く

social.0ko.me

また忘れた頃に技能試験の受験票が届きます.そろそろ技能試験勉強を意識し始めます*4

7月15日~ 技能試験の勉強を始める

social.0ko.me

social.0ko.me

技能試験問題を初見で解いた結果がこちらです.まだ保護被覆を剝く長さなどが全く頭に入っていないため,えらく不格好です.ジョイントボックス部分は短すぎるし,ランプレセクタプル部分は長すぎです*5

また,試験本番では40分で作らないといけないのに1時間以上かかっています.流石に少し焦ります.

そのまま2問目へ

social.0ko.me

一度手を動かすと大分イメージが湧くようになるので,一回目よりはだいぶ出来が良くなります.ジョイントボックス部分なども,作業しやすいように長めに保護被覆を剥くようになってます.時間も大分短縮できましたが,40分ちょうどぐらいかかっているので,まだ時間的余裕は全くありません.

技能試験の候補問題は全部で13問あり,当日はその中から一つが出題されるという形式なので,あと11問練習しないといけません.ただ,問題全体を通してみると結構共通な部分*6も多く,解けば解くほど上達を実感できるようになっています.

ここから先は解くのにかかった時間をダイジェストで紹介します.

問題 解いた日 時間 完成品
問題01 7月15日 1時間以上 https://social.0ko.me/@YDKK/102441374227779059
問題02 7月15日 40分 https://social.0ko.me/@YDKK/102441641722367053
問題03 7月17日 38分 https://social.0ko.me/@YDKK/102455492652853436
問題04 7月17日 37分 https://social.0ko.me/@YDKK/102455988453483141
問題05 7月17日 N/A*7 https://social.0ko.me/@YDKK/102456932539931680
問題06 7月18日 34分 https://social.0ko.me/@YDKK/102457533691344191
問題07 7月18日 33分 https://social.0ko.me/@YDKK/102461166953585129
問題08 7月18日 28分 https://social.0ko.me/@YDKK/102461561626475823
問題09 7月18日 25分 https://social.0ko.me/@YDKK/102461766856934354
問題10 7月18日 24分 https://social.0ko.me/@YDKK/102462490827191781
問題11 7月18日 30分 https://social.0ko.me/@YDKK/102462875989746670
問題12 7月19日 30分 https://social.0ko.me/@YDKK/102463127827432830
問題13 7月19日 25分 https://social.0ko.me/@YDKK/102463371556710799

怒涛の追い上げですね.人間やればなんとかなるものです.

問題8を過ぎたあたりから安定して30分を切るようになり,多少安心感が出てきました.

7月20日 技能試験

social.0ko.me

試験会場はTOC五反田でした.滅茶苦茶広いホールを3, 4セクションぐらいに分けて使ってました.

立教大学で時計が無かった件を学習したので,ちゃんと親から腕時計を借りて臨みました.

social.0ko.me

出題されたのは問題12番でした.面倒くさいのでアウトレットボックスを使わない問題が良いなーと思ってたらドンピシャで来ました.残念.

技能試験は誤りや欠陥が一つでもあったら不合格です.途中退室もできないので,これでもかってぐらいに見直しをしましょう.

試験会場には確かに独特の雰囲気がありますが,事前にちゃんと勉強してれば特に問題なくこなせるはずです.

social.0ko.me

手ごたえはバッチリでしたが,自己採点のしようがないので後はひたすら結果発表まで祈るだけです.こっから結果発表までの1カ月がまた長いんですよね….作品群をどこかに運ぶのは難しいと思うので,当日その場で採点するんでしょうけど,それなら結果発表まで1週間もあれば十分な気がします.

8月19日 結果発表

冒頭のスクショトゥートに戻ります.

ここでようやく合格を確認できました.あとは改めてはがきが届くはずなので,それを使って免状発行の申請をすれば晴れて第二種電気工事士となります.

かかった時間や費用など

自分が試験勉強に費やした時間はトータルで20時間程度でした.筆記試験勉強に7時間,技能試験勉強に13時間といったところです.筆記試験と違って,技能試験の勉強は実際に手を動かして作品を作る必要があり,勉強時間を圧縮*8できないのがつらいところです.

費用に関しては,ざっとこんな感じです.

項目 金額
受験料 9,300円
HOZAN 工具セットなど 12,000円ぐらい
技能試験練習用電線&器具セット 15,500円
友達から借りた参考書 0円
免状申請手数料 5,200円
--- ---
合計 42,000円

ちょっと高い感じもしますが,電気工事を5回ぐらいすれば元が取れるんじゃないですかね.多分.4万円でコンセント弄り放題と思えば安いもんです.

工具

工具については,試験本番でも持ち込みですし,終わった後も手元に残るので良い工具を買うのがおススメです.私はこのHOZANの工具セットを買いました.

特にP-958 VVFストリッパーが滅茶苦茶使いやすいです.のの字曲げもこれ一本で完璧です.

電線&器具

電線と具材に関しては,このセットがおススメです.ちょうど一回分の電線と具材が過不足なく入っています.自分は二週目の練習をする時間がありませんでしたが,もしする場合でも電線をちょっと短めに切断して再利用すれば全然足りると思います.

勉強方法について

筆記試験

筆記試験に関しては,自分は友達から参考書を借りたのと,HOZANのサイトを見ながら勉強しましたが,ぶっちゃけ6割取るだけならHOZANのサイトを見るだけで十分です.とても良くまとまっていますし,解説動画も分かりやすいです.

技能試験

技能試験に関しては,電気技術者試験センターの公式サイトで過去問(候補問題)が全部公開されているので,それを印刷して臨むだけです.複線図の書き方や細かい解説なども全部HOZANのサイトにあります.

おわりに

というわけで,4万円と20時間ぐらいの勉強で無事にコンセント弄り放題の夢が広がる資格を取得することが出来ました.HOZANのサイトのおかげもあって,取得までのハードルは見かけ以上に低いので,興味のある人は是非挑戦してみると良いんじゃないかと思います.

おまけ

social.0ko.me

*1:正確には,まだ手続き中ではあるものの

*2:まだ意識するだけ

*3:手元にスマートウォッチしかなかったため

*4:相変わらずまだ意識するだけ

*5:多分これだとカバーが閉まらないので欠陥

*6:ランプレセクタプルとかほぼすべての問題で出てくるし

*7:途中でストップウォッチが止まってしまってたため不明

*8:筆記試験の場合,6割を超えれば合格なので,合格できる程度に勉強の手を抜くこと

令和CTF 感想とWrite-up

あけまして?おめでとうございます.

令和CTFお疲れさまでした.

CTF初心者なのでバイナリ問題解けません.

f:id:YDKK:20190501021740p:plain

858人中27位でした.

一応Write-upみたいなのを書いておこうと思います.

フラグの例は

submitするだけ.

bREInWack

brainfuckなので適当にそれっぽい記号に置き換えて実行してみる.

f:id:YDKK:20190501022131p:plain

https://ideone.com/AYIxSP

零は?

ncでつなぐと数式を出されるので答えが0になる?を答える.

root@Main-PC:/mnt/c/Users/Admin# nc zerois-o-reiwa.seccon.jp 23615
[1/100]
0=?-85
?=85
[2/100]
0=64*34-?
?=2176
...

タイムアウトまで十分に時間があるのでWolfram Alphaとかに投げれば手動でも解けそう. ただ,どんどん数式が長くなるのでクエリ長が問題になると思う.

自前で数式パーサ実装しようとして無限に時間を溶かしてたけど,普通にライブラリ使えばいいんですね. mXparser というライブラリを使いました.*1

gist.github.com

適当に書いて,例外出たところでコンソールを見るとフラグが出てた.

[99/100]
0=36*95-27+65-26+98*2*95+89-54*92-36+41*55+73-11+50*32-36+38-71*23-35*21+5-91+33*78*55+19-11+43*22-21*48-59+51+7*52-91-85+82*0+44-85*55-91+75*35-15*65+21*29+54-80+68*47-32-69*2+90*72+19-58+20*63-55-92*80+58-93+99*87-11+79*42*1+33-97*45+82-10+71-17*49*41+1-85+75*50-13+45-27*2+?*0-51-35+12-138234
0
[100/100]
0=42+89*64-35*67+59-50*51-39+8*4-34+23*10-45+48-27*69+17-65*16+3-87+58*68-72+56*65*65+70-22+88-96*83-27*98+86-46*43+46-26*79+11-16+11*74+42-62*14*74+30-92+27*54-1+53*93-18-8+28*48-2*15+56-55*81+18+42-37*70-89*48+59+95-86*51-71+40*26+46-99*56*41-16+34+5-96*29-77*95+82+96*71-98*34+95-0*?+30-18+79676
0
Congratulations!
The flag is SECCON{REIWA_is_not_ZERO_IS}.
NaN
nter RETURN key if connection is not disconnected)

元号発表

PDFファイルが落ちてくる. Acrobat持ってるのでマスク外して終わりかと思ったらQRコードが「令和」で白抜きされてる.

f:id:YDKK:20190501023439p:plain

「これ知ってる!strong-qr-decoderとかに投げるやつでしょ!」 とか思いながら頑張ってtxtファイルに起こして投げてみるも全然デコードできない.

モード指示子:   0100 (8ビットバイト)
文字数: 11
デコードされたデータ: ['0x54', '0x68', '0x65', '0x20', '0x66', '0x6c', '0x61', '0x67', '0x20', '0x69', '0x73']
残りのビット列: 0010000000111110011100000101000001000000000000110111110001001000000111000110011101110010011000010110000000000000011010010101100101010000011000010111010001100101011100100110110001100001011100000101111101101111011101100110010101110010011001010111001001000001011111010000111011000001001100000000000000001111000101100101111000000000000111100000000000000000000000000000111010000000010110100000000100001110100000010001
デコード済み文字列: The flag is

モード指示子:   0010 (英数字)
文字数: 7
Traceback (most recent call last):
  File "./sqrd.py", line 1052, in <module>
    data.extend([ord(alphanumeric_table[num])])
IndexError: list index out of range

おっかしいなーと思いながら問題を見直したら結構な人数が解いてるので,もう一度PDFファイルを見直してみる.

f:id:YDKK:20190501023843p:plain

何かあるし

f:id:YDKK:20190501024015p:plain

最前面に持ってきてピッタリ重ねたら普通にQRコードリーダで読める :innocent:

f:id:YDKK:20190501024114p:plain

reiwaVote

パスワード付きzipが落ちてきて,解凍したらめっちゃ.NET製っぽいバイナリが出てくる. f:id:YDKK:20190501024334p:plain 「Web問??」って感じだったけど実行したらブラウザが起動してユーザ登録と投票フォームが出てくる.

どうやら新元号を決めるための投票ページで,令和に決定したらフラグが出てくるっぽい.

普通にユーザを作って令和に投票しても謎の力で安晋の票が伸びて1位になれない.

SQLiteだしDBファイルどっかにあるのかなーとか探したりしたけど特に見当たらず.

ならまぁSQLインジェクションだろうと,基本中の基本の ' or 1=1-- みたいなユーザIDで登録してログインしたら shinzo としてログインできた.
そのまま「令和」に投票して期日を迎えたら無事に令和に決定.

f:id:YDKK:20190501024929p:plain

f:id:YDKK:20190501024943p:plain

予想以上にあっさり解けたけどネタ満載で面白かった.

ただ,これWindowsじゃない人は実行するのに苦労したのでは?
ちなみにdnSpyとかで中覗いてみたけどしっかり難読化してあって全然読めなかった.すごい.

感想

しばらくの間全くCTFに触れてなかったのでリハビリみたいな感じで楽しく解けた.
スコアサーバにアクセスするところから戦いは始まってる感があって,お祭りみたいで楽しかった.

Web問の初期配点が少しだけ高かったら嬉しかったけど,簡単だったし仕方ないね.
というのも,Web問のバイナリを奇跡的に開始直後にダウンロードできて2番目にsubmitできてたので.

バイナリ問題解けるようになりたいけど,何から始めるのが良いんだろう.

*1:ライブラリの使い方が分からずにまたしばらく時間を溶かした

Proコンのジャイロを(自分で)修理する

はじめに

皆さん,Splatoonしてますか?
私はよく遊んでますが,ちょっと前までよく一緒にプレイしてた人がみんなスマブラとかポケカとかに流れてしまって悲しいです.
誰かリグマにでも誘ってください.

さて,そんなSplatoonの操作に重要なのがProコンであり,Proコンによる操作の中でも特に重要なのがジャイロ操作です.

先日,Splatoon 2発売当初から使っていたProコンが故障してしまいました.
症状としては,ジャイロ操作の入力と違う動きをしたり,Proコンを静止していても少しずつ左方向にAIMが動き続けたりする感じです.

1年間の保証期間は過ぎているため,修理するにしても有償修理になってしまいそうです. Proコンの参考修理価格を調べたところ,4000円強+送料程度かかってしまいそうです.
f:id:YDKK:20190408174555p:plain

修理の参考価格 Nintendo Switch|サポート情報|Nintendo

せっかくなので,アナログスティックが粉を吹きまくる件や十字キーが誤入力しまくる件などが改善されているのかどうかも気になった*1ので,新しいProコンに買い換えました.

普通ならばここで話は終わりなのですが,残ったジャイロが壊れたProコンをどうするかという問題があります. スマブラなどのジャイロを使わないゲーム用にしてしまうのも良いのですが,せっかくなので自分で修理してみることにしました.

修理を行う際は,自己責任でお願いします.

Proコンのジャイロセンサ

症状からしてジャイロセンサの故障っぽいので,そいつを交換してやれば治りそうです.

そのために,Proコンで使われているのと同様のジャイロセンサを入手する必要があります. とりあえずProコンを開けてジャイロセンサを確認してみます. Proコンの分解方法はググればいっぱい出てくると思うので,適当に調べてください.結構簡単に開きます.

さて,ジャイロセンサというぐらいなので,恐らくProコンの中心あたりに配置されていそうです. 実際に見てみたところ,チップの大きさや基板の配線パターンからして,赤い丸で囲ったチップが怪しそうです.

f:id:YDKK:20190408181048p:plain

チップの刻印を確認してみると,次のような感じでした.

f:id:YDKK:20190325042401j:plain

うーん,これだけだと何の型番なのかよく分かりません.

そこで,Joy-Conに使われているジャイロセンサについて調べてみることにしました. 同じ製品群なので,使われているジャイロセンサも同一のはずです.

調べたところ,Joy-ConにはLSM6DS3という6軸ジャイロセンサが使われているようです.

There are 2 SPI devices on the bus, one 4Mb MX25U4033E flash memory and one LSM6DS3 6-axis MEMS accelerometer and gyroscope.

GitHub - dekuNukem/Nintendo_Switch_Reverse_Engineering: A look at inner workings of Joycon and Nintendo Switch

Amazonで当該の型番を検索し,出てきた商品画像が次の通りです.

f:id:YDKK:20190325223915p:plain

WINGONEER LSM6DS3モジュール6自由度ブレイクアウトIIC/SPI転送デジタルセンサ振動センサ加速度センサ

チップの刻印からして,どうやらビンゴのようです. 微妙に数字が違うのは,ロット番号や通し番号だったりするのでしょう.

必要な部品が分かったので,Aliexpressで注文します.

f:id:YDKK:20190408183223p:plain

送料込みで200円もしません.ちょっと早い便にしたので注文してから2週間ぐらいで届きました. 今回の用途ではチップ単体で十分なのですが,1個単位で売ってるストアが見つからなかったので変換基板に実装済みのやつにしてます.

ジャイロセンサの交換

さて,いよいよProコンのジャイロセンサを新しいものと交換します.

ジャイロセンサはQFNタイプの表面実装部品なので,流石にはんだごてで交換を行うのは難しそうです.

f:id:YDKK:20190408184717p:plain

そこで,どこの誤家庭にもあるこのようなドライヤ*2を使用します.別名ヒートガンとかヒーティングガンとも言うそうです.

今回は,白光のFV-310を使いました.

表面実装部品のような小さな部品に対して使う場合,次のような細いノズルがあると便利です.

チップに向けて熱風を当て,20~30秒程度熱してからピンセットでチップをつかむと,このようにポロっと外れます.

f:id:YDKK:20190408195059p:plain

同じことをProコンに対しても行うのですが,このとき,Proコンのメインボードをちゃんと取り外してから熱風を当てましょう. 私は面倒くさかったのでそのままやったのですが,はんだが溶ける前に周りのプラスチック部品がすごい勢いで溶けていきます*3

最低でもこんな感じでアルミホイルなどでマスキングしてから行った方が良いです.

f:id:YDKK:20190408210113p:plain

取りつける際は,そのままだと風で飛んで行ってしまうので,位置を合わせたうえで上からピンセットなどで軽く押さえて加熱すると良いです.

部品の交換が終わったら,Proコンを元に戻してSwitchの設定から ジャイロセンサーの補正 を行います.
ジャイロセンサがちゃんと交換できていれば,このように補正できるはずです.

f:id:YDKK:20190408221623p:plain

試しうちをしてみると…

ちゃんとジャイロ操作できます!やったね!

修理後のProコンについて

Proコンは特定無線設備にあたるため,今回のように個人で修理した場合技適から外れ,そのまま無線通信をした場合,電波法違反に問われる可能性があります. そのため,有線通信機能を有効にしたうえで常にSwitch本体と有線接続し,無線通信機能を使わないようにしましょう.

f:id:YDKK:20190408223055p:plain

*1:結果として,相変わらず粉を吹きますが十字キーは改善されてました.

*2:ちなみに,このタイプのドライヤで髪を乾かすのは推奨されないそうです.

*3:当たり前だ