diff --git a/Makefile b/Makefile index 7d9a786..ed2498a 100644 --- a/Makefile +++ b/Makefile @@ -10,8 +10,8 @@ all: build build: build/agent.o ar -crs build/libagent.a build/agent.o -build/%.o: build/%.S - $(CC) $< -c -o $@ +build/%.o: build/%.S syscall/jasmin_syscall.o + $(CC) $< syscall/jasmin_syscall.o -c -o $@ clean: rm build/* 2> /dev/null || true @@ -21,3 +21,6 @@ $(JC): build/%.S: src/%.jazz $(JC) JASMINPATH="Jade=libjade/src/" $(JC) $< -o $@ + +syscall/jasmin_syscall.o: syscall/jasmin_syscall.c syscall/jasmin_syscall.h + $(MAKE) -C syscall diff --git a/syscall/Makefile b/syscall/Makefile new file mode 100644 index 0000000..e985027 --- /dev/null +++ b/syscall/Makefile @@ -0,0 +1,3 @@ +all: jasmin_syscall.o + +jasmin_syscall.o: jasmin_syscall.c jasmin_syscall.h diff --git a/syscall/jasmin_syscall.c b/syscall/jasmin_syscall.c new file mode 100644 index 0000000..7da50ea --- /dev/null +++ b/syscall/jasmin_syscall.c @@ -0,0 +1,145 @@ + +#include "jasmin_syscall.h" + +#if defined(__linux__) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +uint8_t* __jasmin_syscall_randombytes__(uint8_t* _x, uint64_t xlen) +{ + int i; + uint8_t* x = _x; + + printf("%lx:\n", x); + + for (i = 0; i < xlen; i++) + { + printf("%02X", _x[i]); + } + printf("\n"); + + + return _x; +} + +// uint64_t __jasmin_syscall_open__(uint8_t* x, uint64_t xlen) +// { +// uint8_t filename[xlen + 1]; +// memcpy(filename, x, xlen); +// filename[xlen] = 0; +// +// return (uint64_t)open(filename, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); +// } +// +// uint8_t __jasmin_syscall_close__(uint64_t fd) +// { +// int success = close(fd); +// +// if (success == 0) { +// return 1; +// } else { +// return 0; +// } +// } + +uint64_t __jasmin_syscall_open__(uint8_t* x, uint64_t xlen) +{ + uint8_t* mem = (uint8_t*)mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0); + if (mem == NULL) { + puts("mem error"); + exit(1); + } + uintptr_t addr = (uintptr_t)(mem - 4096); + void* futex_mem = mmap((void*)addr, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, 4, 0); + if ((uintptr_t)futex_mem != addr) { + puts("mem error 2"); + exit(1); + } + + return (uint64_t)mem; +} + +// uint8_t* __jasmin_syscall_write__(uint8_t* _x, uint64_t xlen, uint64_t fd) +// { +// size_t i; +// uint8_t* x = _x; +// +// while (xlen > 0) { +// i = write(fd, x, xlen); +// if (i < 1) { +// continue; +// } +// x += i; +// xlen -= i; +// } +// +// return _x; +// } + +uint8_t* __jasmin_syscall_read__(uint8_t* _x, uint64_t xlen, uint64_t fd) +{ + uint32_t* addr = (uint32_t*)(uintptr_t)(fd - 4096); + long ret = syscall(SYS_futex, addr, FUTEX_WAIT, 0x1, NULL, NULL, 0); + if (ret == -1) { + printf("%d\n", errno); + perror("futex"); + } + + return _x; +} + +uint8_t* __jasmin_syscall_write__(uint8_t* _x, uint64_t xlen, uint64_t fd) +{ + uint32_t* addr = (uint32_t*)(uintptr_t)(fd - 4096); + *addr = 1; + syscall(SYS_futex, addr, FUTEX_WAKE, 1, NULL, NULL, 0); + + return _x; +} + +// uint8_t* __jasmin_syscall_read__(uint8_t* _x, uint64_t xlen, uint64_t fd) +// { +// size_t i; +// uint8_t* x = _x; +// +// i = read(fd, x, xlen); +// if (i < 1) { +// // Do something +// perror("Something went wrong while reading the file"); +// } +// x += i; +// xlen -= i; +// +// memset(x, 0, xlen); +// +// return _x; +// } + +#endif + +#if defined(__APPLE__) + +#include + +#if !(defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200) +#error "macOS version not supported (>= 10.12)" +#endif + +uint8_t* __jasmin_syscall_randombytes__(uint8_t* x, uint64_t xlen){ + arc4random_buf(x, xlen); + return x; +} + +#endif diff --git a/syscall/jasmin_syscall.h b/syscall/jasmin_syscall.h new file mode 100644 index 0000000..7391622 --- /dev/null +++ b/syscall/jasmin_syscall.h @@ -0,0 +1,20 @@ +#include +#ifndef JASMIN_SYSCALL +#define JASMIN_SYSCALL +/* FIXME this need xlen to be Uptr */ +uint8_t* __jasmin_syscall_randombytes__(uint8_t* x, uint64_t xlen) +asm("__jasmin_syscall_randombytes__"); + +uint64_t __jasmin_syscall_open__(uint8_t* x, uint64_t xlen) +asm("__jasmin_syscall_open__"); + +uint8_t __jasmin_syscall_close__(uint64_t fd) +asm("__jasmin_syscall_close__"); + +uint8_t* __jasmin_syscall_write__(uint8_t* x, uint64_t xlen, uint64_t fd) +asm("__jasmin_syscall_write__"); + +uint8_t* __jasmin_syscall_read__(uint8_t* x, uint64_t xlen, uint64_t fd) +asm("__jasmin_syscall_read__"); + +#endif diff --git a/syscall/jasmin_syscall.o b/syscall/jasmin_syscall.o new file mode 100644 index 0000000..ef6829f Binary files /dev/null and b/syscall/jasmin_syscall.o differ