gist/elf-crimes/quine/quine.asm

54 lines
1.9 KiB
NASM

; ARM32 ELF quine
; i made an x86 one but that's boring
; also fuck GNU tools i have no idea how to make them work for this
; compile with:
; vasmarm_std -Fbin -a4t -o quine quine.asm
.org 0x20000
ehdr: ; Elf32_Ehdr
.byte 0x7F, "ELF", 1, 1, 1, 0 ; e_ident
.byte 0, 0, 0, 0, 0, 0, 0, 0
.2byte 2 ; e_type - executable
.2byte 40 ; e_machine - EM_ARM
.4byte 1 ; e_version
.4byte _start ; e_entry
.4byte ehdrsize ; e_phoff
.4byte 0 ; e_shoff
.4byte 0x05000200 ; e_flags - (pretend to be eabi5, soft float
; what could possibly go wrong???)
.2byte ehdrsize ; e_ehsize
.2byte phdrsize ; e_phentsize
.2byte 1 ; e_phnum - only 1 program header
.2byte 0 ; e_shentsize - no section headers
.2byte 0 ; e_shnum
.2byte 0 ; e_shstrndx
.set ehdrsize, phdr - ehdr
phdr: ; Elf32_Phdr
.4byte 1 ; p_type - PROGBITS
.4byte 0 ; p_offset - start at the beginning of the ELF
.4byte ehdr ; p_vaddr
.4byte ehdr ; p_paddr
.4byte filesize ; p_filesz - map the whole ELF into memory
.4byte filesize ; p_memsz
.4byte 5 ; p_flags - r-x
.4byte 0x1000 ; p_align - align to page
.set phdrsize, _start - phdr
_start:
mov r7, #4 ; SYS_write
mov r0, #1 ; fd = stdout
mov r1, #ehdr ; buf = start of program memory
mov r2, #filesize ; count = program size
svc 0
mov r7, #1 ; SYS_exit
mov r0, #42 ; status
svc 0
fileend:
.set filesize, fileend - ehdr