KazuminEngine

プログラマーの日記

zPerceptron~zen言語で書かれた簡単パーセプトロン~

こんにちは、かずみん(@warugaki_k_k)です。

最近は、「ゼロから作る DeepLearning Pythonで学ぶディープラーニングの理論と実装」な本を読んでいます。

そこで学んだ、zen言語でandゲートなパーセプトロンを書いてみました。バイアスは使ってません。

実装は10分もかからずに、すみました。本当に簡単なものです。

GitHub - kazuminn/zPerceptron

const std = @import("std");

pub fn main() anyerror!void {
    std.debug.warn("AND(0, 0) : {} \n", AND(0,0));
    std.debug.warn("AND(1, 0) : {} \n", AND(1,0));
    std.debug.warn("AND(0, 1) : {} \n", AND(0,1));
    std.debug.warn("AND(1, 1) : {} \n", AND(1,1));
}

pub fn AND(x1 : f16 , x2 :f16) u8 {
    const w1 = 0.5;
    const w2 = 0.5;
    const theta = 0.7;
    const tmp = x1*w1 + x2*w2;
    if (tmp <= theta){
        return 0;
    }else{
        return 1;
    }
} 

これを実行すると、

$zen build run
AND(0, 0) : 0 
AND(1, 0) : 0 
AND(0, 1) : 0 
AND(1, 1) : 1 

あってますね。

全然(zenzen)書くことがありません。これで終わりです。

ニューラルネットワークも実装しようと思っていましたが、zen言語の行列の積をする関数とかがないっぽいので無理っぽいです。(あるのかな?よく知らない。

zen言語でディープラーニングとかできたら、かっこいいですね。

qemuの改造入門

久々にBlogを書きたくなったので、書いていきます。今回は、qemuを改造していきましょう。このBlogをこなすと簡単なqemuの改造ができるようになります。おそらく、低レイヤーを触ることになると思います。

改造と聞くと難しいことをするんじゃないかと思いますが、違います。難しいパッチを書くんじゃなくて、簡単なものです。terminalの簡単な操作ができて、簡単なc言語がわかるとできると思います。コードを書く時間はqemuのビルド時間より、はるかに短いものです。

CPU命令実行毎にとある情報をprintfさせる改造をします。

qemuのビルド方法(環境構築)

筆者は、VirtualBox6.0でUbuntu 18.04を使ってqemu4.1.50ビルドしています。

このサイトのwiki通りに環境設定していきましょう。

Hosts/Linux - QEMU

まずは、ライブラリなどをインストールするために、terminalで以下を実行してください。注意として、zlib1g-devのgの前はlでなく1です。

# sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev

次に、qemuのインストールです。

# git clone https://github.com/qemu/qemu

さて、qemuのビルドをしましょう。qemuのソースとビルドされたバイナリなどの総量が約3GBかかるので注意が必要です。容量に余裕を持ってビルドしましょう。結構時間がかかるので、Twitterを見たりして、コーヒーブレイクなどを。

# Switch to the QEMU root directory.
cd qemu
# Prepare a native debug build.
mkdir -p bin/debug/native
cd bin/debug/native
# Configure QEMU and start the build.
../../../configure --enable-debug
make
# Return to the QEMU root directory.
cd ../../..

qemu改造

さて、次は改造です。実際にc言語を書いていきます。書くと言っても、たったの2行ですが。

cpu命令実行毎に命令のサイズを表示するように改造してやるのです。今回は筆者の都合でx86アーキテクチャーを改造していきます。

改造の方針ですが、 コードを読むと、(詳しいコードの読み方は割愛しますが、あとて共有するサイトなどを見てみると良いかもしれません。) 命令実行毎にcpu_tb_execがループで呼び出されていて、tcg_qemu_tb_exec(env, tb_ptr);で命令を実行しているようなので、ここの前にprintfをはめ込んでやればいいことがわかります。

accel/tcg/cpu-exec.cに以下を足してください。

20行目あたりに

#include <stdio.h>

ret = tcg_qemu_tb_exec(env, tb_ptr); の上に

printf("%o¥n",itb->size);

これで改造は終了です。

次はビルドしてあげましょう。以下のように実行してください。

# pwd
qemu/bin/debug/native

# make

実行

改造が完了したので、早速、実行していきましょう。楽しみですね。

# pwd
emu/bin/debug/native
# x86_64-softmmu/qemu-system-x86_64 -L pc-bios
VNC server running on 127.0.0.1:5900
5
13
4
6
11
省略

できてますね。

5とか13とかが命令のサイズのようです。byteなのかは筆者はそこまで調べていませんが。5と13を比べるとだいぶ差がありますね。

今後の道しるべ

あとは、自分の気の向くまま、コードを読んだり、改造したり、commitしたり、頑張ってください。 筆者は、qemuに特殊命令を実装するのを次にやってみようと思っています。qemujitコンパイラなので、難しそうですが。あとは、アンチROPやアンチBoFを実装するのも面白そう。難しそうだけど。 改造において、qemuコードを読むことはとても重要ですが、読んでもわからなかったら、以下の資料などを読むといい。

rkx1209.hatenablog.com

rkx1209.hatenablog.com

KMC Staff Blog:QEMUメモ(1)

KMC Staff Blog:QEMUメモ(2)

KMC Staff Blog:QEMUメモ(3)

ではさらば、ハッピー低レイヤーライフを!!

snortをちょっと読んでみた

snortは基本idsである。inlineモードにすれば、ipsになるらしい。

main

detect.cにSnortMainがある。<-なかなか見つからなかった。

main https://github.com/threatstream/snort/blob/9bd7ba3c50f18b1d9df326182aed524324ed19f4/src/snort.c#L782

検知部分

検知するコードはdetectで検索すればよい。detect.h/cがもろにヒットした。 以下が、detection moduleらしい。

int CheckBidirectional(Packet *, struct _RuleTreeNode *, RuleFpList *, int);
int CheckSrcIP(Packet *, struct _RuleTreeNode *, RuleFpList *, int);
int CheckDstIP(Packet *, struct _RuleTreeNode *, RuleFpList *, int);
int CheckSrcIPNotEq(Packet *, struct _RuleTreeNode *, RuleFpList *, int);
int CheckDstIPNotEq(Packet *, struct _RuleTreeNode *, RuleFpList *, int);
int CheckSrcPortEqual(Packet *, struct _RuleTreeNode *, RuleFpList *, int);
int CheckDstPortEqual(Packet *, struct _RuleTreeNode *, RuleFpList *, int);
int CheckSrcPortNotEq(Packet *, struct _RuleTreeNode *, RuleFpList *, int);
int CheckDstPortNotEq(Packet *, struct _RuleTreeNode *, RuleFpList *, int);

drop部分

dropを検索すればよく。detect.cにDropActionがある。こいつが、検知した時に、dropをする処理だ。ただし、先述の通りインラインモードである必要がある。

int DropAction(Packet * p, OptTreeNode * otn, Event *event)
{
    RuleTreeNode *rtn = getRuntimeRtnFromOtn(otn);

    DEBUG_WRAP(DebugMessage(DEBUG_DETECT,
               "         Generating Alert and dropping! \"%s\"\n",
               otn->sigInfo.message););

    if(stream_api && !stream_api->alert_inline_midstream_drops())
    {
        if(stream_api->get_session_flags(p->ssnptr) & SSNFLAG_MIDSTREAM)
        {
            DEBUG_WRAP(DebugMessage(DEBUG_DETECT,
                "  Alert Came From Midstream Session Silently Drop! "
                "\"%s\"\n", otn->sigInfo.message););

            Active_DropSession(p);
            return 1;
        }
    }

    /*
    **  Set packet flag so output plugins will know we dropped the
    **  packet we just logged.
    */
    Active_DropSession(p);

    CallAlertFuncs(p, otn->sigInfo.message, rtn->listhead, event);

    CallLogFuncs(p, otn->sigInfo.message, rtn->listhead, event);

    return 1;
}

次は、もっと詳細に読んでいきたい。

consul 触ってみた その1

grasysのvuls記事を見ていて、consulがわからなかったので、さわって見た。 ( 前にも触ったことがあり、その時は、clusterを組んで遊んでいた。

何やったの?

consulは色々機能があるが、以下のうちKV DataとWeb UIを触って見た。 インストールは、簡単にバイナリをpcに落としてきて、./consoleで使ってた。

  • Consul Cluster

  • Health Checks

  • KV Data

  • Web UI

  • dns

詳しく

まず、agentを起動。 そのときにwebも起動してくれる。なので、http://localhost:8500を見に行けば、webからデータベースを触れる。 いくつかを実際に登録して見ました。

./consul agent -dev

redisに5を結びつける。

./consul kv put redis 5

redisに結びついた、valueを持ってくる。これで,5が出てくる。意外と、かなり簡単。

./consul kv get  redis

ext2 fsの開発を再開。

GitHub - Ninals-GitHub/Learning-Ext2-Filesystem: You can learn about ext2 filesystem step by step.

を参考にして、開発再開。

久しぶりに、makeすると

/home/vagrant/ext2/me2fs_super.h:49:1: error: expected ‘;’, identifier or ‘(’ before ‘struct’
 struct dentry *
 ^
/home/vagrant/ext2/me2fs_super.h:50:1: error: field ‘me2fsMountBlockDev’ declared as a function
 me2fsMountBlockDev( struct file_system_type *fs_type,
 ^
/home/vagrant/ext2/me2fs_main.c:22:1: error: expected specifier-qualifier-list before ‘static’
 static struct file_system_type me2fs_fstype =
 ^

と怒ってきた。

staticの前に何かつけろとか意味のわからないことばかりを......

放置してたので、そうなる予測はしていたが、まさかこれ2時間も時間を取られるとは。。。。

sudoつければよかったようです。

セキュリティキャンプ全国大会応募用紙との格闘まとめ

応過去問を解析

募用紙の書き方ノウハウを研究するために、過去問スプレッドを作成して、収集した。

docs.google.com

自分を励ますフレンズ

www.youtube.com

参加者日記 t.co