MacOSのシステムコール呼び出しでの"Bus Error: 10"

MacOSで64bitのシステムコールを呼ぼうとした時に気になったことがあったのでメモ。

 

MacOSシステムコール

https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master

これを見るとexitシステムコールは1なのでアセンブリで書くとこんな感じになる。

これをコンパイルしてリンクすると 

$ nasm -f macho64 -o nasm.o nasm.asm

$ ld nasm.o -e _start -o nasm

$ ./nasm

Bus error: 10 

なんでだろうと思って調べてみたら以下の記事が見つかった。

TheXploit | Mac OS X 64 bit Assembly System Calls

Mac OS X 64bitでシステムコール - 七誌の開発日記

書いてある通りなのだけどMacOSではシステムコール呼び出すにはクラス番号を足す必要があるらしい。

正しくは以下。

 

ちょっとだけ解説

先ほどのMac OS X 64 bit Assembly System Callsに書いてあるのを適当に訳してみる。

https://opensource.apple.com/source/xnu/xnu-792.13.8/osfmk/mach/i386/syscall_sw.h

BSDではシステムコールはクラスごとに分かれていて、上位ビットはクラスを表すらしい。書き込みと終了はSYSCALL_CLASS_UNIXに分類され、0x2000000 + unix_syscallとなる。なので0x2000001が終了のためのシステムコール