Romantic Irony

好きなこと・気になったことについて書いていきます!

Bluelog README 和訳

気が向いたのでBluelogという近くにあるBluetoothバイスを検知するツールのREADMEを和訳してみた。英語の勉強という面もあるので、訳が間違ってたり表現がよくないところは優しく指摘していただければとても喜びます。

原文 GitHub - MS3FGX/Bluelog: A highly configurable Linux Bluetooth scanner with optional web interface.

Bluelog

Bluelogはwebサイトでの調査やトラフィック監視用に設計され、システムのデーモンかwebフロントエンドを選択して実行させることができるLinuxBluetoothスキャナーである。それは長期間、特定の静的な場所でその範囲にあるできるだけたくさんのBluetoothバイスを発見できることも目標としている。

Bluelogは放置されるように設計されているので、ユーザーインターフェースを持っていないし、一度スタートさせると何の操作も必要はない。その特色としては完全にログファイルのフォーマットが設定可能であり、同様にsyslogへネットワークを超えた中央集積型のログの機能がある。

Bluelogは貧弱で小型であるx86MIPS、ARMプロセッサで動作するよう設計された。BluelogはKali linux(www.kali.org)やPwnie Express(www.pwnieexpress.com)が提供しているPwn Pad やPwn Plugペネトレーションテストバイスに含まれている。また公式のOpenWRTレポジトリーやArch Linux AUR コミュニティーレポジトリからも入手可能である。

Bluelog Live

Bluelog Liveは定期的に発見されたデバイスの更新を提供し、それらの該当する情報は任意のwebブラウザから見ることができる。Liveモードは主に公開情報や、悪名高い”Wall of Sheep”からインスピレーションを受け設計された。(www.wallofsheep.com)

高度なLiveモードはメインのBluelogツールから分割されたソフトウェアであある。それはシンプルな静的なHTMLページやCGIモジュールから構成されBluelogからのログファイルを読み込む。

Bluelogはwebサーバではなく、ただ単にあなたが選択したHTTPデーモン(Apachelighttpd、etc)が提供するHTMLファイルを生成する。したがって、Bluelog Liveをスタートさせてみる前にwebサーバはすでに適切に設定されているか確認がいる。Bluelogは実は起動中Liveページの状態に全く気づかない。それはまさに吐き出すデータがベストな状態であることを望んでいる。

Basic Option

-i
このオプションはBluelogにあなたがスキャンしたいBluetoothバイスを伝える。あなたはHCIデバイス名(hci2のような)かローカルアダプタのMACアドレスを使うことができる。ボーナスとして、もしあなたが存在しないデバイスを与えるなら、Bluelogは稼働しているデバイスを自動検知し戻ってくるだろう。
-o
これはログを書き込むファイルを任意のファイル名にできる。デフォルトのフォーマットは”bluelog-YYYY-MM-DD-HHMM.log”で、カレントディレクトリに作られる。 -v
このオプションを付加すると見つかったデバイスをコンソールに表示する。出力にはくどくどとデバイスクラスの情報やタイムスタンプの記録が含まれている。デフォルトではこのオプションはOFFになっている。
-q
これは重要ではない出力をOFFにする。これが意味するのは、通常ではスキャンの実行開始時間と適切なシャットダウンがされたかのメッセージしか見ることができない。
-d
このオプションはBluelogをバックグラウンドで動作するデーモンとして起動する。まだ定型文やスタートアップメッセージを見ることになるだろう、しかしその後はターミナル内でBluelogから情報は少しも見かけないだろう。
-k
Bluelogプロセスがデーモンモードで実行されているときに、-kオプションはそのプロセスを停止することができる。

Logging Option

-n
このオプションを使うと発見されたデバイスのデバイス名が表示される。デバイス名を見つけることに時間がかかりすぎ時折失敗することがある。したがってデバイス名を解決しないことにより、Bluelogは高速にそして正確にスキャンできる。デフォルトではOFFになっている。
-m
このオプションを利用可能ならMAC OUIを通して稼働しているハードウェアメーカーを特定する。ハードウェアメーカーはBluelog Liveと同様に標準のログファイルに記録されているだろう。この機能を利用するにはいくつかのプラットフォーム(OpenWRTのような)メーカーの法外に大きなデータベースをインストールする必要がある。
-c
このオプションを指定すると生のデバイスクラスをログファイルに書き込むようになる。このオプションをOFFにするには -f を使う。デフォルトではOFFになっている。
-f
このオプションはデバイスクラスを翻訳し多くの人が読みやすい形式にする。それはデバイスのクラスとコア容量を教えてくれるだろう。例えば、クラス”0x7a020c”は”Smart Phone, (Net Capture Obex Audio Phone)”として見える。このオプションをOFFにするには -c を使う。デフォルトではOFFになっている。
-t
このオプションを使うとスキャン開始時間と終了時間、また新しいデバイスが発見された時間がログファイルに記録されるようになる。デフォルトでは OFFになっている。
-x
このオプションを使うとMACアドレスをうやむやにすることができる。このオプションをONにすると、Bluelogは発見されたそれぞれのメーカー部分のMACアドレスを表示するが、デバイスを固有の情報はブロックする。デフォルトではOFFになっている。
-e
このオプションを使うとMACアドレスをCRC32形式へエンコーディングする。このオプションをONにすると、発見されたこれまでディスクに記録されていないMACアドレスはこの形式で記録される。 -a
このオプションは”amnesia mode”を可能にすると与えられた時間が経つとBluelogは一度発見した特定のデバイスを忘れてしまう。このオプションによってBluelogはデバイスと出会ったとき、初めて出会ったものとして再びログに記録し、発見された時間も更新されるだろう。

Output Options

-l
このオプションはBluelogを中継してLiveモードも変更する。コンソールやログファイルよりも自動的に更新されるwebページの結果を表示する。
-b
このオプションは結果のデータがronin’s Bluetoothプロファイリングプロジェクト(BlueProPro)へのアップロードにふさわしいログの形式に設定する。これは他の多くのログオプションを上書きし、Bluelog LiveはOFFになる。このプロジェクトのさらなる情報と、さらなるヒントはあなたのデータを提出してもらう必要がある。www.hackfromacave.com
-s
このオプションを使うとsyslogのみに出力するモードになる。このモードではBluelogは通常のログファイルには記録しない代わりにシステムログファイル(/var/log/syslog)だけに記録される。このモードはネットワークで接続されたsyslogデーモンに気づかない時に特に便利であり、複数のBluelogにより記録されたログを一箇所に集約する際にも使うことができる。

Acknowledgemets

Bluelogの開発当初はAlbert Huangによって執筆された”Bluetooth Essentials for Programmers”という本に含まれているサンプルコードをもとに製作されていました。この本はとても有益な本であり、もしあなたがBlueZプログラミングの入門書を探しているのならとても役立つだろう。それはBlueZプロジェクトのひどいドキュメントを ほとんど補完してくれるだろう。

この本に関するwebサイト:http://www.btessentials.com/

Bluelogのデバイスクラスを解析するコードはMichael John Wensleyによって執筆されGPLv2によって保障されている”Inquisition”を実装している。

“Inquisition"に関するさらなる情報を読みたいのなら彼のサイトへ:http://www.wensley.org.uk/

BluelogはSven Reifegersteによってかかれた”CRC Tester”のCRCハッシュ関数の修正バージョンを実装している。

CRCエンコーディングに関するSvenのページ:http://www.zorc.breitbandkatze.de/crc.html

.roninによる”SpoofTooph”はリテラルコードではないデバイスキャッシュの書き換えという素晴らしい発想をくれた。”SpoofTooph”と.roninの他のプロジェクトは彼のサイトからチェックすることができる:http://www.hackfromacave.com/

BluelogのUDP関数はlan Macdonaldが提出したコードをもとにされている。(ianmac51@googlemail.com)

BluelogもまたMartin Schlzeによってかかれたpidfile.cに含まれる関数にインスパイアされたコードをいくつか使用している。

Bluelog Liveのロゴに使用されているフォントはJakob Fischerによる”Electric Boots”である。彼のフォントコレクションはここでみることができる:http://www.pizzadude.dk/

BluelogのOpenWRTバージョンはGary Bonnerの仕事ぶりやJoshua HurstとDean Nielsonの陰の支えがなければ可能ではなかっただろう。Stephen Walkerもありがとう。彼女はBluelogのためにプラットフォームの貴重な情報である公式のOpenWRTパッケージを保守し続けてくれた

BluelogのためにArch Linuxの組み込みスクリプトを保守してくれてありがとう、Jonas ”onny” Heinrich。彼のプロジェクト:http://www.project-insanity.org/

BluelogようにカスマイズされたPwn Plug上での支援や助力には大変感謝します、Dave Porcello、Jonathan Cran、Punie Express team。

イタリアのボルザノでネットワークトラフィックモニタリングの構造を開発している間にBluelogへパッチを当ててくれた、Paolo ValleriやIntegreenプロジェクトありがとう。プロジェクトサイト:http://www.integreen-life.bz.it/

DEFCON Privacy VillageのテーマにBluelog Liveを組み入れてくれたTeresa Brooksありがとう。

Bluelogについてのコメントや提案をしてくださり正しい方向へと私を進めてくださったすべてのユーザに感謝します。

最後に、調整の目的で私にBluetoothバイスを寄付してくださった方々に感謝いたします。スキャンするデバイスがなしでBluetoothスキャナーをかくことはかなり難しい、そのためハードウェアは私にとって大変貴重である。

License

このプログラムはフリーソフトウェア;あなたはフリーソフトウェア団体によって公開されているGNU GPLv2のライセンスによりこれを再配布または修正して再配布ができる。
このプログラムは便利になるよう望まれて配布されている。しかしなにも保証はない。;暗にほのめかされる市場的な保証や特定の適性な目的のようなものもない。
詳細はソースディレクトリに含まれている”COPYING”ファイルを見て。

C言語の参照外しとダブルポインタ

ふと、「参照外し」の語源というか由来というかそんなものは何かあるのかな〜と思いググってたところ別のある問題に出くわした。 これってみんなパッと答えられるのかなと思い書いてみた。 そのソースコードが以下である。

gistd9a5cbadb0c86a3adb99cb94b95302a5

問題はこれの出力を答えろというもの。

char型の配列とポインタ変数が宣言してある。 そして、ポインタ変数に配列のアドレスが代入され、出力してある。 という簡単なC言語のプログラムである。 慣れてる人ならこんな問題は瞬殺なんだろうけど、自分は少し考えてしまった... ということで、整理も兼ねて解答を書いていく。

解答

まず1つ目の出力から。
char mark_1[][5] = {"zyx", "wv", "utsr", "qpo", "nmlk"};
まずこれは普通にchar型の二次元配列を宣言して初期化しているだけ。
printf("%s¥n", mark_1[1] + 1);
出力ではフォーマットパラメータに%sが指定されている。(文字列を出力) その出力の値としてmark_1[1] + 1が指定されている。
これはまずmark_1[1]で配列の要素"wv"のアドレスを指定し、そのあと"wv"要素の中の先頭から+1個進んだ先の文字列"v"が出力される。

2つ目の出力
printf("%s¥n", pt_1 + 1);
これも1つ目と同様の考え方で理解できる。ただ、今度はmark_1を直接使っているのではなくpt_1にmark_1のアドレスを代入してそれを利用している。この場合pt_1ではすでに*mark_1が代入されているので、配列mark_1の先頭要素であることが確定している。(1つ目と表記をあわせるならpt_1=*mark_1=mark_1[0])そして要素内で+1してあるので、結果出力は"yx"になる。

3つ目
ここはもう1つの配列
char *mark_2[5] = {"cba", "ed", "ihgf", "lkj", "ponm"};
を使っている。そして
pt_2 = mark_2;
で配列mark_2の先頭アドレスをpt_2に代入。
printf("%s¥n", *pt_2 + 2);
ここでは*pt_2で先頭の要素"cba"を指しており、+2で先頭から2つ進んだ先の"a"を出力している。

4つ目
printf("%c¥n", **pt_2 + 2);
ここがちょっと特殊である。といっても難しくはない。フォーマットパラメータは%cとなっている。(1文字を出力)そしてその値として**pt_2+2となっている。この考え方としては、参照外しの演算子「*」と四則演算子では参照外しの演算子が優先されるということと、値として特定の文字が確定したあとに四則演算を用いるとASCIIコードの計算とされることだ。具体的に言うと、まず**pt_2で配列mark_2の先頭要素の先頭文字"c"が確定する。この時点で+2はポインタ演算ではなくなりASCIIコードでの+2となる。そのため"c"の2つ先のアルファベット"e"が出力されることになる。間違っても配列の要素の"ed"の"e"が出力されたわけではない!

5つ目
printf("%s¥n", *(pt_2 + 2) + 2);
pt_2+2してから参照外しをしているので配列要素の"ihgf"を指しており、その後さらに+2しているので"gf"が出力される。

これで終わり。

まとめ

参照外しや[]の優先度はあまり気にしたことがなかったので以下のサイトで確認してみた。

C Operator Precedence - cppreference.com

すると、やはり優先度はa[ ] > *a となっている。そして四則演算子よりも参照外しの方が優先度が高いことがわかる。
言われてみれば当たり前な話だけど、演算子の優先度に気をつけよう。そしてなにより基本は大事!

バイナリ解析環境構築メモ

Virtual Boxを使用し、仮想環境でUbuntuを起動できる状態を前提とします。

構築環境

  • Ubuntu 16.04 LTS
  • Virtual Box VM version 5.0.22

入れていくもの

  • Linuxコマンド
    • file
    • readelf
    • strings
    • grep
    • unzip/tar/gzip/xz
  • トレーサ
    • strace
    • ltrace
  • デバッガ
  • アセンブラ
    • objdump
  • その他
    • radare2
    • rp++
    • checksec.sh
    • peda
    • socat
    • pwntools

構築開始

Linuxコマンド

各種コマンドがあるか確認(Ubuntu16.04の場合上記コマンドは全て入っていた)

トレーサ

各種コマンドがあるか確認(Ubuntu16.04の場合上記コマンドは2つとも入っていた)

デバッガ

$sudo apt-get install buld-essential gcc-multilib git gdb

アセンブラ

$sudo apt-get install binutils

その他

radare2

$sudo apt-get install radare2

rp++

$mkdir $HOME/bin
$wget https://github.com/downloads/0vercl0k/rp/rp-lin-x64 -O $HOME/bin/rp

checksec.sh

$cd ~/Download/
$wget https://github.com/slimm609/checksec.sh/archive/1.6.tar.gz
$tar zxvf 1.6.tar.gz
$cp checksec.sh-1.6/checksec $HOME/bin/checksec.sh

peda

$sudo apt-get install build-essential gcc-multilib
$git clone https://github.com/zachriggle/peda.git ~/Download/peda
$echo "source ~/Download/peda/peda.py" >> ~/.gdbinit
$export PATH=$PATH/bin:$PATH

socat

$sudo apt-get install socat

pwntools

$sudo apt-get install python-pip python2.7-dev openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
$sudo pip install --upgrade pip
$sudo pip install pwntools
もしここで
Failed building wheel for cryptography
Failed building wheel for cffi
のようなエラーが出る場合
$sudo apt-get install libffi-dev
$sudo pip install cryptography

まとめ

まだ必要なツールはあると思うが、とりあえずここまで。いろいろ試しながらだったためミスがあると思う。(メモしとけばよかった...)

ArduinoでLCD表示

最近、Arduinoを触り始めたので(いまさら...笑)勉強がてらいろいろ試してます。ということで、今回はArduinoLCDモニタを制御してみたいと思います。 おそらく簡単なので、さくっとやっちゃいたいと思います。

準備

今回はLCDモニタとして、秋月さんのAQM0802A-RN-GBWを使いたいと思います。結構有名なやつですね。1つ320円(税込)という初心者でもとっつきやすい価格なので安心です。

準備するもの

Arduino(今回はUNOを使用)×1 AQM0802A-RN-GBW×1 ブレッドボード×1 ワイヤー×6

以上です!

作成開始

配線

まず配線からやっていきたいと思います。今回は抵抗もなにもいらないので本当に楽です。笑 下図はデータシートにある配線例ですが、初心者にはわかりずらい。というか入ってる部品のピンとちゃうやんっ!笑

f:id:n0x2ca:20151211210238p:plain

というわけでこっちが実際に接続する配線例です。 f:id:n0x2ca:20151211214216p:plain

RESETは繋がなくてOKです。 電源は3.3Vを使いました。(5Vでもいけるみたい) SCLとA5、SDAとA4を接続。そしてGNDを接続すれば完成です!! f:id:n0x2ca:20151211222624j:plain 簡単ですね!

プログラム

それでは続いてプログラムを書いていきます。 I2C接続では基本Wireライブラリを使用します。が、さらに便利なST7032というライブラリをオレ工房さんが作成されていましたのでそちらも活用させていただきました。以下がソースコードです。

Wireライブラリのみ使用

ST7032ライブラリ使用

結果

早速実行したいと思います! Wireのみの結果はこうなるはずです! f:id:n0x2ca:20151211222510j:plain

そしてST7032はこのようになるはずです! f:id:n0x2ca:20151211222539j:plain

うまく表示できましたね!

というわけで今回はこれで終了です! どうもありがとうございました!!