Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _GNU_SOURCE
- #include <endian.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/syscall.h>
- #include <sys/types.h>
- #include <unistd.h>
- #ifndef __NR_memfd_secret
- #define __NR_memfd_secret 447
- #endif
- #define BITMASK(bf_off, bf_len) (((1ull << (bf_len)) - 1) << (bf_off))
- #define STORE_BY_BITMASK(type, htobe, addr, val, bf_off, bf_len) \
- *(type*)(addr) = \
- htobe((htobe(*(type*)(addr)) & ~BITMASK((bf_off), (bf_len))) | \
- (((type)(val) << (bf_off)) & BITMASK((bf_off), (bf_len))))
- static long syz_memcpy_off(volatile long a0, volatile long a1, volatile long a2,
- volatile long a3, volatile long a4)
- {
- char* dest = (char*)a0;
- uint32_t dest_off = (uint32_t)a1;
- char* src = (char*)a2;
- uint32_t src_off = (uint32_t)a3;
- size_t n = (size_t)a4;
- return (long)memcpy(dest + dest_off, src + src_off, n);
- }
- uint64_t r[2] = {0xffffffffffffffff, 0x0};
- int main(void)
- {
- syscall(__NR_mmap, /*addr=*/0x1ffff000ul, /*len=*/0x1000ul, /*prot=*/0ul,
- /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/-1,
- /*offset=*/0ul);
- syscall(__NR_mmap, /*addr=*/0x20000000ul, /*len=*/0x1000000ul,
- /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul,
- /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/-1,
- /*offset=*/0ul);
- syscall(__NR_mmap, /*addr=*/0x21000000ul, /*len=*/0x1000ul, /*prot=*/0ul,
- /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/-1,
- /*offset=*/0ul);
- intptr_t res = 0;
- *(uint32_t*)0x20000d80 = 0;
- *(uint32_t*)0x20000d84 = 0x80;
- *(uint8_t*)0x20000d88 = 0;
- *(uint8_t*)0x20000d89 = 0;
- *(uint8_t*)0x20000d8a = 0;
- *(uint8_t*)0x20000d8b = 0;
- *(uint32_t*)0x20000d8c = 0;
- *(uint64_t*)0x20000d90 = 0;
- *(uint64_t*)0x20000d98 = 0;
- *(uint64_t*)0x20000da0 = 8;
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 0, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 1, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 2, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 3, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 4, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 5, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 6, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 7, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 8, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 9, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 10, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 11, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 12, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 13, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 14, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 15, 2);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 17, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 18, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 19, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 20, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 21, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 22, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 23, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 24, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 25, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 26, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 27, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 28, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 29, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 30, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 31, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 32, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 33, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 1, 34, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 35, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 36, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 37, 1);
- STORE_BY_BITMASK(uint64_t, , 0x20000da8, 0, 38, 26);
- *(uint32_t*)0x20000db0 = 0;
- *(uint32_t*)0x20000db4 = 0;
- *(uint64_t*)0x20000db8 = 0;
- *(uint64_t*)0x20000dc0 = 0;
- *(uint64_t*)0x20000dc8 = 0;
- *(uint64_t*)0x20000dd0 = 0;
- *(uint32_t*)0x20000dd8 = 0;
- *(uint32_t*)0x20000ddc = 0;
- *(uint64_t*)0x20000de0 = 0;
- *(uint32_t*)0x20000de8 = 0;
- *(uint16_t*)0x20000dec = 0x46e;
- *(uint16_t*)0x20000dee = 0;
- *(uint32_t*)0x20000df0 = 0;
- *(uint32_t*)0x20000df4 = 0;
- *(uint64_t*)0x20000df8 = 0;
- syscall(__NR_perf_event_open, /*attr=*/0x20000d80ul, /*fd=*/-1, /*cpu=*/0ul,
- /*group=*/-1, /*flags=*/0ul);
- res = syscall(__NR_memfd_secret, /*flags=*/0ul);
- if (res != -1)
- r[0] = res;
- syscall(__NR_ftruncate, /*fd=*/r[0], /*len=*/6ul);
- res = syscall(
- __NR_mmap, /*addr=*/0x20ffc000ul, /*len=*/0x3000ul,
- /*prot=PROT_GROWSUP|PROT_SEM|PROT_WRITE|PROT_READ|0x800000*/ 0x280000bul,
- /*flags=MAP_NORESERVE|MAP_FIXED|MAP_SHARED*/ 0x4011ul, /*fd=*/r[0],
- /*offset=*/0ul);
- if (res != -1)
- r[1] = res;
- *(uint32_t*)0x20000040 = 0;
- syz_memcpy_off(/*ring_ptr=*/r[1], /*flag_off=*/0, /*src=*/0x20000040,
- /*src_off=*/0, /*nbytes=*/4);
- syscall(__NR_mmap, /*addr=*/0x20ae4000ul, /*len=*/0x1000ul,
- /*prot=PROT_GROWSUP|PROT_GROWSDOWN|PROT_SEM|PROT_WRITE*/ 0x300000aul,
- /*flags=MAP_FIXED|MAP_SHARED*/ 0x11ul, /*fd=*/r[0], /*offset=*/0ul);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement