Copy Link
Add to Bookmark
Report
2.14 84 byte aarch64 ELF
~ netspooky
I hadn't seen a golfed aarch64 binary so I decided to write one. It works the same as old golfed ELFs in kernels < 5.8. aarch64 instructions are fixed width, which made it a bit more challenging. Shoutout to ixi & the fox.
[: BASE64 POC :]
base64 -d <<< f0VMRuH//xAICIDSEAAAFAIAtwABAAAABAAAAAEAAAAcAAAAAAAAAAAA\
AAAAAAAAAQAAAEAAOAABAADU8v//FwAAAADy//8XAAAAAIIAgNL6//8X > aarch64.elf;
┌ ELF Header ─────┐
┌─────────┬───────────┤ 00: e_ident │
┌─ 00: 7f 45 4c 46 .ELF ─┐ │ │
│ ┌┬────────────────────┤ 04: ei_class │
│ ││ ┌┬─────────────────┤ 05: ei_data │
│ ││ ││ ┌┬──────────────┤ 06: ei_version │
┌ aarch64 Code ─────┐ │ ││ ││ ││ ┌┬───────────┤ 07: ei_osabi │
│ 04: adr x1, #0x0 ├──────────┬─────────┐ │ │ │
│ ; 0x0 is the │ │ 04: e1 ff ff 10 .... │ │ │
│ ; address of │ │ ┌┬────────────────────┤ 08: ei_abivers │
│ ; the string. │ │ ││ ┌──────┬───────────┤ 09: ei_pad │
│ 08: mov x8, #0x40 ├──────────┬─────────┐ │ │ │
│ ; The write │ │ 08: 08 08 80 d2 .... │ │ │
│ ; syscall. │ │ ┌─────────┬───────────┤ 0C: ei_pad │
│ 0C: b 0x40 ├──────────┬─────────┐ │ │ │
│ ; Jump down │ │ 0C: 10 00 00 14 .... │ │ ; EXEC │
│ ; to address │ │ ┌───┬─────────────────┤ 10: e_type │
│ ; 0x4C │ │ │ │ ┌───┬───────────┤ 12: e_machine │
│ │ │ 10: 02 00 b7 00 .... │ │ ; aarch64 │
│ ; This program │ │ ┌─────────┬───────────┤ 14: e_version │
│ ; moves address │ │ 14: 01 00 00 00 .... │ │ │
│ ; 0x00, which is │ │ ┌─────────┬───────────┤ 18: e_entry │
│ ; the ELF's magic │ │ 18: 04 00 00 00 .... │ │ ;100000004 │ ┌ Program Header ─┐
│ ; bytes. │ │ ┌─────────┬────────────────────────────────┤ 1C: p_type │
│ ; │ │ ┌─────────┬───────────┤ 1C: e_entry │ │ ; PT_LOAD │
│ ; It then sets │ │ 1C: 01 00 00 00 .... │ │ │ │ │
│ ; up a write │ │ ┌─────────┬────────────────────────────────┤ 20: p_flags │
│ ; syscall and │ │ ┌─────────┬───────────┤ 20: e_phoff │ │ ; PF_R │
│ ; prints using │ │ 20: 1c 00 00 00 .... │ │ ; 0x1C │ │ │
│ ; file descriptor │ │ ┌─────────┬────────────────────────────────┤ 24: p_offset │
│ ; 0, stdin. │ │ ┌─────────┬───────────┤ 24: e_phoff │ │ ; 0 │
│ ; │ │ 24: 00 00 00 00 .... │ │ │ │ │
│ ; x0 contains the │ │ ┌─────────┬────────────────────────────────┤ 28: p_offset │
│ ; file descriptor │ │ ┌─────────┬───────────┤ 28: e_shoff │ │ │
│ ; and is 0 when │ │ 28: 00 00 00 00 .... │ │ ; 0 │ │ ; 0 │
│ ; initialized. │ │ ┌─────────┬────────────────────────────────┤ 2C: p_vaddr │
│ ; │ │ ┌─────────┬───────────┤ 2C: e_shoff │ │ ;100000000 │
│ ; It prints │ │ 2C: 00 00 00 00 .... │ │ │ │ │
│ ; once and hangs, │ │ ┌─────────┬────────────────────────────────┤ 30: p_vaddr │
│ ; because write │ │ ┌─────────┬───────────┤ 30: e_flags │ │ │
│ ; returns the │ │ 30: 01 00 00 00 .... │ │ ; 1 │ │ │
│ ; number of bytes │ │ ┌─────────┬────────────────────────────────┤ 34: p_paddr │
│ ; written, 4 in │ │ ┌───┬─────────────────┤ 34: e_ehsize │ │ ; junk │
│ ; this case, and │ │ │ │ ┌───┬───────────┤ 36: e_phentsize │ │ │
│ ; tries to write │ │ 34: 40 00 38 00 @.8. │ │ ; 0x38 │ │ │
│ ; again to 4, a │ │ ┌─────────┬────────────────────────────────┤ 38: p_paddr │
│ ; non-existent fd │ │ ┌───┬─────────────────┤ 38: e_phnum │ │ │
│ │ │ │ │ ┌───┬───────────┤ 3A: e_shentsize │ │ │
│ 38: svc #0x0 ├──────────┬─────────┐ │ │ │ │ │
│ ; Call the │ │ 38: 01 00 00 d4 .... │ │ │ │ │
│ ; kernel │ │ ┌─────────┬────────────────────────────────┤ 3C: p_filesz │
│ │ │ ┌───┬─────────────────┤ 3C: e_shnum │ │ ; junk │
│ │ │ │ │ ┌───┬───────────┤ 3E: e_shstrndx │ │ │
│ 3C: b 0x4 ├──────────┬─────────┐ │ │ │ │ │
│ ; Jump back │ │ 3C: f2 ff ff 17 .... │ └─────────────────┘ │ │
│ ; to 0x4 │ │ ┌─────────┬────────────────────────────────┤ 40: p_filesz │
│ │ │ 40: 00 00 00 00 .... │ │ │
│ ; Only works on │ │ ┌─────────┬────────────────────────────────┤ 44: p_memsz │
│ ; kernels < 5.8 │ │ 44: f2 ff ff 17 .... │ │ ; junk │
│ ; See EBM4 for │ │ ┌─────────┬────────────────────────────────┤ 48: p_memsz │
│ ; more info. │ │ 48: 00 00 00 00 .... │ │ │
│ │ │ ┌─────────┬────────────────────────────────┤ 4C: p_align │
│ 4C: mov x2, #0x4 ├──────────┬─────────┐ │ │ ; junk │
│ ; *buf length │ │ 4C: 82 00 80 d2 .... │ │ │
│ │ │ ┌─────────┬────────────────────────────────┤ 50: p_align │
│ 50: b 0x38 ├──────────┬─────────┐ │ │ │
└──── ; Go 2 0x38 ──┘ └─ 50: fa ff ff 17 .... ─┘ └─────────────────┘