最終更新: 2014-10-17T00:06+0900
以前書いた不満を解消するべく慣れないことをした。
gdipp_loader_32.exeが、引数として与えられたプロセスが終了するまで終了しなくなってる。WaitForSingleObject(pi.hProcess, INFINITE);してるんだから必要なことなんだろうけど残念。
gdipp_loader_32.exeは第一引数(任意の exeファイル名)のディレクトリをカレントにして exeを起動するけど、そのせいで exeに渡される二番目以降の引数が相対パスだったときにファイルを見つけられない。例えば
検索しもってちなみにたどり着いた手順。
>SetEnv.Cmd >dumpbin /all /disasm gidpp_loader_32.exe
出力を読む。コードは .textセクションに含まれている。/disasmオプションを付けたのでニーモニックで読める。さっき覚えておいた 408008で検索すると次の行(だけ)がヒットした。
004010B3: FF 15 08 80 40 00 call dword ptr ds:[00408008h]
呼び出し規約の違いは知らないが、callにそなえて末尾の引数から順番に pushしてるぽいところから推測する。
CreateProcessW(argv[0], lpCmdLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, working_dir, &si, &pi);
004010B2: 52 push edx 00401094: 8D 8D F4 FD FF FF lea ecx,[ebp+FFFFFDF4h] 0040109A: 51 push ecx (これがきっと working_dirに違いない) 0040109B: 6A 00 push 0 (NULL) 0040109D: 6A 04 push 4 (たぶん CREATE_SUSPENDED) 0040109F: 6A 00 push 0 (FALSE) 004010A1: 6A 00 push 0 (NULL) 004010A3: 6A 00 push 0 (NULL)
51(push ecx)を 6A 00(push 0)に書き替えることはサイズが違ってできないので、その前の準備段階を含めた 8D 8D F4 FD FF FF 51(lea ecx,[ebp+FFFFFDF4h]; push ecx)を 90 90 90 90 90 6A 00(NOP;NOP;NOP;NOP;NOP; push 0)に書き替えることにする。
書き替える範囲は 00401094からの7バイトだが Stirlingで開いた gdipp_loader_32.exeにそんなアドレスはない。dumpbinが出力した .textセクションの情報を見る。
68EA virtual size 1000 virtual address (00401000 to 004078E9) 6A00 size of raw data 400 file pointer to raw data (00000400 to 00006DFF)
virtual sizeと size of raw dataの微妙な違いが気になるが、00401094-00401000+00000400 = 494のアドレスを Stirlingで表示すると目当てのバイト列があったので書き替えた。
すごく時間がかかった。『解析魔法少女美咲ちゃん』を参考にしようとしたが、丁度いいところで OllyDbg便利そうということしかわからなかった。済んでしまえばこの程度のことなのでバイナリエディタだけでなんとかしたいが、PEヘッダとインポート情報を読んでアドレスを変換するのが果てしなく面倒で、また、間違えやすい。アドレスもそこから読み取る値も同じバイト列だからか、すぐに区別がつかなくなる。
ちなみに 最初の検索ワードが「disasm」で次が「ディスアセンブラ」それから「逆アセンブラ」「Ordinal Hint」「インポートテーブル」「dumpbin」と変わっていった。並行して、eXeScopeを実行したり bcc55と VCの binディレクトリに dasm.exeみたいな名前(※ildasmからの類推)のファイルを探したりしていた。tdump.exe / dumpbin.exeがそうだとは気付かなかった。
最終更新: 2014-11-06T01:16+0900
GitHubのページ(fizzbuzz.js*)を読んでから、名前付き function expressionの名前 f が外に漏れる IEでは動かないのではないかと思ったのでブコメ(現在は 9 users)を参考にしようと自作のブックマークレットを実行したが反応しない。初めてのことだ。エラーコンソールを開くとこれが出ていた。
時刻: 2014/10/30 21:13:01 警告: CSP WARN: Directive inline script base restriction violated ソースファイル: https://gist.github.com/kazuho/3300555 行: 0 ソースコード: javascript:void function go_hatebukome(url,encode){var prefix="http://b.hatena.ne.jp/entry/",m=url.match(/^http:\/\/([^?#]+)(\?[^#]*)?(#.*)?/);if(m){location.href=prefix+m[1]+encode(m[2]||"");}}(location.href,encodeURIComponent);
CSPというのは Content Security Policyの略のようだ。
Content Security Policy 1.0 (日本語訳) (CSP1.0の仕様。今では CSP1.1もあるみたい)
以下が GitHubから返ってきていた CSPヘッダ(※整形した)。
content-security-policy: default-src *; script-src 'self' https://gist-assets.github.com *.google-analytics.com https://collector-cdn.github.com; frame-src 'self' render.githubusercontent.com https://gist-assets.github.com *.google-analytics.com https://collector-cdn.github.com; style-src 'self' 'unsafe-inline' https://gist-assets.github.com; object-src https://gist-assets.github.com; report-uri /_/csp_reports
まーた Firefoxは自分が User-Agentであることを忘れて仕様に盲従してるのかと思ったのだが(過去に書いた:20121022。外部リンク:「autocomplete=offと人の主体性 - Weblog - Hail2u.net」。仕様を変えるか従うかの選択肢しかないだろうことは理解する)、CSPの script-srcの解説では
'unsafe-inline' が 許容 script ソース集合 の中に含まれていない場合、 UA は:
- インラインスクリプトを実行してはならない( script 要素によるものも, インラインのイベントハンドラによるものも,いずれも)。
- javascript URI に含まれるスクリプトを,実行してはならない。 ( UA は、この制約の施行の下でも, “ブックマークレット” に含まれてるスクリプトについては、実行するべきである。)
というように、ブックマークレットは実行すべきだと明示されている。この直後に書かれている、unsafe-evalが含まれていない場合の制限に引っ掛かるブックマークレットでもない。
'unsafe-eval' が 許容 script ソース集合 の中に含まれていない場合、 UA は:
- eval 演算子, eval 関数のいずれについても、それらの引数を評価せずに,セキュリティ例外を投出しなければならない。 [ECMA-262]
- Function 関数が構築子として呼び出された際は、セキュリティ例外を投出しなければならない。 [ECMA-262]
- setTimeout / setInterval 関数が, callable でない(例えば関数でない)第一引数を伴って呼び出された際には、タイマーを作成せずに,ゼロを返さなければならない。
仕様がどうあれ、ブックマークレットの実行を制限されるいわれはない。ボールはすでにクライアント側に渡っているのだから。
去年の話題「security - How to disable CSP in Firefox for just bookmarklets? - Super User」
そこからリンクされてる3年前の話題「javascript - Does Content Security Policy block bookmarklets? - Stack Overflow」
答えて曰く、グリースモンキーを使え(やなこった)。外部スタイルシートにスクリプトを記述してブックマークレットからロード&実行しろ(面倒だしバッドノウハウ過ぎるし……え?実行も evalもできるの?)。誰にもユーザーがスクリプトを実行するのを阻止することはできない(全く同感!)。CSPを切ることができる、ただし完全に(歴とした証明書を用意できない銀行様みたいな指示を出さないで)。バグとして認識されてはいるみたいよ、こことか、そこを見る限り(23でアップデートを止めたから修正されても関係ないなあ)。
GitHub以外にも広がってきたら CSPを切る。
リンクを追加。
- CSP (Content Security Policy) - Security | MDN (Firefoxでの CSP)
- Content Security Policy 1.0 を Firefox に導入 | Mozilla Developer Street (modest) (仕様が固まった CSP1.0は Firefox23から導入された)
- Content Security Policy · GitHub (GitHubでの CSP。Bookmarkletの問題にも触れてる)
* 現バージョンに固定した URL: https://gist.github.com/kazuho/3300555/3ce4edf79f683b23a7b94678f8c358e997a7f467