備忘録など

勉強したことをまとめておこうかなとか

ns-2を使えるようにする

ネットワーク趣味れーたーシミュレーターのns-2を使いたいので、インストールしたときのメモ。

まず、必要な物がすべて入ったall-in-oneの圧縮ファイルをダウンロード。


nsnam - Browse /allinone/ns-allinone-2.35 at SourceForge.net

tarを展開したら、


Network Simulator 2 (ns-2) のインストール|monoのブログ

を参考に、必要なライブラリをインストール

$ sudo aptitude install libx11-dev xorg-dev

次の3ヶ所を修正

allinone-2.35/ns-2.35/linkstate/ls.h
137c137
< 	void eraseAll() { erase(baseMap::begin(), baseMap::end()); }
---
> 	void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); }
none-2.35/ns-2.35/bin/raw2gp
24,25c24,27
< require 'getopts.pl';
< &Getopts('ags:m:ql') || usage;
---
> #require 'getopts.pl';
> use Getopt::Std;
> #&Getopts('ags:m:ql') || usage;
> getopts('ags:m:ql') || usage;
none-2.35/ns-2.35/bin/raw2xg
37,38c37,40
< require 'getopts.pl';
< &Getopts('acefgds:m:n:qrplvt:xy') || usage;
---
> #require 'getopts.pl';
> use Getopt::Std;
> #&Getopts('acefgds:m:n:qrplvt:xy') || usage;
> getopts('acefgds:m:n:qrplvt:xy') || usage;

このgetopts.plにはしばらく悩まされた。validateでCan't locate getopts.pl in @INCで悩んでる人はおそらくこれが原因です。

ビルド

$ cd ns-allinone-2.35
$ ./install

動作確認

$ cd ns-allinone-2.35/ns-2.35
$ ./validate

cronを使ってチャイムを鳴らす

チャイムといえば、僕が作ったフリーソフトがあるのでまずそれを紹介。

「簡易チャイム」
http://www.vector.co.jp/soft/winnt/personal/se478631.html

Windowsならこれを使ってかんたんにチャイムを鳴らせます。

Linux用を作ってなかったので、(Monoを使ったら動く可能性もありますが)LinuxではCronを使うことにしました。

今回はpulseaudioがインストールされた環境だったので、再生ソフトにはpaplayを使いました。

crontab -eでcron用のエディタを起動します。

22時ちょうどにチャイムを鳴らすには

0 22 * * * paplay --volume=32768 chime.wav

21時50分にチャイムを鳴らすには

50 21 * * * paplay --volume=32768 chime.wav

とこんな感じで末尾に書き足していくだけです。

paplayの--volumeオプションですが、最大値が65535らしいので、半分の32768を指定しました。

音声ファイルは、NHKの素材集から拾ってきたものをwavに変換して使用しました。

「効果音 学校のチャイム:素材をさがす:NHKクリエイティブ・ライブラリー」
http://www1.nhk.or.jp/creative/material/5d/D0002011518_00000.html

キーボードの配列を切り替える

キーボードの配列を切り替えるregファイルです。


キーボードの配列をUS配列にして、CapsをCtrlに割り当てる

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parameters]
"LayerDriver JPN"="kbd101.dll"
"OverrideKeyboardIdentifier"="PCAT_101KEY"
"OverrideKeyboardSubtype"=dword:00000002

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00


元に戻す

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parameters]
"LayerDriver JPN"="kbd106.dll"
"OverrideKeyboardIdentifier"="PCAT_106KEY"
"OverrideKeyboardSubtype"=dword:00000002

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=-

x86_64の逆アセンブルを読む(gcc版)

先週の土日にDEFCONに参加してました。
そのときに逆アセンブルを読む必要があったので、まとめてみました。

Cのソース

#include <stdio.h>

int main() {
      printf("hello, world\n");
      return 0;
}


objdump -d -M intel helloの結果の一部

00000000004004fc <main>:
  4004fc: 55                    push   rbp
  4004fd: 48 89 e5              mov    rbp,rsp
  400500: bf c4 05 40 00        mov    edi,0x4005c4 ;文字列のポインタをわたしてる
  400505: e8 d6 fe ff ff        call   4003e0 <puts@plt>
  40050a: b8 00 00 00 00        mov    eax,0x0 ;return 0
  40050f: 5d                    pop    rbp


変数をつかってみた

#include <stdio.h>

int main() {
        int i=10;
        printf("hello, world\ni = %d", i);
        return 0;
}
000000000040050c <main>:
  40050c:       55                      push   rbp
  40050d:       48 89 e5                mov    rbp,rsp
  400510:       48 83 ec 10             sub    rsp,0x10 ;スタック領域を確保
  400514:       c7 45 fc 0a 00 00 00    mov    DWORD PTR [rbp-0x4],0xa ;int a=10
  40051b:       8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
  40051e:       89 c6                   mov    esi,eax
  400520:       bf ec 05 40 00          mov    edi,0x4005ec
  400525:       b8 00 00 00 00          mov    eax,0x0
  40052a:       e8 b1 fe ff ff          call   4003e0 <printf@plt>
  40052f:       b8 00 00 00 00          mov    eax,0x0 ;return 0
  400534:       c9                      leave
  400535:       c3                      ret

関数の構造

1. ラベル
main:

2. スタックのベースポインタrbpをpush
push rbp

3. 他に使うレジスタがあればpush
push rsi ;たとえば
push rdi

4. スタックのベースポインタを現在のスタックの先頭に設定
mov rbp, rsp

5. 必要であれば、変数用領域を確保
sub rsp, 0x10

6. 変数への読み書き
mov DWORD PTR [rbp-0x4], 0xa ;変数へ書き込み
mov eax, DWORD PTR [rbp-0x4] ;変数から読み出し

7. 関数の呼び出し
mov r9, 0x6 ;第六引数
mov r8, 0x5 ;第五引数
mov rcx, 0x4 ;第四引数
mov rdx, 0x3 ;第三引数
mov rsi, 0x2 ;第二引数
mov rdi, 0x1 ;第一引数
call 000000 ;関数呼び出し
mov edx, eax ;eax=戻り値

8. 戻り値のセット
mov eax, 0x0 ;return 0

9. 呼びだし前の環境の復元
pop rdi ;基本的にはpopする
pop rsi
mov rsp, rbp ;忘れてた(13/06/19 14:10追記)
pop rbp ;popの順番に注意
もしくは
leave ;便利

10. 呼び出し元に戻る
ret

sambaを触ってみる

とりあえず、インストールから。
環境は諸事情によりdebianです。

$sudo aptitude install samba samba-* smbclient winbind 

設定は

$sudo vim /etc/samba/smb.conf

を編集する。

全般設定

[global]
        dos charset = CP932
        display charset = UTF-8
        workgroup = WORKGROUP
        server string = %h server
        map to guest = Bad User
        obey pam restrictions = Yes
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        unix password sync = Yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        domain logons = Yes
        dns proxy = No
        wins support = Yes
        usershare allow guests = No
        panic action = /usr/share/samba/panic-action %d
        idmap config * : backend = tdb
        admin users = Administrator


homesセクションを書いておくと、ログインしたユーザーのhomeが自動的に共有される。

[homes]
   comment = Home Directories
   browseable = no
   path = %H/winhome
   read only = no
   create mask = 0600

   directory mask = 0700
   valid users = %S

設定を確認

$sudo testparm


設定を変更したら、

$sudo service samba restart

する。

$sudo smbcontrol smbd reload-config

では、設定の変更がうまく反映されないらしい。

ユーザーの追加は

$sudo pebedit -a -u username

で追加できるらしいけど、Debianに無いユーザーを入力するとエラーになる。どこか設定しないといけないのかも。

続く(?)

今日すごい大雪だったのでまとめ