我试图在各种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)
{
//...
}