2014-12-30

Raspberry PI B+ のCPU性能

RPI B+ を購入したのだが, CPUのスピードがどの程度なのかよくわからない. 円周率を計算して, Intel Core i7 と比較してみた.
Intel Core i7 3.40GHz0.52s
Raspberry PI B+37.00s
というわけで, Core i7 換算で 48MHz 相当.

エネルギー効率を比較してみた. 後述のスクリプトを1回実行するのにかかるエネルギー (電力 x 時間) を計算. 電力は, スペック表から, 1コア当たり 77W/8=9.6W, 1W を使用.

Intel Core i7 3.40GHz4.8J
Raspberry PI B+37J
処理当たりのエネルギーは RPI が 8 倍程度.

実行条件は以下の通り.

$ cat pi.py
#!/usr/bin/env python

def f(x):
        return 4 / ( 1.0 + x**2 )

n = 1000000
sum = 0
step = 1.0 / n

for i in range(0, n):
        x = ( i + 0.5 ) * step
        sum += f(x)

pi = sum * step

print pi
$ time python pi.py
3.14159265359

real    0m37.005s
user    0m27.950s
sys     0m0.170s
$ cat /proc/cpuinfo 
processor       : 0
model name      : ARMv6-compatible processor rev 7 (v6l)
Features        : swp half thumb fastmult vfp edsp java tls 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7

Hardware        : BCM2708
Revision        : 0010
Serial          : 000000004f7ee6b3
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq 
700000
scaling_cur_freqが実際の周波数と思われるが, 何の値なのかわからない.

NTT西日本NGNのネームサーバはpingに応じない

NTT西日本のフレッツを使っていると, IPv6のRAで,
nameserver 2001:a7ff:5f01::a
nameserver 2001:a7ff:5f01:1::a
というネームサーバが通知される.

このサーバ, PINGを送っても, 帰ってこない.

$ ping6 2001:a7ff:5f01::a
PING 2001:a7ff:5f01::a(2001:a7ff:5f01::a) 56 data bytes
--- 2001:a7ff:5f01::a ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 24999ms
あれれ? と思ったのだが, ただPINGに応答しないだけだった. 名前解決の問い合わせには応えてくれる.
$ nslookup blogspot.jp 2001:a7ff:5f01::a
Server:  2001:a7ff:5f01::a
Address: 2001:a7ff:5f01::a#53

Non-authoritative answer:
Name: blogspot.jp
Address: 74.125.204.191

プロバイダを変更してみた

これまでぷららをつかっていたけれど, いわゆる IPoE 接続で IPv6 を使いたくて, 21-domain に乗り換えた.

品質は, そこそこだと思う.

一部のサイトとの通信が遅いかも.

2014-12-24

Logwatch のスクリプトの書き換え

Logwatch は, 毎日, ログをサマライズして送ってくれるツールである. Logwatch が行う処理を少し変更したい場合がある. この方法を示す.

RHEL では, /usr/share/logwatch/scripts/services の下に, サービス毎 (Postfix, sshd など) のログ処理スクリプトが格納されている.
このファイルをそのまま編集するのではなく, このファイルを /etc/logwatch/scripts/services にコピーして編集すると良いらしい.

たとえば,

 User root from xx.xx.xx.xx not allowed because not listed in AllowUsers : 3 time(s)
 reverse mapping checking getaddrinfo for example.com failed - POSSIBLE BREAK-IN ATTEMPT! : 1 time(s)
というログが大量に報告されて鬱陶しい. この場合, 以下のようにする.
sudo cp -i /usr/share/logwatch/scripts/services/sshd /etc/logwatch/scripts/services/
sudoedit /etc/logwatch/scripts/services/sshd
以下のように, Ignore these に入る条件に追記する.
$ diff -u /usr/share/logwatch/scripts/services/sshd ./sshd
--- /usr/share/logwatch/scripts/services/sshd 2012-08-29 20:28:55.000000000 +0900
+++ ./sshd 2014-12-24 15:54:16.000000000 +0900
@@ -211,7 +211,9 @@
        # failed login entry...
        ($ThisLine =~ /^input_userauth_request: (illegal|invalid) user (.*)$/ ) or
        ($ThisLine =~ m/^(Illegal|Invalid) user (.*) from ([^ ]+)/ ) or
-       ($ThisLine =~ /pam_krb5: authentication succeeds for `([^ ]*)'/)
+       ($ThisLine =~ /pam_krb5: authentication succeeds for `([^ ]*)'/) or
+       ($ThisLine =~ /User .* from .* not allowed because not listed in AllowUsers/) or
+       ($ThisLine =~ /reverse mapping checking getaddrinfo for .* failed - POSSIBLE BREAK-IN ATTEMPT/)
    ) {
       # Ignore these
    } elsif ( my ($Method,$User,$Host,$Port) = ($ThisLine =~ /^Accepted (\S+) for (\S+) from ([\d\.:a-f]+) port (\d+)/) ) {

2014-12-22

Bit.ly と amzn.to

Bitly でリンクを圧縮すると, bit.ly のURLができる. ここにAmazonのリンクを入れると, amzn.to ドメインのURLができる. たとえば, http://www.amazon.co.jp は http://amzn.to/1kt8g2S になる.
ここまでは, よく聞く.

この amzn.to は bit.ly と書いてもOKらしい.
たとえば, http://amzn.to/1kt8g2Shttp://bit.ly/1kt8g2S と書き換えられる. 逆を試してみたが, このブログのホームへのリンク http://bit.ly/1AO4R8rhttp://amzn.to/1AO4R8r と書くのはNGらしい.

2014-12-17

DLL呼び出しの調査

Windows のアプリケーションについて, どのような振舞をするのか解析したいということがある. そのとき, DLL呼び出しをログにとることができると便利である.

中間者攻撃DLLの作成

攻撃対象のDLL名 x.dll とし, エクスポートしているAPIが既知であるとする. まず, 以下のようなソース mitm.c を書く.
#include "windows.h"
#include "stdio.h"
#include "stdlib.h"

#define ACTUAL "x-actual.dll"

static int state = 0;
static FILE *fp = NULL;

static int (*f1)(int) = NULL;

static void fin()
{
    if(fp) {
        fclose(fp);
    }
    fp = 0;
}

static void init()
{
    HANDLE h = LoadLibrary(ACTUAL);
    if(h) {
        f1 = (int(*)(int))GetProcAddress(h, "func1");
        // do not call FreeLibrary(h);
    }

    fp = fopen("evadll-mitm.log", "w");
    state = 1;
    atexit(fin);
}

#define log(fmt, ...) if(fp) { fprintf(fp, fmt, __VA_ARGS__); fflush(fp); }

int WINAPI func1(int value)
{
    if(!state) init();
    int ret = f1 ? f1(value) : 0;
    log("func1(%d)=%d\n", value, ret);
    return ret;
}
攻撃対象のDLLをx-actual.dllにリネームする. 以下のコマンドで, コンパイルする.
i686-w64-mingw32-gcc  -shared -o x.dll mitm.c -Wl,-k

TODO

LDPRELOADのような機能を使えば, もっと色々できるかもしれない.

Tips

GCCでは, エクスポートする関数名に@がついてしまうのだが, この記事によると, -Wl,-kをつけると@以降が消えると教えてくれた.

LoadLibrary などの使用方法はこのページを参考にした.

mingw: 依存するDLLを列挙

Linux では, ldd というコマンドで, リンクする共有オブジェクトを調べることができる.

Windowsの実行ファイルに関しても, どのDLLをリンクしようとしているのか知りたいことがある. こんな場合, obdjump で調査することができる.

$ LANG=C objdump -p hoge.exe | grep 'DLL Name:'

2014-12-16

Windows ネットワーク接続の切断

Windows では, 一度遠隔コンピュータのネットワークにログオンすると, ローカルでログオフするまでネットワーク接続からログオフできない. 共有のコンピュータの場合など, ログオフせずにユーザを切り替えたい場合に困る.

GUIではログオフの操作が出来ないが, コマンドからはログオフできる.

  1. まず, コマンドプロンプトを開く.
    スタートメニューの「プログラムとファイルの検索」に「cmd」と入力する.
  2. net use で接続の一覧を表示し, リモート名を確認する.
  3. net use /delete リモート名 にて, 削除 (ログオフ) できる.

2014-12-04

/usr/lib/libtermcap.so.2: file too short

RHEL7では libtermcap.so から libtinfo.so に統合されている. libtermcap.so を使おうとすると, 以下のようにエラーになる.
error while loading shared libraries: /usr/lib/libtermcap.so.2: file too short
以下のように tinfo を使うよう指示されている.
$ cat /usr/lib/libtermcap.so.2
INPUT(-ltinfo)
したがって, libtinfo.so にリンクをはる.
$ sudo ln -s libtinfo.so /usr/lib/libtermcap.so.2