0xDE5

Trying to solve and expand 0xde5 exercises in assembly (or C)
git clone git://git.mdnr.space/0xDE5
Log | Files | Refs | README | LICENSE

elfer-hello.s (3943B)


      1 # --------------------- CONSTANTS ------------------------- #
      2 
      3 .set SYSCALL_READ, 0
      4 .set SYSCALL_WRITE, 1
      5 .set SYSCALL_OPEN, 2
      6 .set SYSCALL_CLOSE, 3
      7 .set SYSCALL_EXIT, 60
      8 .set SYSCALL_GETRLIMIT, 97
      9 
     10 .set FLAG_O_CREAT_RDWR, 0x42 # O_RDWR | O_CREAT
     11 .set FILE_MODE, 0x1ED # rwxr-xr-x 
     12 
     13 .set STDIN, 0
     14 .set STDOUT, 1
     15 .set STDERR, 2
     16 
     17 .include "./elf-struct.s"
     18 
     19 
     20 # --------------------- DATA ------------------------- #
     21 .data
     22 
     23 file_path:
     24     .asciz "./bin/hello.elf"
     25 
     26 machine_code:
     27     .byte 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00
     28     .byte 0xc7, 0xc7, 0x01, 0x00, 0x00, 0x00
     29     .byte 0xc7, 0xc6, 0xf0, 0x00, 0x60, 0x00
     30     .byte 0xc7, 0xc2, 0x10, 0x00, 0x00, 0x00
     31     .byte 0x0f, 0x05
     32     .byte 0xc7, 0xc7, 0x00, 0x00, 0x00, 0x00
     33     .byte 0xc7, 0xc0, 0x3c, 0x00, 0x00, 0x00
     34     .byte 0x0f, 0x05
     35 machine_code_sz = . - machine_code
     36 
     37 padding_8b:
     38     .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     39 
     40 msg:
     41     .asciz "hello, world\n"
     42 msg_len = . - msg
     43 
     44 
     45 
     46 .bss
     47 ph_array:
     48     .space 2*p_header_size
     49 
     50 # --------------------- CODE ------------------------- #
     51     .global _start
     52 
     53 .text
     54 
     55 _start:
     56 
     57     mov $file_path, %rdi
     58     mov $FLAG_O_CREAT_RDWR, %rsi
     59     mov $FILE_MODE, %rdx
     60     mov $SYSCALL_OPEN, %rax
     61     syscall
     62 
     63     # -------------- ELF header ---------#
     64     lea elf_header, %r8
     65     lea eh_idx_ident(%r8), %r9
     66     movb $0x7F, ei_idx_mag0(%r9)
     67     movb $0x45, ei_idx_mag1(%r9)
     68     movb $0x4C, ei_idx_mag2(%r9)
     69     movb $0x46, ei_idx_mag3(%r9)
     70     movb $ei_val_class_64, ei_idx_class(%r9)
     71     movb $ei_val_data_lsb, ei_idx_data(%r9)
     72     movb $ev_val_current, ei_idx_version(%r9)
     73 
     74     lea eh_idx_type(%r8), %r9
     75     movw $et_val_exec, (%r9)
     76 
     77     lea eh_idx_machine(%r8), %r9
     78     movw $em_val_x8664, (%r9)
     79 
     80     lea eh_idx_version(%r8), %r9
     81     movl $ev_val_current, (%r9)
     82 
     83     lea eh_idx_entry(%r8), %r9
     84     movq $0x4000C0, (%r9)
     85 
     86     lea eh_idx_phoff(%r8), %r9
     87     movq $0x40, (%r9)
     88 
     89     lea eh_idx_ehsize(%r8), %r9
     90     movw $0x40, (%r9)
     91 
     92     lea eh_idx_phentsize(%r8), %r9
     93     movw $0x38, (%r9)
     94 
     95     lea eh_idx_phnum(%r8), %r9
     96     movw $0x2, (%r9)
     97 
     98     # -------- Program header 1: code -------#
     99     lea ph_array, %r8
    100     lea ph_idx_type(%r8), %r9
    101     movl $pt_val_load, (%r9)
    102 
    103     lea ph_idx_flags(%r8), %r9
    104     movl $0x5, (%r9)
    105 
    106     lea ph_idx_vaddr(%r8), %r9
    107     movq $0x400000, (%r9)
    108 
    109     lea ph_idx_filesz(%r8), %r9
    110     movq $0xE8, (%r9)
    111 
    112     lea ph_idx_memsz(%r8), %r9
    113     movq $0xE8, (%r9)
    114 
    115     lea ph_idx_align(%r8), %r9
    116     movq $0x1000, (%r9)
    117 
    118     # -------- Program header 2: read-only data -------#
    119     lea ph_array + p_header_size, %r8
    120     lea ph_idx_type(%r8), %r9
    121     movl $pt_val_load, (%r9)
    122 
    123     lea ph_idx_flags(%r8), %r9
    124     movl $0x4, (%r9)
    125 
    126     lea ph_idx_vaddr(%r8), %r9
    127     movq $0x600000, (%r9)
    128 
    129     lea ph_idx_filesz(%r8), %r9
    130     movq $0x0100, (%r9)
    131 
    132     lea ph_idx_memsz(%r8), %r9
    133     movq $0x0100, (%r9)
    134 
    135     lea ph_idx_align(%r8), %r9
    136     movq $0x1000, (%r9)
    137 
    138     # write elf_header to the file
    139     mov %rax, %rdi
    140     lea elf_header, %rsi
    141     mov $elf_header_size, %rdx
    142     mov $SYSCALL_WRITE, %rax
    143     syscall
    144 
    145     # write program header 1 to the file
    146     lea ph_array, %rsi
    147     mov $p_header_size, %rdx
    148     mov $SYSCALL_WRITE, %rax
    149     syscall
    150 
    151     # write program header 2 to the file
    152     lea ph_array+p_header_size, %rsi
    153     mov $p_header_size, %rdx
    154     mov $SYSCALL_WRITE, %rax
    155     syscall
    156 
    157     # write padding
    158     lea padding_8b, %rsi
    159     mov $8, %rdx
    160     mov $SYSCALL_WRITE, %rax
    161     syscall
    162 
    163     # write padding
    164     lea padding_8b, %rsi
    165     mov $8, %rdx
    166     mov $SYSCALL_WRITE, %rax
    167     syscall
    168 
    169     # write machine code to the file
    170     lea machine_code, %rsi
    171     mov $machine_code_sz, %rdx
    172     mov $SYSCALL_WRITE, %rax
    173     syscall
    174 
    175     # write padding
    176     lea padding_8b, %rsi
    177     mov $8, %rdx
    178     mov $SYSCALL_WRITE, %rax
    179     syscall
    180 
    181     # write msg string to the file
    182     lea msg, %rsi
    183     mov $msg_len, %rdx
    184     mov $SYSCALL_WRITE, %rax
    185     syscall
    186 
    187     xor %rdi, %rdi
    188     mov $SYSCALL_EXIT, %rax
    189     syscall