syscalls
-
- Linux前提で話を進めます --
- 完全に自分の環境の話ですLinux3.9.7 --
まあ、自分で全部書いたことなんて実はないんだけど、
いろんなところからshellcodeをダウンロードしてきます。//今なら書ける気がする
そうすると必ずint $0x80ってのがあるわけです。x86だと。
これがsyscallなわけですが、eaxにその番号をいれますよね。気になったので。
man syscallより
arch/ABI | instruction | syscall # | retval | Notes |
arm/OABI | swi NR | - | a1 | NR is syscall # |
arm/EABI | swi 0x0 | r7 | r1 | - |
blackfin | excpt 0x0 | P0 | R0 | - |
i386 | int $0x80 | eax | eax | - |
ia64 | break 0x100000 | r15 | r10/r8 | - |
parisc | ble 0x100(%sr2, %r0) | r20 | r28 | - |
sparc/32 | t 0x10 | g1 | o0 | - |
sparc/64 | t 0x6d | g1 | o0 | - |
x86_64 | syscall | rax | rax | - |
で、asm/unistd.hから
- i386ならasm/unistd_32.hの通り
- defined(ILP32)ならasm/unistd_x32.hの通り、但し__X32_SYSCALL_BIT==0x40000000
- else asm/unistd_64.hの通りとなる。(x86_64かな?)
ちなみになじみ深いexecveは,
arch | dec | hex |
32 | 11 | B |
x32 | 1073742344 | 40000208 |
64 | 59 | 3B |
となる。
以上、メモ。