Instantly share code, notes, and snippets.
-
Save mmarchini/47d0a55a07a3004a94f354426b780686 to your computer and use it in GitHub Desktop.
Minimal ELF Shared Library for Linux x64_64, written entirely in assembly
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
all: | |
nasm -f bin -o small-raw.so small-raw.asm | |
chmod +x small-raw.so |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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