最小C程序(264字节), 最小ELF程序(45字节)

极小C程序

tiny.c:

void  start()
{
 __asm__(
" movl $1,  %eax;\n\t "
     
   " movl $42, %ebx;\n\t "
    
   " int $0x80 " );
}

 

ld链接脚本,tiny.lds:

ENTRY(start)
SECTIONS
{
         . 
=   0x08048000   +  SIZEOF_HEADERS;
        
t  : {  * (.text) }
         
/ DISCARD /  : {  * (.bss)  * (.data)  * (.rodata)  * (.note.GNU - stack) }
         
/ DISCARD /  : {  * (.comment) }
}


 t 段名更短,  /DISCARD/ 丢弃不需要的段。

 

Makefile:

tiny:tiny.o
   ld 
- static   - - T tiny.lds  - o tiny tiny.o
   strip tiny
 
tiny.o:tiny.c 
   gcc 
- fomit - frame - pointer  - - o tiny.o tiny.c
 
clean:
   rm 
- f tiny tiny.o


-fomit-frame-pointer 可以省略掉 ebp 操作。

 

$objdump -d tiny

tiny:     file format elf32 -i386

Disassembly of section t:

08048074   < t > :
 
8048074 :       b8  01   00   00   00           mov    $ 0x1 , % eax
 
8048079 :       bb 2a  00   00   00           mov    $ 0x2a , % ebx
 804807e:       cd 
80                     int     $ 0x80
 
8048080 :       c3                      ret    


shell执行

$make clean;make
$. / tiny
$echo $ ?
42
$wc  - c tiny
       264 tiny

 


极小ELF程序

 来至:http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

tiny.asm

ExpandedBlockStart.gif 代码
BITS  32  
    org     
0x08048000  
    db      
0x7F " ELF "              ; e_ident
    dd      
1                                        ; p_type
    dd      
0                                        ; p_offset
    dd      $$                                      ; p_vaddr 
    dw      
2                        ; e_type        ; p_paddr
    dw      
3                        ; e_machine
    dd      _start                  ; e_version     ; p_filesz
    dd      _start                  ; e_entry       ; p_memsz
    dd      
4                        ; e_phoff       ; p_flags
_start:
    mov     bl, 
42                   ; e_shoff       ; p_align
    xor     eax, eax
    inc     eax                     ; e_flags
    
int       0x80
    db      
0
    dw      
0x34                     ; e_ehsize
    dw      
0x20                     ; e_phentsize
    db      
1                        ; e_phnum
                 ; e_shentsize
                 ; e_shnum
                 ; e_shstrndx

    filesize      equ     $ 
-  $$



标准ELF头部就有52字节, 这个ELF其实是不标准的,只是可以运行(readelf, objdump, gdb都不能识别这个程序)。 

 

shell

  $ nasm  - f bin  - o tiny tiny.asm
  $ chmod  + x tiny
  $ . / tiny ; echo $ ?
  
42
  $ wc  - c tiny
       
45  tiny


 

 

 

转载于:https://www.cnblogs.com/napoleon_liu/archive/2010/10/29/1864578.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值