linux-syscalls 0.4.0

A library to easily invoke linux system calls.
Documentation
// Syscall registers
// +-------+------+------+------+------+------+------+--------+
// | sysno | arg0 | arg1 | arg2 | arg3 | arg4 | arg5 | return |
// +-------+------+------+------+------+------+------+--------+
// |  eax  | ebx  | ecx  | edx  | esi  | edi  | ebp  |  eax   |
// +-------+------+------+------+------+------+------+--------+
//
// cdecl calling convention (bad)
// +--------+--------+-------------------+
// | return | params | additional params |
// +--------+--------+-------------------+
// |  eax   |        |     stack RTL     |
// +--------+--------+-------------------+
//
// fastcall calling convention
// +--------+----------+-------------------+
// | return |  params  | additional params |
// +--------+----------+-------------------+
// |  eax   | ecx, edx |     stack RTL     |
// +--------+----------+-------------------+
//
// We can use fastcall to populate ecx and edx registers, other parameters will
// be passed on the stack

  .intel_syntax noprefix

  .text

// syscall(sysno)
  .globl linux_syscalls_rs_syscall0
linux_syscalls_rs_syscall0:
  mov  eax, ecx
  int  0x80
  ret

// syscall(arg0, sysno)
  .globl linux_syscalls_rs_syscall1
linux_syscalls_rs_syscall1:
  push ebx
  mov  eax, edx
  mov  ebx, ecx
  int  0x80
  pop  ebx
  ret


// syscall(arg0, sysno)
  .globl linux_syscalls_rs_syscall1_noreturn
linux_syscalls_rs_syscall1_noreturn:
  mov  eax, edx
  mov  ebx, ecx
  int  0x80
  ud2

// syscall(arg1, arg0, sysno)
  .globl linux_syscalls_rs_syscall2
linux_syscalls_rs_syscall2:
  push ebx
  mov  ebx, edx
  mov  eax, [esp+0x8]
  int  0x80
  pop  ebx
  ret  0x4

// syscall(arg1, arg2, arg0, sysno)
  .globl linux_syscalls_rs_syscall3
linux_syscalls_rs_syscall3:
  push ebx
  mov  ebx, [esp+0x8]
  mov  eax, [esp+0xc]
  int  0x80
  pop  ebx
  ret  0x8

// syscall(arg1, arg2, arg0, arg3, sysno)
  .globl linux_syscalls_rs_syscall4
linux_syscalls_rs_syscall4:
  push ebx
  push esi
  mov  ebx, [esp+0xc]
  mov  esi, [esp+0x10]
  mov  eax, [esp+0x14]
  int  0x80
  pop  esi
  pop  ebx
  ret  0xc

// syscall(arg1, arg2, arg0, arg3, arg4, sysno)
  .globl linux_syscalls_rs_syscall5
linux_syscalls_rs_syscall5:
  push ebx
  push edi
  push esi
  mov  ebx, [esp+0x10]
  mov  esi, [esp+0x14]
  mov  edi, [esp+0x18]
  mov  eax, [esp+0x1c]
  int  0x80
  pop  esi
  pop  edi
  pop  ebx
  ret  0x10

// syscall(arg1, arg2, arg0, arg3, arg4, sysno)
  .globl linux_syscalls_rs_syscall6
linux_syscalls_rs_syscall6:
  push ebp
  push ebx
  push edi
  push esi
  mov  ebx, [esp+0x14]
  mov  esi, [esp+0x18]
  mov  edi, [esp+0x1c]
  mov  ebp, [esp+0x20]
  mov  eax, [esp+0x24]
  int  0x80
  pop  esi
  pop  edi
  pop  ebx
  pop  ebp
  ret  0x14


// vsyscall(sysno, callee)
  .globl linux_syscalls_rs_vsyscall0
linux_syscalls_rs_vsyscall0:
  mov  eax, ecx
  call edx
  ret

// vsyscall(arg0, sysno, callee)
  .globl linux_syscalls_rs_vsyscall1
linux_syscalls_rs_vsyscall1:
  push ebx
  mov  eax, edx
  mov  ebx, ecx
  call [esp+0x8]
  pop  ebx
  ret  0x4

// vsyscall(arg1, arg0, sysno, callee)
  .globl linux_syscalls_rs_vsyscall2
linux_syscalls_rs_vsyscall2:
  push ebx
  mov  ebx, edx
  mov  eax, [esp+0x8]
  call [esp+0xc]
  pop  ebx
  ret  0x8

// vsyscall(arg1, arg2, arg0, sysno, callee)
  .globl linux_syscalls_rs_vsyscall3
linux_syscalls_rs_vsyscall3:
  push ebx
  mov  ebx, [esp+0x8]
  mov  eax, [esp+0xc]
  call [esp+0x10]
  pop  ebx
  ret  0xc

// vsyscall(arg1, arg2, arg0, arg3, sysno, callee)
  .globl linux_syscalls_rs_vsyscall4
linux_syscalls_rs_vsyscall4:
  push ebx
  push esi
  mov  ebx, [esp+0xc]
  mov  esi, [esp+0x10]
  mov  eax, [esp+0x14]
  call [esp+0x18]
  pop  esi
  pop  ebx
  ret  0x10

// vsyscall(arg1, arg2, arg0, arg3, arg4, sysno, callee)
  .globl linux_syscalls_rs_vsyscall5
linux_syscalls_rs_vsyscall5:
  push ebx
  push edi
  push esi
  mov  ebx, [esp+0x10]
  mov  esi, [esp+0x14]
  mov  edi, [esp+0x18]
  mov  eax, [esp+0x1c]
  call [esp+0x20]
  pop  esi
  pop  edi
  pop  ebx
  ret  0x14

// vsyscall(arg1, arg2, arg0, arg3, arg4, sysno, callee)
  .globl linux_syscalls_rs_vsyscall6
linux_syscalls_rs_vsyscall6:
  push ebp
  push ebx
  push edi
  push esi
  mov  ebx, [esp+0x14]
  mov  esi, [esp+0x18]
  mov  edi, [esp+0x1c]
  mov  ebp, [esp+0x20]
  mov  eax, [esp+0x24]
  call [esp+0x28]
  pop  esi
  pop  edi
  pop  ebx
  pop  ebp
  ret  0x18