最小的ELF程序?

部署运行你感兴趣的模型镜像

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

 

 

 

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

### 关于湖南大学计算机 ELF 最小文件实现 ELF(Executable and Linkable Format)是一种常见的二进制文件格式,广泛用于Linux和其他类Unix系统中的可执行文件、目标代码以及共享库。为了创建一个最小化的ELF文件,通常需要了解其基本结构及其头部定义。 #### ELF 文件的基本组成部分 ELF 文件由以下几个主要部分组成: 1. **ELF 头部 (Elf Header)**:描述整个文件的布局和基本信息。 2. **程序头部表 (Program Header Table)**:指定如何加载文件到内存中。 3. **节区头部表 (Section Header Table)**:提供有关文件内部节区的信息。 4. **数据内容**:实际的机器码或其他数据。 在构建最简单的ELF文件时,可以忽略某些不必要的部分,比如节区头部表,从而减少复杂度[^1]。 #### 创建最小ELF 文件的方法 以下是通过手动编写汇编代码来生成一个简单 ELF 可执行文件的例子: ```asm section .text global _start _start: mov eax, 1 ; sys_exit system call number xor ebx, ebx ; exit code 0 int 0x80 ; invoke kernel interrupt ``` 此代码片段表示了一个非常基础的操作——调用 `sys_exit` 系统调用来终止进程。将其保存为 `minimal.asm` 并使用 NASM 和 linker 工具链处理: ```bash nasm -f elf32 minimal.asm -o minimal.o ld -m elf_i386 -o minimal minimal.o ``` 这将生成名为 `minimal` 的最小ELF 可执行文件[^1]。 如果想进一步简化至纯手工制作而不依赖任何高级工具,则可以通过直接写入字节数组的方式完成同样的功能。下面是一个 Python 脚本示例,它能够生成一个仅有退出操作的小型 ELF 文件: ```python import os elf_header = b'\x7fELF' + \ b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \ b'\x00\x00\x00\x00\x00\x00\x00\x00' program_headers = b'' entry_point_offset = len(elf_header) + len(program_headers) code_section = ( b'\xb8\x01\x00\x00\x00' # mov $1,%eax b'\xbb\x00\x00\x00\x00' # mov $0,%ebx b'\xcd\x80' # int $0x80 ) with open('tiny_elf', 'wb') as f: f.write(elf_header) f.write(code_section.ljust(entry_point_offset, b'\x90')) ``` 该脚本利用硬编码形式填充了必要的字段,并设置了入口点地址指向一段简单的 x86 汇编指令序列[^1]。 #### 使用 libbfd 进行分析 当涉及到更复杂的场景时,可能需要用到 GNU Binutils 提供的 BFD 库来进行解析或修改现有的 ELF 文件。例如,运行以下命令可以从源代码重新生成一个新的自定义装载器实例[^2]: ```bash make my_loader ./my_loader a.out ``` 这里假设已经存在合适的 Makefile 来支持这些动作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值