在Reddit看到这篇文章:Hello from a libc-free world! ,觉得挺有趣,然后又想起以前看过的各种相关资料,在此做一个整理。注意所有实验环境都为Linux。

版本一:

实际上是用汇编重写_start入口,具体说明请看文章开头提供的连接,汇编代码如下,命名为stubstart.S

[cpp] view plaincopy
  1. _start:
  2. call main
  3. movl $1, %eax
  4. xorl %ebx, %ebx
  5. int $0x80
然后与普通hello.c连接(hello.c)的代码我就不用写出来了吧。。命令如下:
gcc -nostdlib stubstart.S -o hello hello.c
OK,一个不需要libc的helloworld程序就完成了。只是简单的跳过了_start的各种初始化

版本二:

与版本一其实差不多,只是用shellcode来完成了,代码如下
[cpp] view plaincopy
  1. typedef int (*sc_fun)(int,int,int,int,int,int,int);
  2. void _start(void) {
  3. char syscall[] = "/x60/x83/xc4/x24/x58/x5b/x59/x5a/x5e/x5f/x5d/xcd/x80/x83/xec/x40/x61/xc3";
  4. ((sc_fun)syscall)(4, 0, "Hello, World/n", 13, 0, 0, 0);
  5. ((sc_fun)syscall)(1, 0, 0, 0, 0, 0, 0);
  6. }

连接命令如下:
gcc -o nostdlib hello.c -m32 -z execstack –nostdlib
嗯,完成了,也是-nostdlib,至于shellcode调用的是什么系统函数,我猜是write吧:)

版本三:

[cpp] view plaincopy
  1. char *str = "Hello world!/n";
  2. void print()
  3. {
  4. asm( "movl $13, %%edx /n/t"
  5. "movl %0, %%ecx /n/t"
  6. "movl $0, %%ebx /n/t"
  7. "movl $4, %%eax /n/t"
  8. "int $0x80 /n/t"
  9. :: "r"(str):"edx","ecx","ebx");
  10. }
  11. void exit()
  12. {
  13. asm( "movl $42,%ebx /n/t"
  14. "movl $1,%eax /n/t"
  15. "int $0x80 /n/t");
  16. }
  17. void nomain()
  18. {
  19. print();
  20. exit();
  21. }

关于gcc内联汇编,可参考下相关书籍,代码大概意思是nomain()是入口,然后调用print()函数,打印"Hello world”,接着调用exit()函数,结束进程。这里的print函数使用了Linux的WRITE系统调用,exit使用了EXIT系统调用,都是用内联汇编实现。

连接命令如下:

gcc –c hello.c

ld –static –e nomain –o hello hello.o

注意,这里控制了连接器的行为,用-e指定了入口函数为nomain

版本四:

接着版本三,我们用objdump来查看hello,会发现他有四个段:.text .rodata .data .comment。

那么可不可以把他们都合并到一个段里面,该段的属性是可执行,可读的,包含程序的数据和指令? 可以的,此时需要使用ld连接脚本创建脚本hello.lds如下:

[c-sharp] view plaincopy
  1. ENTRY(nomain)
  2. SECTIONS
  3. {
  4. . = 0x804800 + SIZEOF_HEADERS;
  5. tinytext : { *(.text) *(.data) *(.rodata) }
  6. /DISCARD/ : { *(.comment) }
  7. }

这是很简单的连接脚本,就是设置当前位置0x804800 + SIZEOF_HEADERS,后面紧跟着tinytext段,没有其他段了。使用入下命令连接

gcc –c  hello.c

ld –static – T hello.lds –o hello hello.o

OK,一个更小巧的HelloWorld完成了。

版本五:

版本四是最小的了吗?差远了。。。早就有人专门研究过最小的可执行文件了,从ELF文件的各个字节下手。。点这里:Size Is Everything 。。很牛B,很geek的东西。。理论上那就是最小的可执行文件了。

以上各个版本的helloworld大小,自己生成后用wc –c hello看吧:)。再配合objdump能学到更多~

转载于:https://www.cnblogs.com/SZLLQ2000/p/5102228.html

各种小巧的Hello World相关推荐

  1. 小巧的日志记录组件 - 开源研究系列文章

    今天给大家带来一个小巧的日志记录组件LogHelper.这个组件是由Log4Net这个组件的由来而来的,不过只是写入.txt文本文件而已.如果能够对大家的项目有帮助那就更好了. 首先,打开.SLN解决 ...

  2. 清瘦的记录者: 一个比dbutils更小巧、好用的的持久化工具

    https://gitee.com/bitprince/memory 1. 概述 1.1 连接.语句和结果集 从JDBC的规范上看,其对数据访问层有相当简洁的抽象:1.连接(connection) 2 ...

  3. 精心分享7个小巧却强大的电脑端小软件,让人大开眼界!

    分享7个小巧却强大的电脑端小软件 1.PotPlayer PotPlayer是一款非常强大的PC端播放器软件,支持多种媒体格式,启动速度极快,播放稳定,还支持给视频加字幕,设置个性皮肤等. Potpl ...

  4. TaxonKit:小巧、高效、实用的NCBI分类学数据命令行工具

    TaxonKit: 小巧.高效.实用的NCBI分类学数据命令行工具集 宏基因组按:NCBI物种分类注释信息格式复杂,存在层级不整齐.缺失.名称变动等问题,在使用中存在一定困难.最近发现了一款分类信息查 ...

  5. Mac上小巧实用的GIF格式录屏软件 LICEcap

    很多时候,作为程序猿,你将不只是一名程序猿,你得会十八般武艺才能笑傲江湖,东方不败.哈哈!!! 美工有事请假了,我要临时上岗,打开PS,各种截图.产品请假了,或许我得临时给自己套上产品助理的角色,为刚 ...

  6. 微型小乐器 : MicroSynth 小巧而优美

    简 介: 介绍了由 David Levi 的博客中他制作的一款小巧优雅的电子琴.他巧妙的利用了电阻网络形成了指数电压电路,进而产生了准确的音节频率.这样的设计给与我们更多有趣的电路设计技巧.很可惜在其 ...

  7. 可以分屏的软件_分享一款非常好用,且小巧的分屏软件

    首先需要说明的是分屏软件并不是安装上就给你把屏幕分成一块一块从此一个窗口无法全屏显示.而是大部分情况下你依然是全屏显示.但如果你拖动窗口标题栏,就可以快速把他们显示到制定的区域.就像下图动画显示的这样 ...

  8. waves服务器系统盘,Waves 新款小巧化 SoundGrid 服务器 Server One-C 和 Extreme Server-C 公开...

    继超便携的SoundGrid Mobile Server服务器之后,Waves新款机架版Server One-C和Extreme Server-C服务器也终于在官网上可以看到了. 产品名中的" ...

  9. Duktape:一个新的小巧的超精简可嵌入式JavaScript引擎

    Duktape是一个可嵌入的Javascript引擎,主要关注便携性和精简及紧凑性. Duktape很容易集成到C/C++项目: 添加duktape.c和duktape.h到您的build中,并使用D ...

  10. 固态硬盘怎么看出厂日期_闲置的M.2固态硬盘怎么办?做个小巧便携高速的移动固态硬盘吧...

    随着存储技术的升级,很多人都用上了M.2接口的固态硬盘,特别是2018年迎来了集中爆发,存储芯片的价格一降再降,固态硬盘的容量不断攀升.价格不断跳水,让许多人都用上了大容量固态硬盘,毕竟选择更大容量的 ...

最新文章

  1. Mongodb的索引操作
  2. java sftp 实例_JAVA实现SFTP的实例
  3. 图片显示时加水印(不改变原图片)
  4. python key lambda_使用“key”和lambda表达式的python max函数
  5. 结对-结对编项目作业名称-需求分析
  6. mysql中删除某一纵的方法_sql数据库:如何在一个表中填加或者删除一个字段!...
  7. java主流微服务框架_Spring Boot作为当下最流行的微服务开发框架,一名合格的Java开发者一定有所了解,...
  8. python 使用期物处理并发
  9. php命令执行无法重定向输出,PHP标头重定向无法正常工作
  10. bzoj-1079 着色方案(dp)
  11. 优秀雇员必备六大关键技能(2)
  12. VMware虚拟机专用win7系统下载|免费下载虚拟机专用的win7系统
  13. 高颜值:Redis官方可视化工具,功能强大!
  14. 红旗linux桌面版_瑞星ESM杀毒软件For Linux获红旗兼容性认证
  15. sl400升级win10_联想SL400全安装WIN7(官方最完美教程).doc
  16. 计算机管理能看到移动硬盘,我的移动硬盘 在我的电脑和 磁盘管理 中都看不到,只能在设备管理器的磁盘驱动器中能看到,怎么恢復啊...
  17. 新浪云mysql_php连接mysql数据库(新浪云SAE)
  18. 英语和编程到底是什么关系?
  19. 程序员接私活10个月接30单,纯赚40w!
  20. 帮我设计一个软件使用反馈调查问卷 详细

热门文章

  1. ubuntu12.04 qtcreate支持中文输入
  2. JS:ES6-1 let 关键字
  3. JavaScript数据结构——字典(Dictionary)
  4. 【零基础学Java】—继承的概述(十九)
  5. 【Vue2.0】—过滤器(七)
  6. 现在的孩子为什么厌学的那么多?孩子厌学了怎么办?
  7. “一加一减”的两种说话技巧
  8. 电信光猫该怎么同时连接三个路由器?
  9. 手机快充功能到底是充电头的功劳还是线的功劳?
  10. 为什么以前的电视一打雷就容易烧坏,现在的电视就不那么怕雷?