129字节的"Hello!"ELF64程序

电脑技术 电脑技术 1820 人阅读 | 4 人回复 | 2021-10-17

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

一般上来说,用普通的汇编编译显示"Hello!"字样的ELF64程序也要最少152字节(通常是216字节,视乎你怎么写代码),但是用以下方式,连文件头也个别定制,就能有机会生成小于152或更低的可执行文件大小。

我的这个是129字节!有人做到108字节,不过无法在我的Debian 11上正确运行。

  1. ORG 0x400000
  2.         
  3. USE64        
  4.         db 0x7F, "ELF"      ; EI_MAG0, EI_MAG1, EI_MAG2, EI_MAG3  
  5.         db 0x02             ; EI_CLASS (2=ELFCLASS64)
  6.         db 0x01             ; EI_DATA (1-ELFDATA2LSB)
  7.         db 0x01             ; EI_VERSION
  8.         db 0x03             ; EI_OSABI
  9.         db 0x00
  10.   @@    db "Hello!",0x0A
  11.   msg_size = $ - @b
  12.         dw 2                ; ET_EXEC               e_type
  13.         dw 0x3E             ;                       e_machine
  14.         dd 1                ;                       e_version
  15.         dq _start - $$ + 0x400000  ;                e_entry
  16.         dq phdr - $$        ;                       e_phoff
  17.         dq 0x00             ;                       e_shoff
  18.         dd 0x00             ;                       e_flags
  19.         dw phdr - $$        ;                       e_ehsize
  20.         dw _start - phdr    ;                       e_phentsize
  21.         dw 0x01             ;                       e_phnum
  22.         ;dw 0x40             ;                       e_shentsize
  23.         ;dw 0x00             ;                       e_shnum
  24.         ;dw 0x00             ;                       e_shstmdx

  25. phdr:
  26.         dd 0x01             ; PT_LOAD               p_type
  27.         dd 0x05             ; PF_X + PF_W + PF_R    p_flags
  28.         dq 0x00             ;                       p_offset
  29.         dq 0x400000         ; 0x400000              p_vaddr
  30.         dq 0x400000         ; 0x400000              p_paddr
  31.         dq _end-_start      ;                       p_filesz
  32.         dq _end-_start      ;                       p_memsz   
  33.         dq 0x100            ;                       p_align            
  34.               
  35. _start:
  36.         ;lea esi, [@b]
  37.         mov esi, 0x400009
  38.         mov dl, msg_size
  39.         mov al, 1         ; sys_write
  40.         ;mov dil, 1       ; STDOUT = 1
  41.         syscall
  42.         mov al, 60        ; sys_exit
  43.         syscall
  44. _end:   
复制代码




回答|共 4 个

simonzhd 发表于 2021-10-17 15:17:46| 字数 27 | 显示全部楼层

作为一个普通的PHP程序猿,表示看不太懂,不明觉厉啊。

孤星1119 发表于 2021-10-17 15:21:54| 字数 149 | 显示全部楼层

simonzhd 发表于 2021-10-17 15:17
作为一个普通的PHP程序猿,表示看不太懂,不明觉厉啊。

不好意思啊,我的兴趣主要在这些领域,因此虽然也会跟着谈论时下流行编程工具,但是我其实不精通Go, Rust, Docker, NoSql,甚至是PHP..... 我想大家只能选其中一个领域专攻和深究。

simonzhd 发表于 2021-10-17 15:25:42| 字数 119 | 显示全部楼层

孤星1119 发表于 2021-10-17 15:21
不好意思啊,我的兴趣主要在这些领域,因此虽然也会跟着谈论时下流行编程工具,但是我其实不精通Go, Rus ...

是的,术业有专攻嘛。不过大家谈谈自己的领域也蛮好啊,可以让大家涨涨见识、开开眼界。

孤星1119 发表于 2021-10-19 17:53:38| 字数 117 | 显示全部楼层

在GitHub同时也找到一位华人的小ELF64程序,它的功用能计算自身MD5.
不过他不是用汇编,而是反编译并用了各种工具才能达到474字节。
据悉这是他们公司内部的比赛。


https://github.com/esrrhs/selfmd5


Screenshot_2021-10-19_17-48-48.png


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐