Skip to content

Instantly share code, notes, and snippets.

@Theldus
Created April 23, 2020 02:38
Show Gist options
  • Save Theldus/06cd55f4a231972fc48eea117bda691c to your computer and use it in GitHub Desktop.
Save Theldus/06cd55f4a231972fc48eea117bda691c to your computer and use it in GitHub Desktop.
Dynamic library from scratch =)
; ------------------------------
; nasm -f bin -o libs.so libs.S
; ------------------------------
BITS 64
org 0
ADDR equ 0x200000
; Elf header constants
ET_DIN equ 3
; Program header constants
PT_LOAD equ 1
PT_DYNAMIC equ 2
; Section Header constants
SHT_PROGBITS equ 1
SHT_STRTAB equ 3
SHT_DYNAMIC equ 6
SHT_DYNSYM equ 11
; Dynamic Symbol table constants
DT_NULL equ 0
DT_HASH equ 4
DT_STRTAB equ 5
DT_SYMTAB equ 6
DT_STRSZ equ 10
DT_SYMENT equ 11
; Symbol bindings
STB_LOCAL equ 0
STB_GLOBAL equ 1
STB_WEAK equ 2
; Symbol types
STT_FUNC equ 2
STT_SECTION equ 3
; -------------------
; Elf Header
; -------------------
ehdr: ; Elf32_Ehdr
db 0x7F, "ELF", 2, 1, 1, 0 ; e_ident
times 8 db 0
dw ET_DIN ; e_type
dw 0x3e ; e_machine
dd 1 ; e_version
dq func ; e_entry
dq phdr - $$ ; e_phoff
dq shdr - $$ ; e_shoff
dd 0 ; e_flags
dw ehdrsize ; e_ehsize
dw phdr_entry_size ; e_phentsize
dw 3 ; e_phnum
dw shdr_entry_size ; e_shentsize
dw 6 ; e_shnum
dw 1 ; e_shstrndx
ehdrsize equ $ - ehdr
; --------------------
; Program header LOAD
; --------------------
phdr: ; Elf32_Phdr
dd PT_LOAD ; p_type
dd 5 ; p_flags
dq 0 ; p_offset
dq $$ ; p_vaddr
dq $$ ; p_paddr
dq filesize ; p_filesz
dq filesize ; p_memsz
dq 0x1000 ; p_align
phdr_entry_size equ $ - phdr
; -------------------------------
; Program header LOAD
; mainly to make DYNAMIC works =)
; -------------------------------
phdr_load_dyn: ; Elf32_Phdr
dd PT_LOAD ; p_type
dd 6 ; p_flags
dq dynamic_array - $$ ; p_offset
dq dynamic_array + ADDR ; p_vaddr
dq dynamic_array + ADDR ; p_paddr
dq dynamic_array_size ; p_filesz
dq dynamic_array_size ; p_memsz
dq 0x1000 ; p_align
; -----------------------
; Program header DYNAMIC
; -----------------------
phdr_dynamic: ; Elf32_Phdr
dd PT_DYNAMIC ; p_type
dd 6 ; p_flags
dq dynamic_array - $$ ; p_offset
dq dynamic_array + ADDR ; p_vaddr
dq dynamic_array + ADDR ; p_paddr
dq dynamic_array_size ; p_filesz
dq dynamic_array_size ; p_memsz
dq 0x1000 ; p_align
; -----------------
; Section Headers
; -----------------
shdr:
; Nulled section
dd 0 ; sh_name
dd 0 ; sh_type
dq 0 ; sf_flags
dq 0 ; sh_addr
dq 0 ; sh_offset
dq 0 ; sh_size
dd 0 ; sh_link
dd 0 ; sh_info
dq 0 ; sh_addralign
dq 0 ; sh_entsize
shdr_entry_size equ $ - shdr
shdrsize equ $ - shdr
; ----------------------------
; Section Header String Table
; ----------------------------
shdr_strtab:
dd 1 ; sh_name
dd SHT_STRTAB ; sh_type
dq 0 ; sf_flags
dq 0 ; sh_addr
dq shstr_table - $$ ; sh_offset
dq shstr_table_size ; sh_size
dd 0 ; sh_link
dd 0 ; sh_info
dq 0 ; sh_addralign
dq 0 ; sh_entsize
; -----------------------
; Dynamic Symbol Table
; -----------------------
shdr_dynsym:
dd dynsym_str - shstr_table ; sh_name
dd SHT_DYNSYM ; sh_type
dq 2 ; sf_flags
dq symb_tbl - $$ ; sh_addr
dq symb_tbl - $$ ; sh_offset
dq symb_tbl_size ; sh_size
dd 3 ; sh_link
dd 1 ; sh_info
dq 0 ; sh_addralign
dq symb_tbl_entry_size ; sh_entsize
; ----------------------------
; Dynamic Symbol String Table
; ----------------------------
shdr_dynsymstr:
dd dynstr_str - shstr_table ; sh_name
dd SHT_STRTAB ; sh_type
dq 2 ; sf_flags
dq 0 ; sh_addr
dq shstr_table - $$ ; sh_offset
dq shstr_table_size ; sh_size
dd 0 ; sh_link
dd 0 ; sh_info
dq 0 ; sh_addralign
dq 0 ; sh_entsize
; --------------------
; Section Header Text
; --------------------
shdr_text:
dd text_str - shstr_table ; sh_name
dd SHT_PROGBITS ; sh_type
dq 6 ; sf_flags
dq func ; sh_addr
dq func - $$ ; sh_offset
dq shdr_text_size ; sh_size
dd 0 ; sh_link
dd 1 ; sh_info
dq 0 ; sh_addralign
dq 0 ; sh_entsize
; --------------------------
; Section Header Dynamic
; --------------------------
shdr_dynamic:
dd dynamic_str - shstr_table ; sh_name
dd SHT_DYNAMIC ; sh_type
dq 3 ; sf_flags
dq dynamic_array + ADDR ; sh_addr
dq dynamic_array ; sh_offset
dq dynamic_array_size ; sh_size
dd 0 ; sh_link
dd 0 ; sh_info
dq 0 ; sh_addralign
dq 0 ; sh_entsize
; ---------------------
; SH String table
; ---------------------
shstr_table:
db 0
shstrtab_str: db ".shstrtab", 0
text_str: db ".text", 0
dynsym_str: db ".dynsym", 0
dynstr_str: db ".dynstr", 0
dynamic_str: db ".dynamic", 0
func_name_str: db "func", 0
db 0
shstr_table_size equ $ - shstr_table
; -------------------
; Symbol Table
; -------------------
symb_tbl:
; Null symbol, first entry shold be null
dd 0 ; st_name
db 0 ; st_info
db 0 ; st_other
dw 0 ; st_shndx
dq 0 ; st_value
dq 0 ; st_size
symb_tbl_entry_size equ $ - symb_tbl
; Function name
dd func_name_str - shstr_table ; st_name
db (STB_GLOBAL << 4)|STT_FUNC ; st_info
db 0 ; st_other
dw 4 ; st_shndx
dq func ; st_value
dq 0 ; st_size
symb_tbl_size equ $ - symb_tbl
; --------------
; Dynamic Array
; --------------
dynamic_array:
; DT_HASH
dq DT_HASH ; d_tag
dq symb_hash_table ; d_ptr
; DT_STRTAB
dq DT_STRTAB ; d_tag
dq shstr_table ; d_ptr
; DT_SYMTAB
dq DT_SYMTAB ; d_tag
dq symb_tbl ; d_ptr
; DT_STRSZ
dq DT_STRSZ ; d_tag
dq shstr_table_size ; d_val
; DT_SYMENT
dq DT_SYMENT ; d_tag
dq symb_tbl_entry_size ; d_val
; DT_NULL
dq DT_NULL ; d_tag
dq 0 ; d_un
dynamic_array_size equ $ - dynamic_array
; ---------------------
; Symbol Hash Table
; ---------------------
symb_hash_table:
dd 2 ; nbuckets
dd 2 ; nchain
; Bucket list
dd 0, 1
; Chain list
dd 0, 0
symb_hash_tbl_size equ $ - symb_hash_table
;===========================================
; Code goes here xD
;===========================================
func:
mov eax, 42
ret
shdr_text_size equ $ - func
filesize equ $ - $$
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment