Kernel/VM探検隊online part4 #kernelvm - YouTube
11回目は、前回と同じく「Kernel/VM探検隊」の「バイナリを書き換えてシステムコールをフックする」から、Zpolineを見てみます。関数フック(※)って色々使いどころがあるので、今回の発表の中で一番興味あるタイトルでした。
※以前BinaryHacksを参考に関数トレーサを作って、若干業務で役に立った事がありました。その後、なんか(多分同じ本を読んで)同じことやってる人が数人見つかりましたが…
多少ですがやってる事理解できて面白かったんですが、Linuxのシステムコールは%raxに番号(システムコールの数、0~500くらいらしい)を入れてsyscallする仕様 → つまりsyscall命令を呼び出すタイミングで%raxには0~500の値が入ってる → 任意のsyscallをcallq *%raxに置き換えるとアドレス0x0~500にジャンプできる、という仕組みらしい。
Linuxではアドレス0x0~にもメモリ割り当てが出来るので、ここにフックしたい実装のアドレスを置いておけば、そっちが呼び出せるって事みたいです。
ptrace より 100 倍速いシステムコールフック作った - かーねるさんとか
dlmopen を使ってシステムコールのフックをいい感じにプログラミングする - かーねるさんとか
使い方とかはこの辺りに書いてあるそうです。
GitHub - yasukata/zpoline: An efficient and versatile system call hook mechanism
リポジトリはここ。
これも、ちょっと実際使ってみようと思います。あと後半の記事で紹介されてる「dlmopen」もちょっと面白いかも。ロードする名前空間を指定できるとか。
ところで、トランポリンって単語たまに見ると思ってたんですが、本当にあのトランポリンの意味だったんですね。どっかから飛んできてどこかへジャンプするみたいな。
おわり