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

版本一:

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

  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来完成了,代码如下
  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吧:)

版本三:

  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如下:

  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能学到更多~

各种小巧的Hello World的更多相关文章

  1. .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB

    今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB.本博客在2013年也介绍过2款.NET平台的开源数据库: 1.[原创]开源.NET下的XML数据库介绍及入门 2.[原创]C#开源 ...

  2. 小巧数据库 Apache Derby 使用攻略

    1. Derby 介绍 将目光放在小 Derby 的原因是纯绿色.轻巧.内存占用小,分分钟在你机子跑起来,自己做点需要连接数据库的代码实践非常方便. 虽然 Mysql 也可以,多一种选择,不是也挺好么 ...

  3. 【转】推荐介绍几款小巧的Web Server程序

    原博地址:http://blog.csdn.net/heiyeshuwu/article/details/1753900 偶然看到几个小巧有趣的Web Server程序,觉得有必要拿来分享一下,让大家 ...

  4. Popmotion – 小巧,灵活的 JavaScript 运动引擎

    Popmotion 是一个只有12KB的 JavaScript 运动引擎,可以用来实现动画,物理效果和输入跟踪.原生的DOM支持:CSS,SVG,SVG路径和DOM属性的支持,开箱即用.Popmoti ...

  5. 六款小巧的HTTP Server[C语言]

    1.micro_httpd - really small HTTP server特点: 支持安全的 .. 上级目录过滤 支持通用的MIME类型 支持简单的目录 支持目录列表 支持使用 index.ht ...

  6. 小巧灵便高效的spx6.0截图三件套(带注册码)

    非常好用截图工具,推荐截图必备,这是三件套完整版本. SPX Instant Screen Capture 是一小巧的屏幕抓图工具,可以抓取选定的区域或整个窗口,可以将抓取的图片发送到剪贴板或 ema ...

  7. 小巧、高效、美观的弹出日历组件 ——lhgcalendar

    http://www.cnblogs.com/lhgstudio/archive/2009/02/13/1390381.html 没法上传附件,请到以上地址下载 下载地址:http://files.c ...

  8. 小巧数据库 Derby 使用攻略

    阅读目录 1. Derby 介绍 2. 稍稍配置下环境变量 3. Derby 操作和 Java 访问 回到顶部 1. Derby 介绍 将目光放在小 Derby 的原因是纯绿色.轻巧.内存占用小,分分 ...

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

    LICEcap 是一款小巧使用的Mac屏幕录制软件,它以GIF格式来录制屏幕内容,用户可以自定帧率和录制范围.这样就能控制生成文件的大小,非常便捷实用哦.点击进入下载 <ignore_js_op ...

  10. Virtual Drive Manager V1.3.2(小巧实用的虚拟光驱)绿色版

    软件名称: Virtual Drive Manager V1.3.2(小巧实用的虚拟光驱)汉化绿色修正版软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 ...

随机推荐

  1. ios8 UITableView设置 setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法

    在ios7中,UITableViewCell左侧会有默认15像素的空白.这时候,设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉. 但是在ios8中,设置setS ...

  2. lua 注释

    1. 单行注释 --  功能等同于C++中的// 2. 多行注释  --[[  注释的内容  ]]   功能等同于C++中的 /**/ 3. 多行注释   --[====[   注释和内容  ]=== ...

  3. 详解 Tomcat 的连接数与线程池(转)

    很不错的文章 https://juejin.im/post/5a0bf917f265da432d27a215

  4. mongodb int字段的一个小坑

    在使用 php mongodb 搜索时,如果字段类型用 int,则使用 php 搜索时一定要把数值转换成整型来搜索,用字符串类型的数字搜索是没有结果的!!!! $condition = ['membe ...

  5. Ajax 分析方法

    我们如何查看到 Ajax 请求: 以 https://m.weibo.cn/u/2830678474 这个网页为例,按 F12,加载网页,然后选择资源类型为 XHR 的就可以看到 Ajax 请求了 我 ...

  6. 微信小程序的wx-charts插件

    还有就是可以使用一些小程序的插件,比如wx-charts. 先来看一下网上对这个插件的评价: 目前在github上有1804颗星,使用的比较广泛. github地址:https://github.co ...

  7. codeforces水题100道 第二十六题 Codeforces Beta Round #95 (Div. 2) A. cAPS lOCK (strings)

    题目链接:http://www.codeforces.com/problemset/problem/131/A题意:字符串大小写转换.C++代码: #include <cstdio> #i ...

  8. 微信JSSDK支付接口-安卓机无法正常调起接口

    今天碰到个问题,是项目调起微信支付接口,苹果机都没有什么问题,但是安卓机的情况就是支付接口出现一下就消失了 试了将error反馈信息弹出来,也就是显示choosewxpay fail 找了半天不知道什 ...

  9. EventHandler 与常见的.Net预定义委托

    看着下面这两句事件定义及激发忽然有点不明白了, public event EventHandler<ExternalDataEventArgs> Submit; Submit(null, ...

  10. 删除SQL注入的一些方法总结

    sql替换法: ); set @myStr='oa_20121026new.bak</title><style>.alx2{position:absolute;clip:rec ...