CTF 竞赛入门指南(CTF All In One)学习(七)

本文是CTF竞赛入门系列的第七篇,主要介绍了ELF文件的类型、结构,包括.text、.data、.rodata和.bss段,并详细解析了ELF文件的头部、程序头、段表、字符串表、符号表和重定位等关键组成部分。通过实例展示了如何查看和理解这些结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


实例

       首先,一个🌰,elfDemo.c

    #include<stdio.h>
    
    int global_init_var = 10;
    int global_uninit_var;
    
    void func(int sum) {
        printf("%d\n", sum);
    }
    
    void main(void) {
        static int local_static_init_var = 20;
        static int local_static_uninit_var;
        int local_init_val = 30;
        int local_uninit_var;
        
        func(global_init_var + local_init_val +
             local_static_init_var );
    }

       依次执行以下命令,将会生成三个文件:

    gcc -m32 -c elfDemo.c -o elfDemo.o
    gcc -m32 elfDemo.c -o elfDemo.out
    gcc -m32 -static elfDemo.c -o elfDemo_static.out

       然后,执行ldd命令打印所依赖的共享库:

    $ ldd elfDemo.out
            linux-gate.so.1 (0xf77b1000)
            libc.so.6 => /usr/lib32/libc.so.6 (0xf7597000)
            /lib/ld-linux.so.2 => /usr/lib/ld-linux.so.2 (0xf77b3000)
    $ ldd elfDemo_static.out
            not a dynamic executable

       可以看到elfDemo_static.out采用了静态链接的方式。
       执行file命令查看相应的文件格式:

    $ file elfDemo.o
    elfDemo.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
    $ file elfDemo.out
    elfDemo.out: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=50036015393a99344897cbf34099256c3793e172, not stripped
    $ file elfDemo_static.out
    elfDemo_static.out: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=276c839c20b4c187e4b486cf96d82a90c40f4dae, not stripped
    $ file -L /usr/lib32/libc.so.6
    /usr/lib32/libc.so.6: ELF 32-bit LSB shared object, Intel 80386, version 1 (GNU/Linux), dynamically linked, interpreter /usr/lib32/ld-linux.so.2, BuildID[sha1]=ee88d1b2aa81f104ab5645d407e190b244203a52, for GNU/Linux 3.2.0, not stripped

ELF 文件类型

       Linux ELF(Executable Linked Format,可执行链接格式)文件有 4 种类型:

  • 可重定位文件(Relocatable File)
    • 包含代码和数据,可与其他目标文件链接成一个可执行文件或共享文件。
    • elfDemo.o
  • 可执行文件(Executable File)
    • 可直接执行的文件。
    • elfDemo_static.out
  • 共享目标文件(Shared Object File)
    • 包含用于链接的代码和数据。
    • 有两种方式,一是链接器将其与可重定位文件和其他共享目标文件链接起来,生成新的目标文件;二是动态链接器将其与可执行文件和其他共享目标文件结合,作为进程映像的一部分。
    • elfDemo.out
    • libc-2.25.so
  • 核心转储文件(Core Dump File)
    • 当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转储到核心转储文件。

       注意:与 Windows 不同,Linux 不以后缀区分文件类型,而是根据文件头的内容来判断。后缀只是便于操作人员自己知道这是什么类型的文件,对文件本身没有意义。因此,可执行文件文件一般没有后缀,是否可执行是权限问题,一般通过ls -l命令看文件属性中是否包含可执行权限(x)
       简化的 ELF 文件结构如下:

在这里插入图片描述
       可以看到代码保存在.text段,已初始化的静态局部变量和已初始化的全局变量保存在.data段,未初始化的静态局部变量和未初始化的全局变量保存在.bss段。

目标文件结构

       使用objdump命令查看elfDemo.o的内部结构:

    $ objdump -h elfDemo.o
    elfDemo.o:     file format elf32-i386
    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
      0 .group        00000008  00000000  00000000  00000034  2**2
                      CONTENTS, READONLY, GROUP, LINK_ONCE_DISCARD
      1 .text         00000078  00000000  00000000  0000003c  2**0
                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
      2 .data         00000008  00000000  00000000  000000b4  2**2
                      CONTENTS, ALLOC, LOAD, DATA
      3 .bss          00000004  00000000  00000000  000000bc  2**2
                      ALLOC
      4 .rodata       00000004  00000000  00000000  000000bc  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA
      5 .text.__x86.get_pc_thunk.ax 00000004  00000000  00000000  000000c0  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
      6 .comment      00000012  00000000  00000000  000000c4  2**0
                      CONTENTS, READONLY
      7 .note.GNU-stack 00000000  00000000  00000000  000000d6  2**0
                      CONTENTS, READONLY
      8 .eh_frame     0000007c  00000000  00000000  000000d8  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

       可以看到,除.text段,.data段和.bss段还有其他段。且.bss段没有CONTENTS属性,表示实际上它并不存在,该段只是为未初始化的全局变量和未初始化的静态局部变量预留位置而已。

.text 段

    $ objdump -x -s -d elfDemo.o
    ......
    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
    ......
      1 .text         00000078  00000000  00000000  0000003c  2**0
                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
    ......
    Contents of section .text:
     0000 5589e553 83ec04e8 fcffffff 05010000  U..S............
     0010 0083ec08 ff75088d 90000000 005289c3  .....u.......R..
     0020 e8fcffff ff83c410 908b5dfc c9c38d4c  ..........]....L
     0030 240483e4 f0ff71fc 5589e551 83ec14e8  $.....q.U..Q....
     0040 fcffffff 05010000 00c745f4 1e000000  ..........E.....
     0050 8b880000 00008b55 f401ca8b 80040000  .......U........
     0060 0001d083 ec0c50e8 fcffffff 83c41090  ......P.........
     0070 8b4dfcc9 8d61fcc3                    .M...a..
    ......
    Disassembly of section .text:
    00000000 <func>:
       0:   55                      push   %ebp
       1:   89 e5                   mov    %esp,%ebp
       3: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值