kobadbadbadbadbad

モチベ維持

オンラインゲームのパケットを眺める

f:id:kobadlve:20161215015124p:plain

Aizu Advent Calendar 2016 - Qiita 14日目の記事です。

遅れてごめんなさい。。。

前日は @ywkw1717 さん、次は @slme_not_found さんです

会津クソ寒くて死にそうです。ガッキーを見て温まる。

ps4のオンラインゲームを対象にしてパケットを眺めてみました。(名前を出していいのかよくわからないw)

コンシューマゲームのパケットキャプチャ方法と眺めた結果を書きました。

一応パケットの詳細はあまり載せずに自分で見て感じたことという感じです。

気になる人は自分でキャプチャするかコンタクトくださいい。

キャプチャ方法

いろいろ方法はあると思いますが、スイッチを使ってポートミラーリングしてキャプチャしました。

使ったスイッチは NETGERA GS105E-200JPS 4000円くらい

※イメージ

f:id:kobadlve:20161215002027p:plain

Prosafe Plusユーティリティソフトウェア(Windowsのみ)が提供されていて、GUIでも簡単にミラーリングの設定ができます。

この場合だと 02ポートとPS4を繋いで、

03ポートとPCを繋いで以下のように設定するとPS4に流れるパケットがPCにも流れてきます。

f:id:kobadlve:20161215001323p:plain

キャプチャして眺める

3つのシチュエーションで考えました。

  1. マッチ検索
  2. 試合中
  3. 試合終了

1. マッチ検索

マッチ検索時はまず、UDPで自分のユーザ情報をb○ttle.netに送るために確認応答みたいなことをしてるのが見れた。

Client: [0x6a, 0x61, 0x4b, 0x00] -> Server

Server: [0x00, 0x00, 0x00, 0x00] -> Client

Client: [0x6a, 0x61, 0x4b, 0x00] -> Server

Server: [0x00, 0x00, 0x00, 0x00] -> Client

と繰り返したのちにSIP/SDPでセッションを確立してユーザ情報を渡していた。

ps4であればアカウントは作成しなくても良いはずなので、ps4ユーザは自動的に作られているのかな

次に、Blizz○rdのサーバとTCP通信が行われます。

TLS1.2で証明書はDigiCertのものを使われているのがわかった。

TCP通信では、マッチで使うサーバとかを決めてるとか?

その後、(上で決めたサーバと)UDP通信が始まり、まず自分のユーザ情報を送り、マッチに参加するユーザ名が返ってきて、参加者が共有されてるのが見えた。

そしてマッチ開始。

2. 試合中

Amazon EC2と通信していて、

ゲーム情報は全部UDP通信で進む。

RTPも流れていて、これはボイスチャットか何か?

2つのBliz○rdサーバにそれぞれUDPTCP通信を定期的にしていて、

UDPでは同じやり取りを定期的に繰り返していて、何か(回線抜きとか)の確認とか?

3. 試合終了

TCP, TLS1.2 (DigiCert)

試合中とは別のAmazon EC2サーバ(スコアサーバ?)と通信して結果を受け取ってる。

このとき同時にマッチメイキングもしていて、次のマッチにスムーズに進むようにしていた。

終わり

本当に眺めただけですが、いろんな想像(どんな通信をして何を送ってるのか)ができて楽しい。

いずれはプラグイン書いたり、詳しく解析できるようになりたい。。。

スイッチも案外安いので、コンシューマのパケット取りたい人はかってみてはいかがでしょう。

にしても、Over Watchは神ゲーでクリスマスイベントもきたし、楽しみましょう!w

参考

欅坂のブログから画像スクレイピング Golang

動機

癒しが欲しかったんや!(Golang使って見たかった)

仕様

goqueryを使ってスクレイピング

メンバーの名前を指定して、そのメンバーの最新の画像を取って来て癒される

go run main.go berisa

コード -> GitHub - kobad/keyakiGo

コマンドライン引数となるメンバーを設定しとく

べりさのページURLが

http://www.keyakizaka46.com/mob/news/diarKiji.php?site=k46o&ima=0000&cd=member&ct=21

で、最後のct=21がメンバーを表してるのでそれを設定

var memberList = map[string]string{
    "ishimori":  "01",
    "zu-min":    "02",
    "uemu-":     "03",
    "ozeki":     "04",
    "odanana":   "05",
    "koike":     "06",
    "kobayashi": "07",
    "fu-chan":   "08",
    "si-chan":   "09",
    "mona":      "10",
    "yukka":     "11",
    "kuritarou": "12",
    "na-ko":     "13",
    "habu":      "14",
    "aoi":       "15",
    "techi":     "17",
    "moriya":    "18",
    "yonesan":   "19",
    "berika":    "20",
    "berisa":    "21",
    "neru":      "22"}

引数を取得してURL生成

flag パッケージを使う

flag.String() -> フラグを定義

flag.Parse() -> 引数解析してフラグにセット

flag.Args() -> 全取得

flag.Arg(0) -> 1つ目取得

memberList から該当する番号を取って来てURLにセットする

画像取得

goquery.NewDocument(targetURL) で指定したサイトを解析してくれる

article以下の -> img 内の srcからURLを取得

 doc.Find("article").Each(func(i int, s *goquery.Selection) {
        s.Children().Find("img").Each(func(_ int, arg1 *goquery.Selection) {
            url, _ := arg1.Attr("src")
            imgURL := baseURL + url
            fmt.Println("Get: " + imgURL)
            saveIMG(imgURL, i)
        })
    })

楽。

画像保存

  1. ディレクトリ作成

os.Mkdir(dirName, permission) で作る

 if err := os.Mkdir(targetName+t.Format(layout), 0777); err != nil {
        fmt.Println(err)
    }
  1. 画像保存

os.Create(name) でファイルを作って、io.Copy(file, target) でtargetをfileにコピーして保存する

func saveIMG(url string, i int) {
    response, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer response.Body.Close()

    file, err := os.Create(fmt.Sprintf(targetName+t.Format(layout)+"/%s%d.jpg", targetName, i))
    if err != nil {
        panic(err)
    }
    defer file.Close()
    io.Copy(file, response.Body)
}

保存に結構時間がかかる。仕方ないのかなー

結論

べりさ可愛い。

f:id:kobadlve:20161103212815j:plain

参考

goでスクレイピングするのにgoquery + bluemonday が最強な件 - Qiita

golang で URLの画像データを取得して、ローカルのファイルに保存する術 - kitak.blog

PEファイル

PE(Portable Executable) File

Structure

構造例

f:id:kobadlve:20161102142319p:plain

ヘッダには多くの情報が格納されているがその中でも重要なものを説明

PE Header

f:id:kobadlve:20161102142332p:plain

詳しくはMicroSoftの資料参考

  1. MZ スタブ
  2. MS-DOS上で実行可能なプログラム形式
  3. シグネチャの先頭オフセット(0x3C)が格納
  4. シグネチャは 'PE(0x50 0x45)'
  5. COFF ファイルヘッダ
  6. 構造
  typedef struct _IMAGE_FILE_HEADER {
    WORD Machine;
    WORD NumberOfSections;
    DWORD TimeDateStamp;
    DWORD PointerToSymbolTable;
    DWORD NumberOfSymbols;
    WORD SizeOfOptionalHeader;
    WORD Characteristics
  } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
  • 実行環境とかを表す(Machine = 0x14C -> Intel386以降)
  • オプションヘッダ
  • プログラムが実行される上での基本的な情報を記す
  • SizeOfCode -> プラグラムコードのあるセクションのサイズ
  • AddressOfEntryPoint -> 最初に実行されるプログラムコードのイメージ相対アドレス(RVA)
  • BaseOfCode -> プログラムコードを格納するセクションの先頭のイメージ相対アドレス
  • ImageBase -> 実行ファイルがメモリに書き込まれた時の正しい先頭アドレスで、EXEなら0x400000, DLLなら0x10000000
  • など
  • セクションテーブル
  • プログラムコード、データ、リソースなどを格納する各セクションの構造を示す情報が並ぶ
  • 代表セクション
    • .text -> プログラムコード
    • .edata -> 関数などのエクスポートデータ
    • .idata -> 関数などのインポートデータ
    • .data -> 初期化されたデータ
    • .bss -> 初期化されてないデータ
    • .rsrc -> リソース

IAT (Import Address Table)

プログラムで使用するAPI関数のプログラムコード開始位置のアドレスを格納したテーブル

DLL (Dynamic Link Library)

プログラムに動的にリンクするライブラリ

単体では動かない

実行ファイル内にあらかじめどのDLLがどの関数を使うかの情報を格納しておくことがおおい。実行途中に指定することも可能。LoadLibrary関数を使う

OSからアプリケーションへAPI関数を提供するインターフェイスとも言える

資料

CODE BLUE 2016, AVTokyoに参加してきた

課題やらが落ち着いた(来週から中間テスト。。。) けど風邪をひいた、、、

CODE BLUEに学生スタッフとして参加し、AVTokyoにも参加してきました。

f:id:kobadlve:20161028120022j:plain

目次

  • CODE BLUE 2016
  • AVTokyo
  • まとめ

CODE BLUE

世界トップクラスのセキュリティ専門家による日本発の情報セキュリティ国際会議

日程: 10/19 - 10/21 (19は前日準備)

去年に引き続き2年連続で学生スタッフとして参加させていただきました。

今年は、ホテルも用意していただいてとても助かりました。去年はカプセルホテルに泊まってつらかったw

仕事内容としては会議前日に会場の設営をして1日目は自由に講演を聞くことができ、2日目は参加者の誘導、発表のタイムキーパーをしていました。

すべて平日だったので、公欠申請したものの某〇〇課は受理してくませんでした~ この辺の制度をどうにかしてほしい、、

10/19 前日準備

スタッフと企業の方とで交流会があり、そこで全体に自己紹介をして今年もツヨイ人ばかりで前日から刺激を受けた。。。

去年もスタッフをしていた人とも再会できた。覚えてもらえてたようでよかった。

この後、設営の手伝いをして終わりという感じ。

夜は「ねぎし」で食べた。会津にもできてほしい

10/20 1日目

1日目は基本自由で講演を聞くことができた。

エストニアのデジタル社会の話があり、日本の遅れ具合を感じたのと日本での実現は難しそうって誰かが言ってた。ごもっとも

CGC(Cyber Grand Challenge)の話、機械学習でwebの脆弱性発見の話があり自動化が進んできていた。

Binary Ninja を使ってみるのと、おすすめしていた静的解析の資料にも目を通そう。 http://cs.au.dk/~amoeller/spa/spa.pdf

10/21 2日目

2日目は業務、ネットワーキングパーティ、打ち上げという流れでした。

業務は参加者の誘導と発表のタイムキーパーをしました。

去年の知見から臨機応変に動けたはず。声が小さいのは仕様。。。(ごめんなさい)

お昼休憩には、初音ミクと写真とった

ネットワーキングパーティでは、さまざまな企業、職種の人と話して情報セキュリティの中でも知らない世界があって、自分の視野が広がってとても良かった。 やってみたいことが増えた。

打ち上げでは、プライベートな話が多かったw

今後どうしていこうか(バイトとか、研究とか)悩んでいるのでいろんな意見をもらい助かりました。

AVTokyo

AVTOKYOは、コンピューターセキュリティに関する発表と、気軽に情報交換をする、コンピューターセキュリティのカンファレンスイベントです。ひとときの楽しい時間をドリンクとHACKで過ごしてみませんか? Welcome to AVTOKYO, and join our party!
no drink, no hack.

AVTokyoは真ん中で講演があり、周りでCTFなどのほかのイベントがあって各自自由に飲みながら楽しむ感じでした。

気楽に楽しめたのでよかった!

モジラ銀行最高でしたw

まとめ

基本、会津組で固まってしまい他のスタッフとのコミュニケーションがあまりとれなかったのでもったいなかった。

コミュ力と英語力はいつになったらつくんだという感じで、気軽に話しかけられるようになりたい、、、

やりたいことが増えたけど、なにをやりたいか曖昧だったのでそこがある程度明確になってよかった。 その分、無駄なところを削っていきたい。

モチベーションも上がり、いろんな繋がりができてなにより楽しかった。

来年は行けるかなー

ありがとうございました!

待ち行列1

待ち行列(Queuing Theory)

モチベ

輪講でやってるので、理解のためにもまとめておきましょ

LaTeX面倒すぎてLaTeXでしかかけなそうな所だけ使った。。。

待ち行列とは

待ち行列理論(まちぎょうれつりろん 英語: Queueing Theory)とは、顧客がサービスを受けるために行列に並ぶような確率的に挙動するシステムの混雑現象を数理モデルを用いて解析することを目的とした理論である。応用数学のオペレーションズ・リサーチにおける分野の一つに数えられる。 Wikipedia より

例: ) 病院、電話網、サーバやルータにおけるバッファ設計。

待ち行列のタイプ(モデル)

  1. 即時式
  2. 対応を即時に行う。(待ちができない) ex) 電話対応
  3. 機会損失(利益を出すチャンス)の大きさを推定して、いかにすくなくするか
  4. 待時式
  5. 利用者は待ってくれる。(待ちができる) ex) 病院の待ち列
  6. 待たせるコストと待たせなくするためにかかるコストのバランスを考える。


  1. 損失系
  2. 即時式では機会損失が起こるので、損失系のモデルになる。
  3. 非損失系

モデル作成において考えること

  • 待ち行列の要素
    • 客(人、モノ、情報、、、)
      • 母集団の大きさを見る(無限か有限か)
    • 到着の仕方
      • 定間隔 -> 対策しやすい
      • ランダム -> 到着状況はポアソン分布。到着間隔は指数分布。電話の呼び出しの場合はアーラン分布に従う。
      • 平均到着率 = λ
    • 窓口
      • 数 -> 待たせるコストと数を増やすコストを考えてベストな数を決める。
      • 質 -> すべての窓口が同じ質のサービスをするのか、そうでないのか
    • 時間
      • 客ごとの所要時間。このバラツキは指数分布かアーラン分布に従う。
      • 待ち行列では、平均サービス時間 μ (単位時間に何人にサービスするか)を利用する。
      • 1/μ = 平均サービス時間
    • 大きさ(待合室の大きさ)
    • 満員になって次に来た客が帰ってしまう -> 機会損失
    • 機会損失の大きさを評価する(損失系の場合)

ケンドール記号

モデル = 到着/サービス/窓口数(系の大きさ) とあらわす。

  • 到着、サービス
    • M -> ポアソンor指数分布
    • D -> 一定分布
    • Ek -> アーラン分布
    • G -> 一般分布
  • 窓口数
    • 数字
  • 系の大きさ
    • 待ち行列に並んでいる客とサービス中の客の合計
    • 無限大なら省略

何を求めるのか

保持してるデータ

λ: 平均到着率
μ: 平均サービス時間
ρ: 窓口利用率(ρ = λ/μ)

求める解

Pq: 待たされる確率
L: 系内にいる平均客数
Lq: 待ち行列の平均の長さ
Wq: 平均待ち時間

※ P -> Probability,q = Queue, L = Length, W = Wait

基本モデル

M/M/1 Model

ポアソン/指数/窓口1つ

Pq = ρ
L = ρ/1-ρ
Lq = ρ^2/1-ρ
Wq = ρ/μ(1-ρ)

M/M/1(N) Model

ポアソン/指数/窓口1つでN人しか入れない

Pq = 1 - P_0
L = (ρ-(N+1)ρ^(N+1) + Nρ^(N+2) / (1-ρ)^2 ) * P_0
Lq = (ρ^2 - Nρ^(N+1) + (N-1)ρ^(N+2) / (1-ρ)^2 ) * P_0

M/M/S

M/M/1の窓口が複数になった場合。窓口数 = S

{ \displaystyle
b_n = \sum_{m=0}^{N-1} a_m
}

{ \displaystyle
\rho = \frac{\lambda}{S\mu}
}

 { \displaystyle
P_0 = \frac{1}{\sum_{n=0}^{S-1} \frac{1}{n!}\frac{\lambda ^ n}{\mu ^ n} + \frac{1}{S!}\frac{\lambda ^ S}{\mu ^ S}\frac{S\mu}{S\mu-\lambda}}
}

 { \displaystyle
P_q = \frac{\frac{\lambda ^ S}{\mu ^ S}P_0}{S!(1-\frac{\lambda}{\mu S})}
}

 { \displaystyle
L_q = \frac{\lambda \mu \frac{\lambda ^ S}{\mu ^ S}}{(S-1)!(S \mu - \lambda) ^ 2}P_0
}

 { \displaystyle
L = L_q + \frac{\lambda}{\mu}
}

 { \displaystyle
Wq = \frac{\mu \frac{\lambda ^ S}{\mu ^ S}}{(S-1)!(S \mu - \lambda) ^ 2}P_0
}

  • 変動係数 -> どんな分布でも共通に使える
  • 変動係数 = 標準偏差/平均値

ヒラポン・ポラチェックの公式

λ: 平均到着率
μ: 平均サービス時間
ρ: 窓口利用率(ρ = λ/μ)
Pq: 待たされる確率
L: 系内にいる平均客数
Lq: 待ち行列の平均の長さ
Wq: 平均待ち時間
C: サービス時間の変動係数
ρ: 窓口利用率(λ/μ)
T_s: 平均サービス時間(1/μ)
W_q: 平均待ち時間

のとき

W_q = (ρ/2(1-ρ)) * T_s(1_C^2)

平均値の法則の拡大

Pq = ρ
W: 系内にいる平均時間
L = λW

M/G/1 Model

W_q = (ρ/2(1-ρ)) * 1/μ(1_C^2)
Lq = λW_q
L = λ(W_q+1/μ)

M/D/1 Model

W_q = ρ/2μ(1-ρ)
Lq = λW_q
L = λ(W_q+1/μ)

M/Ek/1 Model

Ek: 位相kのアーラン分布のこと
k = 1: 指数分布
k = ∞: 一定分布
平均: 1/μ
分散: 1/(kμ^2)
C^2 = 1/k

W_q = ρ/2(1-ρ) 1/μ (1+1/k)
Lq = λW_q
L = λ(W_q+1/μ).

即時式モデル


応用例

自動券売機の行列と銀行の行列の比較

自動券売機

  • 1台ごとに行列ができる
  • 前にいる人のサービス時間に左右される。列によって速さが違う。

銀行

  • 行列は1列だけで、空いた窓口に順に入れていく。
  • 前にいる人に左右されるが、それは全員同じく影響される。

モデル作成

どちらも窓口4つで単位時間を10分と仮定。 待たされる確率(Pq)で評価、比較する。

自動券売機

窓口ごとに行列ができるので各窓口間に関連性はないため、 M/M/1モデルが4つ並んでいると見れる。

Pq = ρ
L = ρ/1-ρ
Lq = ρ^2/1-ρ
Wq = ρ/μ(1-ρ)

より

平均到着率(λ) = 8(人/10分)
平均サービス率(μ) = 10(人/10分)
窓口利用率(ρ) = λ/μ = 0.8
-> 待たされる確立(Pq) = ρ = 0.8

銀行

M/M/4モデル。

窓口数(S) = 4
平均到着率(λ) = 8*4 = 32(人/10分)
平均サービス率(μ) = 10(人/10分)
窓口利用率(ρ) = λ/μ = 0.8
P_0 =
P_q =  

より

P_0 = 75/2747
P_q = 0.6

窓口1~4を計算すると以下のようになる。

窓口数 到着率 サービス率 待たされる確率
1 8 10 0.8
2 16 10 0.71
3 24 10 0.65
4 32 10 0.6

結果

自動券売機 -> 0.8 銀行 -> 0.6

となり、銀行の待ち行列の作り方のほうが25%効率が良いことがわかる。

ほかにも公衆電話の予備機の問題(予備品在庫の問題)にも適用される

Dos攻撃種類

Dos Attack (Denial of Service)

SYN Flooding

TCP/IPスタックを消費させる。

TCP/IPスタック -> コネクションを維持するためにコネクション情報と状態を保存している

< How to Attack >

存在しないIPアドレスを設定したSYNパケットを送信。 受信側はこのIPに対して、SYN/ACKパケットを応答し、ACKの応答を待つ。この応答待ちコネクションはバックログキューに保存され、タイムアウトするまで保持する。 いろんなIPで送り続けることでバックログキューが一杯になり、新しいパケットがきた時に正しく処理できない。

< Provision >

SYN Cookiesを用いる

ACK応答が帰ってくるまでコネクションを生成しない。

Ping of Death

現在では対策済。

ICMPエコー要求パケットのデータ部分は最大2^16 -> 65,536バイト ヘッダこそ重要なので、データ部分の仕様が甘い。 データ部分に巨大なデータを乗せた要求を受け取るとクラッシュするOSがあったりする。 巨大なデータを保持したICMPエコー要求パケットをPing of Deathという。 libnetを使用することで攻撃コードを簡単にかける。

BluetoothでもL2CAP層で似たpingパケットを使用していて同様の攻撃(Bluesmack)が可能になっている。

Teardrop

クラッシュ型

現在は対策済。

IPパケットのフラグメント再構成時にあった脆弱性を攻撃。

通常、パケットがフラグメントに分割されると受信側ではヘッダ内に格納されたオフセットに従って組み立て直し元のパケットを復元する。 この攻撃では、データが重なり合うようなオフセットを保持したパケットのフラグメントを送信することで、異例ケースのチェックをしていない実装をクラッシュさせる。

Ping Flooding

もっとも単純なFlooding攻撃

大量のでかいpingパケットを送信して、対象のネットワークコネクション帯域幅を使い切る(攻撃者側もリソースが必要)。

Amplification Attack

攻撃者が帯域幅を用意せずに、Ping Floodingを引きおこす。 スプーフィングとブロードキャストを使用して、1つのパケットを数百倍に増幅する。

増幅用のネットワークを用意。(ブロードキャストアドレスへのパケット送信を許し、多くの機器が接続されているもの)

送信元IPを攻撃対象のIPに書き換えた巨大なICMPエコー要求を作成し、増幅用ネットワークのブロードキャスト宛に送信。

これは、ICMPパケットやUDPパケットを使っても実行できる。(Smurf Attack, Fraggle Attack)

分散Dos(DDos)攻撃

Dos攻撃を複数のホストから同時に行う。

あらかじめ複数のホストに侵入しデーモンをインストール。デーモンをインストールされたシステムをボットといい、ボットネットを構成する。

攻撃者が合図(何らかの制御プログラム)を送り、一斉にDDosを仕掛ける。

GitHub.io と HTML5 UP! で簡易プロフィールページ作った

こんな感じになった。

2、30分あれば作れるので、わざわざ作るの面倒な人とかよく分からない人にオススーメ

Create New Repository

Repository Name を username.github.ioにして作る そうすれば勝手に設定してくれる

f:id:kobadlve:20160831003450p:plain

ドメインの設定とかもできるがまだしてないので後で

ここにファイルを入れていく〜

HTML5 UP!

HTML5 UP!

ここで洒落乙なフリーのhtmlテンプレートをダウンロードできる。 現在30種類以上のテンプレートがある

好きなテーマをDLして先ほどのgithub.ioのリポジトリに、

  • asset
  • images
  • index.html

を入れる。 このままだとテンプレートのままなので、 index.htmlをタイトルとか好きなように編集して終わり。