forked from dustinlacewell/true
-
Notifications
You must be signed in to change notification settings - Fork 1
/
true.asm
68 lines (55 loc) · 1.94 KB
/
true.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
; this is especially thanks to:
; http://blog.markloiseau.com/2012/05/tiny-64-bit-elf-executables/
BITS 64
org 0x00400000 ; Program load offset
; 64-bit ELF header
ehdr:
; 1), 0 (ABI ver.)
db 0x7F, "ELF", 2, 1, 1, 0 ; e_ident
times 8 db 0 ; reserved (zeroes)
dw 2 ; e_type: Executable file
dw 0x3e ; e_machine: AMD64
dd 1 ; e_version: current version
dq _start ; e_entry: program entry address (0x78)
dq phdr - $$ ; e_phoff program header offset (0x40)
dq 0 ; e_shoff no section headers
dd 0 ; e_flags no flags
dw ehdrsize ; e_ehsize: ELF header size (0x40)
dw phdrsize ; e_phentsize: program header size (0x38)
dw 1 ; e_phnum: one program header
dw 0 ; e_shentsize
dw 0 ; e_shnum
dw 0 ; e_shstrndx
ehdrsize equ $ - ehdr
; 64-bit ELF program header
phdr:
dd 1 ; p_type: loadable segment
dd 5 ; p_flags read and execute
dq 0 ; p_offset
dq $$ ; p_vaddr: start of the current section
dq $$ ; p_paddr: " "
dq filesize ; p_filesz
dq filesize ; p_memsz
dq 0x200000 ; p_align: 2^11=200000 = section alignment
; program header size
phdrsize equ $ - phdr
; Hello World!/your program here
_start:
; sys_write(stdout, message, length)
; mov rax, 1 ; sys_write
; mov rdi, 1 ; stdout
; mov rsi, message ; message address
; mov rdx, length ; message string length
; syscall
; sys_exit(return_code)
;mov rax, 60 ; sys_exit
;mov rdi, 0 ; return 0 (success)
; even smaller hax thanks to @tiborvass:
mov al, 60 ; sys_exit
cdq ; Sign-extend eax into edi to return 0 (success)
syscall
; message:
; db 'Hello, world!',0x0A ; message and newline
; length: equ $-message ; message length calculation
; File size calculation
filesize equ $ - $$