diff options
author | David Timber <dxdt@dev.snart.me> | 2024-11-14 05:34:57 +0100 |
---|---|---|
committer | David Timber <dxdt@dev.snart.me> | 2024-11-14 05:39:05 +0100 |
commit | 45a2cea350e47cb3d2f36bc6231d5339831f772a (patch) | |
tree | ce6874667a51d6ba99aaa91027e1a3576d3f5a78 /writeups | |
parent | e439d74b7ffaf04b699a96253b03d911cc8a9dec (diff) |
Add writeups/unaligned-mem
Diffstat (limited to 'writeups')
-rw-r--r-- | writeups/unaligned-mem/.gitignore | 3 | ||||
-rw-r--r-- | writeups/unaligned-mem/Makefile | 55 | ||||
-rwxr-xr-x | writeups/unaligned-mem/run-all | 8 | ||||
-rw-r--r-- | writeups/unaligned-mem/unaligned-mem.md | 0 | ||||
-rw-r--r-- | writeups/unaligned-mem/unamem.c | 118 |
5 files changed, 184 insertions, 0 deletions
diff --git a/writeups/unaligned-mem/.gitignore b/writeups/unaligned-mem/.gitignore new file mode 100644 index 0000000..5c3dfdd --- /dev/null +++ b/writeups/unaligned-mem/.gitignore @@ -0,0 +1,3 @@ +/unamem +/unamem-* +/*.core diff --git a/writeups/unaligned-mem/Makefile b/writeups/unaligned-mem/Makefile new file mode 100644 index 0000000..175b46b --- /dev/null +++ b/writeups/unaligned-mem/Makefile @@ -0,0 +1,55 @@ +CC ?= cc +CC_FLAGS = -g -O0 -Wall -Wextra +CC_CMD = $(CC) $(CC_FLAGS) $(CC_EXTRA_CLAGS) +OBJ = \ + unamem \ + unamem-armv4t \ + unamem-armv7 \ + unamem-aarch64 \ + unamem-arc \ + unamem-arceb \ + unamem-i686 \ + unamem-x86_64 \ + unamem-m68k \ + unamem-mips \ + unamem-mpsl \ + unamem-ppc \ + unamem-sh4 + +.PHONY: clean test + +all: $(OBJ) test + +clean: + rm -f $(OBJ) + + +unamem: unamem.c + $(CC_CMD) -o unamem unamem.c +unamem-armv4t: unamem.c + xcomp linux-app armv4t arm-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-armv4t unamem.c +unamem-armv7: unamem.c + xcomp linux-app armv7 arm-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-armv7 unamem.c +unamem-aarch64: unamem.c + xcomp linux-app aarch64 aarch64-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-aarch64 unamem.c +unamem-arc: unamem.c + xcomp linux-app arc arc-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-arc unamem.c +unamem-arceb: unamem.c + xcomp linux-app arceb arceb-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-arceb unamem.c +unamem-i686: unamem.c + xcomp linux-app i686 i686-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-i686 unamem.c +unamem-x86_64: unamem.c + xcomp linux-app x86_64 x86_64-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-x86_64 unamem.c +unamem-m68k: unamem.c + xcomp linux-app m68k m68k-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-m68k unamem.c +unamem-mips: unamem.c + xcomp linux-app mips mips-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-mips unamem.c +unamem-mpsl: unamem.c + xcomp linux-app mpsl mipsel-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-mpsl unamem.c +unamem-ppc: unamem.c + xcomp linux-app ppc powerpc-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-ppc unamem.c +unamem-sh4: unamem.c + xcomp linux-app sh4 sh4-linux-cc $(CC_FLAGS) $(CC_EXTRA_CLAGS) -static -o unamem-sh4 unamem.c + +test: run-all $(OBJ) + ./run-all diff --git a/writeups/unaligned-mem/run-all b/writeups/unaligned-mem/run-all new file mode 100755 index 0000000..85360c7 --- /dev/null +++ b/writeups/unaligned-mem/run-all @@ -0,0 +1,8 @@ +#!/bin/bash +ulimit -c 0 + +for prog in unamem-* +do + echo "==================== $prog ====================" + ./"$prog" +done diff --git a/writeups/unaligned-mem/unaligned-mem.md b/writeups/unaligned-mem/unaligned-mem.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/writeups/unaligned-mem/unaligned-mem.md diff --git a/writeups/unaligned-mem/unamem.c b/writeups/unaligned-mem/unamem.c new file mode 100644 index 0000000..cadfba1 --- /dev/null +++ b/writeups/unaligned-mem/unamem.c @@ -0,0 +1,118 @@ +#define _POSIX_C_SOURCE 200112L +#include <stdio.h> +#include <stdint.h> +#include <limits.h> +#include <error.h> +#include <assert.h> + +#include <unistd.h> +#include <wait.h> + +#define ARGV0 "unamem" +#define DONT_FORK 1 + + +static void report_wait (const int status) { + if (WIFEXITED(status)) { + printf("exit %d\n", WEXITSTATUS(status)); + } + else if (WIFSIGNALED(status)) { + printf("signal %d\n", WTERMSIG(status)); + } + else { + printf("?\n"); + } +} + +int main (void) { + static char m[9]; // bss address is nicer than stack + char *c; + uintptr_t *p; + pid_t pid; + int status; + + printf( + "CHAR_BIT: %d\n" + "word: %zd\n" + "uintptr_t: %zd\n" + "size_t: %zd\n" + "short: %zd\n" + "int: %zd\n" + "long: %zd\n" + "long long: %zd\n" + , + CHAR_BIT, + CHAR_BIT * sizeof(uintptr_t), + sizeof(uintptr_t), + sizeof(size_t), + sizeof(short), + sizeof(int), + sizeof(long), + sizeof(long long)); + + c = m; + p = (void*)(m + 1); + + printf( + "malloc: %zx", (uintptr_t)m); + for (size_t i = sizeof(uintptr_t); i > 1; i /= 2) { + if ((uintptr_t)m % i == 0) { + printf(" {%zu}", i); + } + } + printf("\n"); + + printf( + "c: %zx\n" + "p: %zx\n" + , + (uintptr_t)c, + (uintptr_t)p); + + pid = DONT_FORK ? 0 : fork(); + if (pid > 0) { + printf( + "access: " + ); + wait(&status); + report_wait(status); + } + else if (pid == 0) { + *p = UINTPTR_MAX; + *c = 0; + assert(*p == UINTPTR_MAX); + assert(*c == 0); + + *c = 0; + *p = UINTPTR_MAX; + assert(*p == UINTPTR_MAX); + assert(*c == 0); + } + else { + perror(ARGV0": fork()"); + return 1; + } + + pid = DONT_FORK ? 0 : fork(); + if (pid > 0) { + printf( + "float: " + ); + wait(&status); + report_wait(status); + } + else if (pid == 0) { + volatile float a, b, c; + + a = 0.1; + b = 1.0; + c = b / a; + assert(c > 1.0); + } + else { + perror(ARGV0": fork()"); + return 1; + } + + return 0; +} |