cj1128 / cj1128.github.io

👻 My blog
https://cjting.me
17 stars 0 forks source link

编写一个最小的 64 位 Hello World #31

Open cj1128 opened 3 years ago

cj1128 commented 3 years ago

https://cjting.me/2020/12/10/tiny-x64-helloworld/

编写一个最小的 64 位 Hello World

typebrook commented 3 years ago

好棒的分析!佩服你的研究精神 話說我之前一直以為Shebang是由目前所在的Shell去解析的

hcen1997 commented 3 years ago

喜欢介绍debug到每一个字节的文章. 喜欢blog的形式, 喜欢gitalk的hack行为. 这三份喜欢加在一起, internet是一个真实的世界呢

kang8 commented 3 years ago

cool !!!

ThreeZhiWang commented 3 years ago

nb

energygreek commented 3 years ago

nb

hutusi commented 3 years ago

赞赞赞👍

bloatfan commented 3 years ago

赞赞赞👍

hf-hf commented 3 years ago

很有意思,感谢分享

mebtte commented 3 years ago

说明 php 是世界上最好的语言[狗头]

ruanjf commented 3 years ago

ofey404 commented 3 years ago

能感到洋溢出来的开心(

gftao commented 3 years ago

php那个 把 /p 添加env 是不是直接 #!p

fuchengjie commented 3 years ago

好奇你做的啥工作啊,我要毕业了,很好奇大佬些平时咋样的

amanoooo commented 3 years ago

regomne commented 2 years ago

最后汇编部分还可以继续优化,比如

push 1
pop rax
mov rdi, rax
mov rsi, message
push 13
pop rdx
syscall
push 60
pop rax
xor rdi, rdi
syscall

可以再省8个字节

WCY-dt commented 1 year ago

出了 @regomne 所说的部分,还可以:

  1. 把部分 rsirdi 替换为 esiedi
  2. phdr 部分可以向上移动 8 个字节,重复使用一部分空间 最终结果可以优化到 151 个字节,代码如下:

    ; hello_world.asm
    BITS 64
    org 0x400000
    
    ehdr:           ; Elf64_Ehdr
    db 0x7f, "ELF", 2, 1, 1, 0 ; e_ident
    times 8 db 0
    dw  2         ; e_type
    dw  0x3e      ; e_machine
    dd  1         ; e_version
    dq  _start    ; e_entry
    dq  phdr - $$ ; e_phoff
    dq  0         ; e_shoff
    dd  0         ; e_flags
    dw  ehdrsize  ; e_ehsize
    dw  phdrsize  ; e_phentsize
    phdr:           ; Elf64_Phdr
    dd  1         ; e_phnum      ; p_type
                  ; e_shentsize
    dd  5         ; e_shnum      ; p_flags
                  ; e_shstrndx
    ehdrsize  equ  $ - ehdr
    dq  0         ; p_offset
    dq  $$        ; p_vaddr
    dq  $$        ; p_paddr
    dq  filesize  ; p_filesz
    dq  filesize  ; p_memsz
    dq  0x1000    ; p_align
    phdrsize  equ  $ - phdr
    
    _start:
    ; write "hello, world" to stdout
    push 1
    pop rax            ; system call for write
    mov rdi, rax            ; file descriptor for stdout
    mov esi, message    ; pointer to string to write
    push 13
    pop rdx           ; length of string to write
    syscall          ; invoke the system call
    ; exit with status code 0
    push 231
    pop rax      ; system call number for _exit
    xor edi, edi     ; exit status code (0)
    syscall          ; invoke the system call
    
    message: db "hello, world", 10 ; 10 is the ASCII code for newline
    
    filesize  equ  $ - $$
regomne commented 1 year ago

@WCY-dt 出了 @regomne 所说的部分,还可以:

  1. 把部分 rsirdi 替换为 esiedi
  2. phdr 部分可以向上移动 8 个字节,重复使用一部分空间 最终结果可以优化到 151 个字节,代码如下:

    ; hello_world.asm
    BITS 64
    org 0x400000
    
    ehdr:           ; Elf64_Ehdr
    db 0x7f, "ELF", 2, 1, 1, 0 ; e_ident
    times 8 db 0
    dw  2         ; e_type
    dw  0x3e      ; e_machine
    dd  1         ; e_version
    dq  _start    ; e_entry
    dq  phdr - $$ ; e_phoff
    dq  0         ; e_shoff
    dd  0         ; e_flags
    dw  ehdrsize  ; e_ehsize
    dw  phdrsize  ; e_phentsize
    phdr:           ; Elf64_Phdr
    dd  1         ; e_phnum      ; p_type
                ; e_shentsize
    dd  5         ; e_shnum      ; p_flags
                ; e_shstrndx
    ehdrsize  equ  $ - ehdr
    dq  0         ; p_offset
    dq  $$        ; p_vaddr
    dq  $$        ; p_paddr
    dq  filesize  ; p_filesz
    dq  filesize  ; p_memsz
    dq  0x1000    ; p_align
    phdrsize  equ  $ - phdr
    
    _start:
    ; write "hello, world" to stdout
    push 1
    pop rax            ; system call for write
    mov rdi, rax            ; file descriptor for stdout
    mov esi, message    ; pointer to string to write
    push 13
    pop rdx           ; length of string to write
    syscall          ; invoke the system call
    ; exit with status code 0
    push 231
    pop rax      ; system call number for _exit
    xor edi, edi     ; exit status code (0)
    syscall          ; invoke the system call
    
    message: db "hello, world", 10 ; 10 is the ASCII code for newline
    
    filesize  equ  $ - $$

esi那个优化,“程序入口的时候rsi为0”这件事是有什么标准规定了么?如果没有的话建议还是继续用rsi……