ひよこになりたい

Programming Server Network Security and so on

SyslinuxでUSBメモリからWindowsインストールメディアを起動する

大学のメディアを使うときにちょっと詰まったのでメモ
コピペでできるように書いておきます
USBメモリ/インストールメディアに限定した話ではないけど、よく使うのがUSBメモリなのでとりあえずタイトルはこれで。

Arch Linuxで作ります。Ubuntuとか他のLinuxでも同じ感じでできるはず

必要なもの:

環境設定(Arch)

$ sudo pacman -S syslinux
$ sudo pacman -S dosfstools  # mkfs.vfat用
$ sudo pacman -S parted  # fdiskでもOK

USBのフォーマットとパーティショニング

まずUSBメモリを特定する。適当に以下のコマンドを駆使して目星をつける。

$ sudo fdisk -l
$ lsblk
$ dmesg  # USBを挿してすぐに見てみる 

今回は/dev/sdkがUSBでした。

次にフォーマットとパーティショニング。partedを使う。
USBの中身は完全に消去されるので注意

$ sudo parted /dev/sdk
(parted) p
(parted) mklabel msdos
(parted) mkpart primary fat32 0% 100%
(parted) set 1 boot on
(parted) p
(parted) quit

ブートフラグを立てておく。

作成した/dev/sdk1をfat32でフォーマット 

$ sudo mkfs.vfat /dev/sdk1

インストールメディアの書き込み

USBメディアとisoメディアをマウントしてisoのファイルをUSBにコピー。

$ sudo mkdir /mnt/{iso,usb}
$ sudo mount -o loop ~/path_to_iso/Win_Installer.iso /mnt/iso
$ sudo mount -o rw /dev/sdk1 /mnt/usb
$ sudo cp -r /mnt/iso/* /mnt/usb/

おそらく/mnt/usb/boot/ができているはず...

Syslinuxをいれる 

Syslinuxの本体のコピーとインストール

$ sudo mkdir /mnt/usb/boot/syslinux
$ sudo cp -r /usr/lib/syslinux/bios/*.c32 /mnt/usb/boot/syslinux/
$ sudo extlinux --install /mnt/usb/boot/syslinux

これだけでは起動できないのでmbrを書き込む

$ sudo dd if=/usr/lib/syslinux/bios/mbr.bin of=/dev/sdk bs=440 count=1 conv=notrunc

設定ファイル(syslinux.cfg)がないので作成する 

$ cd /mnt/usb/boot/syslinux/
$ sudo vim syslinux.cfg
--------- vim ---------
PROMPT 1
TIMEOUT 30
DEFAULT menu.c32

LABEL BOOTMGR
        MENU LABEL ^Windows-installer
        COM32 /boot/syslinux/chain.c32
        APPEND fs ntldr=/bootmgr
-----------------------

Windowsは/bootmgrを呼び出す必要があるみたいなので、chain.c32のオプションのntdlrで指定する。
bootmgrはWindows Vista以降で使われるブートローダー。
chain.c32はチェインロードを可能にするモジュール。syslinuxからbootmgrへとチェインロードする。
fsはパーティションを検出してくれる(らしい。よくわからないけど、消すとbootmgrを読み込んだあとエラーで落ちた)
ntldrはWindowsブートローダーをロードするchain.c32のオプション。

Comboot/chain.c32 - Syslinux Wiki

あとかたづけ

$ cd
$ sudo umount /mnt/usb
$ sudo umount /mnt/iso

これで終了 qemu-KVMでは無事インストーラーが起動しました。 boot:が表示されて3秒後に起動するけど、起動しない場合はmenuと打ってみるといいかも?

MDwikiをOwncloudと連携させてWebで編集できるようにした

MDwikiというMarkdownで書けるwikiをOwncloudと連携させて、ファイルをWeb上で編集できるようにした。ついでに認証もつけた。

MarkDownで書けてWebで参照できる自分(+少人数グループ)用のメモシステムが欲しいということで、今まではDokuwikiを使用していたのですが、Dokuwikiだと少し不便なところが多く、管理も面倒な感じでした。

そこで、Markdownで書けてデザインも綺麗なMDwikiを使ってみようかなと思ったのですが、MDwikiはファイルベースのwikiで手軽に編集できないと言う欠点がありました(毎回アップロードが必要なのが面倒...)。

DropboxやGoogleDrive上において使用するという方法もありましたが自分のドメインを使いたいので、今回はOwncloud上にMDwikiを置いて、Owncloudのファイル編集機能を使用して編集できるようにしました。

ついでにnginxを使用して簡単な認証(basic)をつけました。

とくに特別な設定はしていないので簡潔に。

概要

今回はMDwiki+Owncloud+Nginx(SSL)を使用しました。Nginxを使用しましたがApacheでも大丈夫と思います。
流れとしては、Nginxの導入→Owncloudの構築→MDwikiの設置と言った感じ。
長くなるので細かなインストールは省きます。

Nginxの導入 & Owncloudの導入

インストールは各OSによって異なるので省略。 普通にインストールすればOK。

Owncloudで認証が必要なので、SSLが必須。オレオレでもいいのでつけておく。

ここで、Owncloudのデータ保存ディレクトリを覚えておく。ここでは/home/owncloud/data/にします。

MDwikiの導入

構築が終わったら、Owncloud上にMDwiki用のディレクトリを作成。 その中にOwncloud上からMDwikiを突っ込む。

Releases · Dynalon/mdwiki · GitHub

mdwiki.html以外を削除して、mdwiki.htmlをindex.htmlにリネーム。

確認用にindex.mdを作成。

Test page
========

hello
------

f:id:zipsan:20151014185600p:plain

ディレクトリにシンボリックリンクを張る

ここで、Owncloud上のMDwikiディレクトリのパスを探す。
おそらくは[Owncloudデータディレクトリ]/[Username]/files/MDwikiあたりにあるかな?

$ cd /home/owncloud/data/  # Owncloudのドキュメントルート
$ cd owncloud_user  # Owncloudで作成したユーザー
$ cd files/mdwiki
$ pwd
/home/owncloud/data/owncloud_user/files/mdwiki

webのドキュメントルートでシンボリックリンクの作成。
owncloud上のデータディレクトリをnginxのドキュメントルートから読み出せるようにする。

cd </path/to/DocumentRoot>
ln -s /home/owncloud/data/owncloud_user/files/mdwiki mdwiki

これでOK

認証

今回はかんたんにbasic認証SSL必須です

htpasswdを作成

$ htpasswd -b -c .htpasswd user passwd

nginxの設定をいじる。

    location ~ /mdwiki/ {
        auth_basic "wiki";
        auth_basic_user_file /etc/nginx/.htpasswd;
        root   /var/www/;
        index  index.html index.htm index.php;
    }

これでhttp://example.jp/mdwiki/に接続すればbasic認証を求められるようになる。

ファイルの編集

owncloud上でファイル名をクリックする。
現在の最新版8.1.3だと標準で編集機能が付いているのでラク。ついてなければプラグインを入れましょう

とりあえずだけどコレでWebから編集できるようになった。

f:id:zipsan:20151014185613p:plain

大事な文書書く場合はセキュリティも意識しないとだめかも。

TrendMicro CTF(TMCTF) 2015 Online Qualifier 解けた問題などWriteup

Trendmicro CTF 2015のOnline Qualifier(TMCTF)をやってみました。
大学の友人がCTFにやる気を出していたので、今回はいつものチームではなく大学の友人3人でチーム"sagume"として出ました。

結果としては700点ほどしかとれませんでしたが、大学の友人に教えたり教えられたりとワイワイやりながらやるCTFは楽しかったです。

以下Writeup

続きを読む

1時間以内に解けなければプログラマ失格となってしまう5つの問題とやらをPythonで書いてみた

調べ物してたら見つけたので書いてみた。
1-3問までは簡単だけど4問から難易度が跳ね上がるという評価だったけど、itertoolsが強すぎて割とすぐ解けた。
モジュール使わず書こうとしたけど、時間内に書けなそうだったのでitertools使った。致命的に頭が悪い。
多分あっていると思うけど、テストケースが1つなのでなんとも言えない感。

プログラミング力つけなければいけないなと思いました。

1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に

Five programming problems every Software Engineer should be able to solve in less than 1 hour - svpino.com

コードはPython3です。

問題1

def m1_for(lst):
    s = 0
    for l in lst:
        s += l
    return s

def m1_while(lst):
    i, s = 0, 0
    while i < len(lst):
        s += lst[i]
        i += 1
    return s

def m1_rec(lst):
    if len(lst) == 0:
        return 0
    else:
        return lst[0] + m1_rec(lst[1:])

再帰とか久しぶりに書いた気がする
[1, 2, 3, 4, 5, 6, 7, 8, 9]45になればOK

問題2

def m2(lst1, lst2):
    res = []
    for l1, l2 in zip(lst1, lst2):
        res.extend([l1, l2])
    return res

zip関数有能
['a', 'b', 'c'], [1, 2, 3]['a', 1, 'b', 2, 'c', 3]になればOK

問題3

def m3():
    res = [0, 1]
    for i in range(99):
        res.append(res[-2] + res[-1])
    return res

再帰で書く方法がポピュラーなのかな?
[0, 1, 1, 2, 3, 5, 8, 13, 21, ... , 354224848179261915075]であればOK

問題4

def m4(lst):
    import itertools
    combs = itertools.permutations(lst)
    results = []
    for c in combs:
        value = int("".join([str(n) for n in c]))
        results.append(value)
    return max(results)

ここからちょっとだけ考える必要がある
はじめは先頭の数字でsortすればOKかなと思ってたけど、よく考えたら11, 12, 111, 112みたいな2桁以上が複数入ってきた場合ダメだった。やるなら先頭だけでソートするんじゃなく、2桁目, 3桁目...も見てソートする必要がありそう。

今回はitertools.permiutationsでlistの順列を全て取り出して、その中で最大のものを出した。
[50, 2, 12, 9, 11, 111, 121, 0]950212121111110になればOK(?)

  • 追記:2015/09/24 18:51

早速赤い人から高速な解法があるよと教えていただいたので追記。

l + r < r + lとなる部分を順番にswapしてソーティングするみたいです。
教えて頂いたまーすさんに圧倒的感謝

問題5

def m5():
    import itertools
    operators = itertools.product(("+", "-", ""), repeat=8)
    for op in operators:
        exp = ""
        for i in range(1, 10):
            exp += str(i)
            if i != 9:
                exp += op[i - 1]
        if eval(exp) == 100:
            print(exp)

itertoolsサイコー
productで直積集合出して、文字列にしてevalしました。
答えは11通りらしい。

1+2+3-4+5+6+78+9
1+2+34-5+67-8+9
1+23-4+5+6+78-9
1+23-4+56+7+8+9
12+3+4+5-6-7+89
12+3-4+5+67+8+9
12-3-4+5-6+7+89
123+4-5+67-89
123+45-67+8-9
123-4-5-6-7+8-9
123-45-67+89

が出ればOK

Windowsでpipがインストールできなくて困った問題

Windowspython -m ensurepipを実行するとsetuptools実行時にTypeErrorが出て困ってた問題が解決したのでメモ。バージョンはpython3.4.3。

 File "C:\Python34\lib\mimetypes.py", line 348, in init
     db.read_windows_registry()
   File "C:\Python34\lib\mimetypes.py", line 255, in read_windows_registry
     with _winreg.OpenKey(hkcr, subkeyname) as subkey:
TypeError: OpenKey() argument 2 must be str without null characters or None, not str

特に致命的な問題ではなかったのでそのまま放置していたが、pycharmでDebugを実行しようとした場合に出てきて困ったので解決に踏み出した。

mimetypes.pyでレジストリを読んでいるみたいだが、その途中で読み取れない問題が出ている模様。おそらくレジストリのキーの一部に問題があって止まっているっぽい

解決法

レジストリの一部にnullなキーがあるのが問題なので、そのキーを削除すれば直る。今回の場合はHKEY_CLASSES_ROOTに問題があるようだ(_winreg.OpenKey(hkcr, subkeyname)でエラーが出ているため)。

RegDelNullというツールMicrosoftが出しているらしい。
レジストリキーを走査してnullなキーを削除してくれる。

C:\Downloads\Regdelnull> .\RegDelNull.exe hkcr -s

スキャンして見つかれば消していいかどうか尋ねてくるので出なくなるまで消す。私は一応regeditで確認して消した。

上記コマンドはHKEY_CLASSES_ROOTを調べる(hkcr)ので、これで直らなければhkcu, hklm, hku, hkccも調査する。私の場合はhklmにも見つかったので消しておいた。

とりあえずこれで直ったのでよかった。