具有> 5参数的Linux GCC内联ASM系统调用

时间:2017-03-23 01:24:00

标签: linux gcc assembly inline-assembly

我试图在各种Linux系统调用周围创建小的x86 / x64包装器,以避免在libc中调用函数。目标是拥有自包含的shellcode。

我需要使用mmap / mmap2系统调用,但参数多于我知道如何处理。例如,这是我的包装open的代码:

假设ENV32 / ENV64分别为x86 / x64环境设置,__SYS_ [syscall]是rax / eax中的系统调用值。

int sc_open(const char *pathname, int flags, mode_t mode)
{
    int ret;
    asm volatile(
    "" // without this, vim-clang gives me trouble
#ifdef ENV64
    "syscall"
    : "=a"(ret)
    : "0"(__SYS_open), "D"(pathname), "S"(flags), "d"(mode)
    : "cc", "rcx", "r11", "memory"
#else
    "int $0x80"
    : "=a"(ret)
    : "0"(__SYS_open), "b"(pathname), "c"(flags), "d"(mode)
    : "cc", "edi", "esi", "memory"
#endif
    );;
    return ret;
}

理想情况下,我想使用此语法复制mmap2 / mmap系统调用。但是,ebp用作参数。这不仅会对将来使用局部变量(来自ebp的偏移)产生奇怪的影响,而且我甚至不确定这种语法如何使用超过5个参数。

骨架看起来像这样:

void *sc_mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off)
{
    //...
}

0 个答案:

没有答案