5465 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / linux.h H
// SPDX-License-Identifier: MIT

#include <linux/in.h>
#include <linux/unistd.h>

#define AF_INET     2
#define SOCK_STREAM 2

#define SYSCALL_CLOBBER_LIST \
    "at", "v1", \
    "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", \
    "memory"

static inline long syscall(long n, long arg0, long arg1, long arg2, long arg3) {
    register long v0 asm("v0") = n;
    register long a0 asm("a0") = arg0;
    register long a1 asm("a1") = arg1;
    register long a2 asm("a2") = arg2;
    register long a3 asm("a3") = arg3;

    asm volatile (
        "addu $v0, $zero, %[n]\n"
        "syscall\n"
        : "=&r" (v0),  "+r" (a0), "+r" (a1), "+r" (a2), "+r" (a3)
        : [n] "ir" (n)
        : SYSCALL_CLOBBER_LIST
    );
    return a3 ? -v0 : v0;
}

static inline int socket(int domain, int type, int protocol) {
    return syscall(__NR_socket, domain, type, protocol, 0);
}

static inline int bind(int sockfd, const struct sockaddr_in *addr, int addrlen) {
    return syscall(__NR_bind, sockfd, (long)addr, addrlen, 0);
}

static inline int listen(int sockfd, int backlog) {
    return syscall(__NR_listen, sockfd, backlog, 0, 0);
}

static inline int accept(int sockfd, const struct sockaddr_in *addr, int *addrlen) {
    return syscall(__NR_accept, sockfd, (long)addr, (long)addrlen, 0);
}

static inline int dup2(int oldfd, int newfd) {
    return syscall(__NR_dup2, oldfd, newfd, 0, 0);
}

static inline int execve(const char *path, char* argv[], char* envp[]) {
    return syscall(__NR_execve, (long)path, (long)argv, (long)envp, 0);
}