Skip to content

Instantly share code, notes, and snippets.

@mmarchini
Last active September 25, 2017 20:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mmarchini/47d0a55a07a3004a94f354426b780686 to your computer and use it in GitHub Desktop.
Save mmarchini/47d0a55a07a3004a94f354426b780686 to your computer and use it in GitHub Desktop.
Minimal ELF Shared Library for Linux x64_64, written entirely in assembly
all:
nasm -f bin -o small-raw.so small-raw.asm
chmod +x small-raw.so
; minimal-shared-library.asm
BITS 64
; db = 8
; dd = 16
; dw = 32
; dq = 64
;;;;;;;;;;;;;;
; ELF header ;
;;;;;;;;;;;;;;
ehdr: ; Elf64_Ehdr
db 0x7F, "ELF", 2, 1, 1, 0 ; e_ident
times 8 db 0 ; 8 empty bytes padding
dw 3 ; Elf64_Half e_type
dw 62 ; Elf64_Half e_machine
dd 1 ; Elf64_Word e_version
dq text - $$ ; Elf64_Addr e_entry
dq phdr_load1 - $$ ; Elf64_Off e_phoff
dq snull - $$ ; Elf64_Off e_shoff
dd 0 ; Elf64_Word e_flags
dw ehdrsize ; Elf64_Half e_ehsize
dw phdrsize ; Elf64_Half e_phentsize
dw 3 ; Elf64_Half e_phnum
dw shdrsize ; Elf64_Half e_shentsize
dw 8 ; Elf64_Half e_shnum
dw 7 ; Elf64_Half e_shstrndx
ehdrsize equ $ - ehdr
;;;;;;;;;;;;;;;;;;;;;
; Program headerers ;
;;;;;;;;;;;;;;;;;;;;;
phdr_align equ 0x200000
; OK
phdr_load1: ; Elf64_Phdr
dd 1 ; Elf64_Word p_type
dd 5 ; Elf64_Word p_flags
dq 0 ; Elf64_Off p_offset
dq 0 ; Elf64_Addr p_vaddr
dq 0 ; Elf64_Addr p_paddr
dq dynamic ; Elf64_Xword p_filesz
dq dynamic ; Elf64_Xword p_memsz
dq phdr_align ; Elf64_Xword p_align
phdrsize equ $ - phdr_load1
phdr_load2: ; Elf64_Phdr
dd 1 ; Elf64_Word p_type
dd 6 ; Elf64_Word p_flags
dq dynamic ; Elf64_Off p_offset
dq dynamic + phdr_align ; Elf64_Addr p_vaddr
dq dynamic + phdr_align ; Elf64_Addr p_paddr
dq shstrtab - dynamic ; Elf64_Xword p_filesz
dq shstrtab - dynamic ; Elf64_Xword p_memsz
dq phdr_align ; Elf64_Xword p_align
phdr_dyn1: ; Elf64_Phdr
dd 2 ; Elf64_Word p_type
dd 6 ; Elf64_Word p_flags
dq dynamic ; Elf64_Off p_offset
dq dynamic + phdr_align ; Elf64_Addr p_vaddr
dq dynamic + phdr_align ; Elf64_Addr p_paddr
dq shstrtab - dynamic ; Elf64_Xword p_filesz
dq shstrtab - dynamic ; Elf64_Xword p_memsz
dq 8 ; Elf64_Xword p_align
;;;;;;;;
; Hash ;
;;;;;;;;
hash:
; times 0x2c db 0
dq 0x0600000003
dq 0x0500000004
dq 0x03
dq 0x0
dd 0x00
dd 0x02
dd 0x0
hashsz equ $ - hash
times 0x4 db 0
;;;;;;;;;;
; Dynsym ;
;;;;;;;;;;
dynsym:
; Empty
dd 0 ; Elf64_Word st_name
db 0 ; unsigned char st_info
db 0 ; unsigned char st_other
dw 0 ; Elf64_Half st_shndx
dq 0 ; Elf64_Addr st_value
dq 0 ; Elf64_Xword st_size
dynsyment equ $ - dynsym
; 00000000000001d0 l d .text 0000000000000000 .text
dd 0 ; Elf64_Word st_name
db 3 ; unsigned char st_info
db 0 ; unsigned char st_other
dw 4 ; Elf64_Half st_shndx
dq text ; Elf64_Addr st_value
dq 0 ; Elf64_Xword st_size
; 00000000000001d0 g D .text 0000000000000000 lorem
dd S_lorem - dynstr ; Elf64_Word st_name
db 16 ; unsigned char st_info
db 0 ; unsigned char st_other
dw 4 ; Elf64_Half st_shndx
dq text ; Elf64_Addr st_value
dq 0 ; Elf64_Xword st_size
; 0000000000200288 g D .dynamic 0000000000000000 __bss_start
dd S_bss - dynstr ; Elf64_Word st_name
db 16 ; unsigned char st_info
db 0 ; unsigned char st_other
dw 6 ; Elf64_Half st_shndx
dq phdr_align + shstrtab ; Elf64_Addr st_value
dq 0 ; Elf64_Xword st_size
; 0000000000200288 g D .dynamic 0000000000000000 _edata
dd S_edata - dynstr ; Elf64_Word st_name
db 16 ; unsigned char st_info
db 0 ; unsigned char st_other
dw 6 ; Elf64_Half st_shndx
dq phdr_align + shstrtab ; Elf64_Addr st_value
dq 0 ; Elf64_Xword st_size
; 0000000000200288 g D .dynamic 0000000000000000 _end
dd S_end - dynstr ; Elf64_Word st_name
db 16 ; unsigned char st_info
db 0 ; unsigned char st_other
dw 6 ; Elf64_Half st_shndx
dq phdr_align + shstrtab ; Elf64_Addr st_value
dq 0 ; Elf64_Xword st_size
; times 0x90 db 0
dynsymsz equ $ - dynsym
;;;;;;;;;;
; Dynstr ;
;;;;;;;;;;
dynstr:
db 0
S_lorem:
db "lorem", 0
S_edata:
db "_edata", 0
S_bss:
db "__bss_start", 0
S_end:
db "_end", 0
; times 0x1F db 0
dynstrsz equ $ - dynstr
times 9 db 0
;;;;;;;;
; Text ;
;;;;;;;;
text:
mov eax, 42
ret
textsz equ $ - text
dw 0
;;;;;;;;;;;
; Dynamic ;
;;;;;;;;;;;
eh_frame:
dynamic:
; HASH
dq 4 ; Elf64_Xword d_tag
dq hash ; Elf64_Addr d_ptr
; STRTAB
dq 5 ; Elf64_Xword d_tag
dq dynstr ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; SYMTAB
dq 6 ; Elf64_Xword d_tag
dq dynsym ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; STRSZ
dq 0xa ; Elf64_Xword d_tag
dq dynstrsz ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; SYMENT
dq 0xb ; Elf64_Xword d_tag
dq dynsyment ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; NULL
dq 0 ; Elf64_Xword d_tag
dq 0 ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; 1
dq 0 ; Elf64_Xword d_tag
dq 0 ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; 1
dq 0 ; Elf64_Xword d_tag
dq 0 ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; 1
dq 0 ; Elf64_Xword d_tag
dq 0 ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; 1
dq 0 ; Elf64_Xword d_tag
dq 0 ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; 1
dq 0 ; Elf64_Xword d_tag
dq 0 ; Elf64_Xword/Elf64_Addr d_val/d_ptr (d_un)
; times 0xB0 db 0
dynamicsz equ $ - dynamic
;;;;;;;;;;;;
; shstrtab ;
;;;;;;;;;;;;
shstrtab:
; times 0x3A db 0
db 0
S_shstrtab:
db ".shstrtab", 0
S_hash:
db ".hash", 0
S_dynsym:
db ".dynsym", 0
S_dynstr:
db ".dynstr", 0
S_text:
db ".text", 0
S_eh_frame:
db ".eh_frame", 0
S_dynamic:
db ".dynamic", 0
shstrtabsz equ $ - shstrtab
;;;;;;;;;;;;;;;;;;;;;
; Section headerers ;
;;;;;;;;;;;;;;;;;;;;;
times 0x6 db 0
snull: ; Elf64_Shdr
dd 0 ; Elf64_Word sh_name
dd 0 ; Elf64_Word sh_type
dq 0 ; Elf64_Xword sh_flags
dq 0 ; Elf64_Addr sh_addr
dq 0 ; Elf64_Off sh_offset
dq 0 ; Elf64_Xword sh_size
dd 0 ; Elf64_Word sh_link
dd 0 ; Elf64_Word sh_info
dq 0 ; Elf64_Xword sh_addralign
dq 0 ; Elf64_Xword sh_entsize
shdrsize equ $ - snull
shash: ; Elf64_Shdr
dd S_hash - shstrtab ; Elf64_Word sh_name
dd 5 ; Elf64_Word sh_type
dq 0x2 ; Elf64_Xword sh_flags
dq hash ; Elf64_Addr sh_addr
dq hash ; Elf64_Off sh_offset
dq hashsz ; Elf64_Xword sh_size
dd 2 ; Elf64_Word sh_link
dd 0 ; Elf64_Word sh_info
dq 8 ; Elf64_Xword sh_addralign
dq 4 ; Elf64_Xword sh_entsize
sdynsym: ; Elf64_Shdr
dd S_dynsym - shstrtab ; Elf64_Word sh_name
dd 11 ; Elf64_Word sh_type
dq 0x2 ; Elf64_Xword sh_flags
dq dynsym ; Elf64_Addr sh_addr
dq dynsym ; Elf64_Off sh_offset
dq dynsymsz ; Elf64_Xword sh_size
dd 3 ; Elf64_Word sh_link
dd 2 ; Elf64_Word sh_info ; ???
dq 8 ; Elf64_Xword sh_addralign
dq 0x18 ; Elf64_Xword sh_entsize
sdynstr: ; Elf64_Shdr
dd S_dynstr - shstrtab ; Elf64_Word sh_name
dd 3 ; Elf64_Word sh_type
dq 0x2 ; Elf64_Xword sh_flags
dq dynstr ; Elf64_Addr sh_addr
dq dynstr ; Elf64_Off sh_offset
dq dynstrsz ; Elf64_Xword sh_size
dd 0 ; Elf64_Word sh_link
dd 0 ; Elf64_Word sh_info
dq 1 ; Elf64_Xword sh_addralign
dq 0 ; Elf64_Xword sh_entsize
stext: ; Elf64_Shdr
dd S_text - shstrtab ; Elf64_Word sh_name
dd 1 ; Elf64_Word sh_type
dq 0x6 ; Elf64_Xword sh_flags
dq text ; Elf64_Addr sh_addr
dq text ; Elf64_Off sh_offset
dq textsz ; Elf64_Xword sh_size
dd 0 ; Elf64_Word sh_link
dd 0 ; Elf64_Word sh_info
dq 16 ; Elf64_Xword sh_addralign
dq 0 ; Elf64_Xword sh_entsize
seh_frame: ; Elf64_Shdr
dd S_eh_frame - shstrtab ; Elf64_Word sh_name
dd 1 ; Elf64_Word sh_type
dq 0x2 ; Elf64_Xword sh_flags
dq eh_frame ; Elf64_Addr sh_addr
dq eh_frame ; Elf64_Off sh_offset
dq 0 ; Elf64_Xword sh_size
dd 0 ; Elf64_Word sh_link
dd 0 ; Elf64_Word sh_info
dq 8 ; Elf64_Xword sh_addralign
dq 0 ; Elf64_Xword sh_entsize
sdynamic: ; Elf64_Shdr
dd S_dynamic - shstrtab ; Elf64_Word sh_name
dd 6 ; Elf64_Word sh_type
dq 0x3 ; Elf64_Xword sh_flags
dq phdr_align + dynamic ; Elf64_Addr sh_addr
dq dynamic ; Elf64_Off sh_offset
dq dynamicsz ; Elf64_Xword sh_size
dd 3 ; Elf64_Word sh_link
dd 0 ; Elf64_Word sh_info
dq 8 ; Elf64_Xword sh_addralign
dq 0x10 ; Elf64_Xword sh_entsize
segDynSz equ sdynamic - $
sshstrtab: ; Elf64_Shdr
dd S_shstrtab - shstrtab ; Elf64_Word sh_name
dd 3 ; Elf64_Word sh_type
dq 0 ; Elf64_Xword sh_flags
dq 0 ; Elf64_Addr sh_addr
dq shstrtab ; Elf64_Off sh_offset
dq shstrtabsz ; Elf64_Xword sh_size
dd 0 ; Elf64_Word sh_link
dd 0 ; Elf64_Word sh_info
dq 1 ; Elf64_Xword sh_addralign
dq 0 ; Elf64_Xword sh_entsize
seg1sz equ $ - snull
filesize equ $ - $$
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment