livaの雑記帳

ubpfで遊んでみる

eBPFくらい簡単に遊べるようになっておかないとまずいよな、という気持ちになったので、遊んだときの記録。

とりあえずユーザーランドで動かしたいんじゃ、って思ったので、ubpfを使ってみる。

 

github.com

 

clang入れるのと、pipで nose pyelftools parcon を入れる必要あり。
で、リポジトリのルートで`make -C vm`ってやるとvmディレクトリ内に`test`っていう実行ファイルができるから、これで遊ぶ。

 

testsの中から引っ張ってきたコード

extern int strcmp_ext(const char *a, const char *b);

 

int entry(int *mem)

{

  char a = "abcx";

  char b = "abcy";

 

  if (strcmp_ext(a, a) != 0) {

    return 1;

  }

 

  if (strcmp_ext(a, b) == 0) {

    return 1;

  }

 

  return 0;

}

 

こいつ(main.c)を

$ clang -O2 -target bpf -c main.c -o main.o

こうして、

$ vm/test -j main.o

こうすると実行できる。0って帰ってきますね。

 

エントリポイントがバイナリの先頭っぽいので、entry()の前に関数置くとそっちが実行されちゃいます。

 

メモリ使うのもやってみてくなった。

3バイトのmemというファイルを用意し、

int entry(char *mem)

{

  return mem[100];

}

こんなん実行したら、range execeptionで落ちるのかなーとか期待。

 

$ vm/test -j -m mem main.o

 

落ちなかった。ubpfではメモリチェックとかはやってないっぽい。

 

おまけ

ubpf環境はDockerで作った。→livadk/ubpf

こんな感じで使うと、環境構築から開放されて、大変幸せになれる。