読者です 読者をやめる 読者になる 読者になる

まだ6章半ば・・・

DDD本がKindle cloudreaderでよめないので携帯で読まないといけなくてなかなかに読みにくい・・・ Nexus7がお亡くなりになってからデジタル書籍用のタブレット買ってなかったけどやはりないと辛いなぁと。

昔の職場でMDDをやっていた時のことを思い出しながら読んでいた(DDDではなかったが)けど、ファクトリーとかDDDの概念としても正しい使い方をしていたっぽいなぁとか思いなが読んでます。

DDDの本を読み始めた

以前人に勧められてWebで軽く調べるとかしていたけど、先日の電子書籍セールでDDDの本を買ったので読み始めた。

www.shoeisha.co.jp

まだ3章までしか読んでないが、訳本なのでやはりなんとなくぎこちない感があるけどわかりやすくて良い本だと思う。 (色んな方々が推奨しているので今更ではあるが)

8単位符号

必要な箇所だけ見ていっていたらわかりにくかったのでわかりにくかった点をメモ。

図 拡張方法にあるByteコードの記載方法について

ESC 04/2F みたいな記載があるが、ルールとして以下の2点を考慮して見る必要がある

  • 数字は10進で書かれている
  • / は上位4Bitと下位4bitを示したもの
    • 下位は1桁でも0はつかないが上位はなぜか0がつく

という点を考慮すると以下のようになる

ESC 04/2F
  -> ESC 0x42 F

ESC 02/10 02/0F
  -> ESC 0x2A 0x20 F

※先述の通り数字は10進表記であり、Fは数字でなく資料で後述されている終端符号のこと

終端符号とか単語としては冒頭でサラっと出てきて表中では説明なく F とか記載されてて分かりづらかったですが、ここまで分かると 表 符号の指示制御表 符号集合の分類と終端符号 の繋がりが分かりました。

バッファの初期値

単に探すのが大変だったというだけですが、 第一遍 第三部初期状態 の表に記載がありました。

バッファ名 初期値
G0 漢字系集合
G1 英数集合
G2 平仮名集合
G3 マクロ符号集合

でGLとGRの割当は

割当先 バッファ名
GL G0
GR G2

となっているのでGLが漢字系集合、GRが平仮名集合になっているみたいですね。

TSファイルの8単位文字符号がつらい

最近自前の録画サーバーでTSをパースして情報抽出しようかと思ってパーサーをgolangで書いてたんですが、最後の日本語化のところで出てきた8単位文字符号がつらい・・・

http://www.arib.or.jp/english/html/overview/doc/2-STD-B24v5_1-1p3.pdf

ARIBでは文字列をよくある文字コードではなく8単位文字符号というので表しているみたいです。上記資料の2篇7章に記載があるんですが、正直ちょっと面倒な気分に・・・

golangでプロコン

最近家ではgolangばっかりなので試しにプロコンで使ってみた。 (2016/09/05現在AtCoderではGo1.6が使えるっぽい)

参加したのはAGC004 ちゃんと解答できたのはAだけでBは不完全ですが最後の段階でPostしたコードをおいておきました。 そもそもAのコードもブサイクなのはご愛嬌ということで・・・

github.com

AtCoderは解説をあげてくれるのでどこかでちゃんと実装したいですね。

よく考えると当たり前ですが、配列が0で初期化されてるとかlenがそのまま配列長が返ってくるというのに気がつくのに時間がかかったorz 普段は適当に書いているので割とsliceでよしなっていた弊害か・・・

foo := [2]int{}
// foo -> [0, 0]
// len(foo) -> 2

bar := []int{}
// bar -> {}
// len(bar) -> 0

tmctf2016

用事があって帰省していたので解析等の環境もなくほぼ参加できなかったんですが、一問だけぱっと見て出来そうだったので一応Writeup。

設問とコードは以下のgithubにおいてありますのでざっくり概要だけ。

github.com

analysis-offensive 200

自分が見た時には(最初から?)問題分に a simple remote overflow of a global array とあるし、サーバ側のコードも記載してあるので一目瞭然ですね。

フラグの書き出し処理は pwned の上位16bitと下位16bitをチェックしていて条件に合えばフラグが返ってくるというもの。 で、この pwned についてはグローバル変数として int pwnedchar buffer[1024] で連続したスタックに置かれています。

コード中を見るとソケットから buffer に対して1028byteの読み込みが行われているのでこのオーバーフローした4byte文でpwnedを書き換えてチェックが通るようにパケットを送信すれば良いというものです。

pwnedは上下16bitづつ特定の値とXORをとった結果を確認しているので比較している値に同じくXORをとってやれば期待される値がわかりますね。

(0xc0fe ^ 0x7eaf) << 16 + (0x1a1a ^ 0xdae4) -> 0xBE51C0FE

ということでサーバーに対して先ほどの4byteのところに上記のデータを送るようなコードを書いてやればレスポンスとしてフラグが返ってきます。 バイトオーダーはまぁリトルエンディアンかなとおもってやったら通った。

glideでupdateできなくて困った話

logrusを入れた時に依存解消でstrftimeを取りに行ったタイミングで取って来れずに失敗してしまって先に進めなかった。 go getだとうまく行けどなぜだろう。

軽く試した感じだとssh経由でのリポジトリアクセスに失敗しているっぽいので、glide.yamlで直接パッケージを指定してhttp側を参照するようにしたらとりあえず動いた。

- package: bitbucket.org/tebeka/strftime
  vcs: hg
  repo: https://bitbucket.org/tebeka/strftime