最小的ELF程序?
来源:互联网 发布:火灾数据2014 编辑:程序博客网 时间:2024/05/18 00:20
1.自己的尝试
试着写了个最小的ELF程序,如下:
my_tiny.c:
/*
* my_tiny.c
* gcc -c -o my_tiny.o my_tiny.c
* 调用exit系统调用,返回退出码42
*/
void start()
{
__asm__("int $0x80"
::"a"(1),"b"(42):);
}
ld链接脚本,my_tiny.lds:
ENTRY(start)
SECTIONS
{
. = 0x08048000 + SIZEOF_HEADERS;
.text : { *(.text) }
/DISCARD/ : { *(.bss) *(.data) *(.rodata) *(.note.GNU-stack) }
/DISCARD/ : { *(.comment) }
}
Makefile:
my_tiny:my_tiny.o
ld -static -T my_tiny.lds -o my_tiny my_tiny.o
strip my_tiny
my_tiny.o:my_tiny.c
gcc -c -o my_tiny.o my_tiny.c
clean:
rm -f my_tiny my_tiny.o
运行看看
Eruda@chobits[tinyt]$ make
gcc -c -o my_tiny.o my_tiny.c
ld -static -T my_tiny.lds -o my_tiny my_tiny.o
strip my_tiny
Eruda@chobits[tinyt]$ ./my_tiny
查看程序运行返回结果
Eruda@chobits[tinyt]$ echo $?
42
看看ELF程序大小:
Eruda@chobits[tinyt]$ wc -c my_tiny
276 my_tiny
276 bytes!这个是正常处理下我能得到小ELF程序了,也没使用什么技巧。
2.他人的作品
我们来看看目前最小的ELF程序是怎么做的:
http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
看到了吗?作者从91 bytes 压缩到 45 bytes 采用了多么 hacking 的手法!真是太极限了!!
3.改造成GNU风格
这里作者借用了nasm中的“古老”功能 -f bin 直接产生二进制文件,着实方便。
可是gnu编译链接工具链中却没有工具能直接将(非正常程序)汇编生成纯二进制码(不加编译链接生成的一些附加段)。
但是我们可以采用一个方法欺骗下gnu编译链接工具,让它帮我们生成“纯”二进制文件。Lets hacking!!
tiny.s:
Makefile:
tiny:tiny.o
ld -e_begin -Ttext=0x1000 --oformat binary -o tiny tiny.o
tiny.o:tiny.s
as -o tiny.o tiny.s
clean:
rm -f tiny.o tiny
欺骗下as,让他把我们的程序的2进制码都放在.text段内
并让ld把.text段生成2进制码
Eruda@chobits[test]$ make
as -o tiny.o tiny.s
ld -e_begin -Ttext=0x1000 --oformat binary -o tiny tiny.o
Eruda@chobits[test]$ ./tiny ;echo $? [:(]
42
Eruda@chobits[test]$ wc -c ./tiny
45 ./tiny
Eruda@chobits[test]$ hexdump -C ./tiny
00000000 7f 45 4c 46 01 00 00 00 00 00 00 00 00 10 00 00 |.ELF............|
00000010 02 00 03 00 20 10 00 00 20 10 00 00 04 00 00 00 |.... ... .......|
00000020 b3 2a 31 c0 40 cd 80 00 34 00 20 00 01 |.*1.@...4. ..|
0000002d
果然是45字节,不知道何时能够再hacking到更小?
---------------------------------------------------------------------------------------------------
[:(]你可能会遇到这样的情况:
Eruda@chobits[test]$ ./tiny
Killed
紧接着selinux报错:SELinux is preventing tiny access to a leaked <Unknown> file descriptor.
解决方法:
Eruda@chobits[test]$ sudo vim /etc/selinux/config
修改"SELINUX=enforcing"为"SELINUX=disabled"
然后手动关闭selinux
Eruda@chobits[test]$ sudo setenforce 0
- 最小的ELF程序?
- 一个最小x86 ELF Hello World程序的诞生
- ELF文件格式与程序的编译链接
- Linux系统ELF程序的执行过程
- 制作最小PE和ELF
- 最小的程序
- MFC的"最小"程序
- 最小的PPC程序
- GObject的最小程序
- 最小的程序“Tinyhelloworld”
- 几个elf加密程序
- ELF程序头分析
- Elf可执行文件,程序加载
- 使用arm-elf-gdb调试SkyEye上运行的程序
- elf 文件格式探秘——程序运行背后的故事
- C生成最小的程序
- C生成最小的程序
- 编写最小的wxWidgets程序
- ●在线直播:3G名家大讲堂,分享企业级和产品级移动应用软件开发
- Android 的电源管理
- tcprewrite的安装和用法
- symbian error stary in program
- 常用JavaScript
- 最小的ELF程序?
- Google提供的项目托管
- WINCE桌面背景字符Microsoft Windows CE v........
- SVN安装手册
- 常用正则表达式
- RedHat QQ 最小化之后消失问题的解决
- vi查看制表符
- 数据库组件 Hxj.Data (十) (输出组件执行的sql)
- QtWidget: 自定义不规则窗体与按钮