zPerceptron~zen言語で書かれた簡単パーセプトロン~
こんにちは、かずみん(@warugaki_k_k)です。
最近は、「ゼロから作る DeepLearning Pythonで学ぶディープラーニングの理論と実装」な本を読んでいます。
そこで学んだ、zen言語でandゲートなパーセプトロンを書いてみました。バイアスは使ってません。
実装は10分もかからずに、すみました。本当に簡単なものです。
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通りに環境設定していきましょう。
まずは、ライブラリなどをインストールするために、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に特殊命令を実装するのを次にやってみようと思っています。qemuはjitコンパイラなので、難しそうですが。あとは、アンチROPやアンチBoFを実装するのも面白そう。難しそうだけど。 改造において、qemuコードを読むことはとても重要ですが、読んでもわからなかったら、以下の資料などを読むといい。
ではさらば、ハッピー低レイヤーライフを!!
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
詳しく
まず、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つければよかったようです。
セキュリティキャンプ全国大会応募用紙との格闘まとめ
応過去問を解析
募用紙の書き方ノウハウを研究するために、過去問スプレッドを作成して、収集した。
自分を励ますフレンズ
参加者日記 t.co
@warugaki_k_k なんかたくさん書いてあるようにみえるかもしれないけれど、GDBの使い方とか実はキャンプの応募用紙書いてるときに初めて学んだとかそんなレベルなので、こわがらずに全力で書いてみてください!
— hikalium (@hikalium) 2017年4月28日