预备学习——Linux实践:ELF文件格式分析

一、概述

1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序。ELF文件(目标文件)格式主要有三种:

  • 可重定向文件(Relocatable file):文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件(目标文件或者静态库文件,即Linux通常后缀为.a和.o的文件)。
  • 可执行文件(Executable file):文件保存着一个用来执行的程序(例如bash,gcc等)。
  • 共享目标文件:动态库文件(Linux下后缀为.so的文件)。文件保存着代码和合适的数据(这些数据是在连接时候被连接器ld和运行时动态连接器使用的)。

二、分析ELF文件头(ELF header)

  • 在终端输入cd /usr/include进入include目录后查看elf.h文件,查看ELF的文件头ELF Header的定义。

    (这里以64位的为例,64位和32位的都可以查看到)

    关于其长度信息:
    插入图片elf5.pdf
    可以看到32位与64位的部分长度不同,要根据具体文件具体判断。
  • 写一个小程序并编译,生成hello可执行文件

    使用readelf -a hello命令,得到ELF Header头文件的信息。
  • 通过上图信息,可以得出Elf Header的Size为64bytes,所以可以使用hexdump工具将头文件的16进制表打开。
    使用hexdump -x hello -n 52命令查看hello文件头的16进制表(前52bytes),对格式进行分析。
  • 第一行
    • 对应e_ident[EI_NIDENT]。实际表示内为7f454c46020100010000000000000000,前四个字节7f454c46(0x45,0x4c,0x46是'e','l','f'对应的ascii编码)是一个魔数,表示这是一个ELF对象。
    • 接下来的一个字节02表示是一个64位对象,接下来的一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的都默认为0。
  • 第二行
    • e_type(2字节)值为0003(不确定写得对不对),表示是一个共享目标文件。
    • e_machine(2字节)值为003e(不确定写得对不对),表示是Advanced Micro Devices X86-64架构。
    • e_version(4字节)值为00010000(不确定写得对不对),表示是当前版本。
    • e_entry(8字节)值为1050000000000000(不确定写得对不对),表示入口点地址。
  • 第三行
    • e_phoff(8字节)值为0040000000000000(不确定写得对不对),表示程序头表的偏移地址。
    • e_shoff(8字节)值为3960000000000000不确定写得对不对),表示段表的偏移地址。
  • 第四行
    • e_flags(4字节)值为00000000(不确定写得对不对),表示未知处理器特定标志#define EF_SH_UNKNOWN 0x0。
    • e_ehsize(2字节)值为0040(不确定写得对不对),表示.elf文件头大小为00 40(64个字节)。
    • e_phentsize(2字节)值为0038(不确定写得对不对),表示一个程序头表中的入口的长度。
    • e_phnum(2字节)值为000b(不确定写得对不对),表示程序头表中的入口数目。
    • e_shentsize(2字节)值为0040(64字节)(不确定写得对不对),表示section header table中每个header的大小。
    • e_shnum(2字节)值为001e(不确定写得对不对),表示段表入口有30个(不确定),即段表有13段。
    • e_shstrndx(2字节)值为001d(不确定写得对不对),表示段表字符串在段表中的索引号。为29(不确定)。
      本部分最大的问题是怎么划分哪几位代表什么。经过一番波折找到了64位和32位占字节不一的问题,但是小端法是否反序读,高位0是否省略等问题还是不清楚。参考了多位学长学姐的博客,格式各有不同,最终没有搞明白这一点。我采用的方法是全都没有反序,按照终端显示的顺序来读。

三、通过文件头找到section header table,理解其内容

  • file elf文件的名字显示生成的目标文件hello的类型
  • hello是一个可执行文件,输入ls -l hello查看hello的大小
  • 如上图,hello大小为16608字节。输入hexdump -x hello用16进制的数字显示hello的内容。(其中,第二列是16进制表示的偏移地址)
  • 输入objdump -x hello来显示hello中各个段以及符号表的相关信息。
  • 输入readelf -a hello来查看各个段信息。
    • ELF文件头信息:
    • 段表Section header table:


    • 符号表Symbol table:


四、通过section header table找到各section

在一个ELF文件中有一个section header table,通过它我们可以定位到所有的section,而ELF header中的e_shoff变量就是保存section header table入口对文件头的偏移量。而每个section都会对应一个section header,所以只要在section header table中找到每个section header,就可以通过section header找到你想要的section。
下面以可执行文件hello为例,以保存代码段的section为例来讲解读取某个section的过程。
使用gedit /usr/include/elf.h查看Section header的结构体。


由上面分析可知,section header table中的每个section header所占的size均为64字节,ELF header得到了e_shoff变量的值为0x0000000000006039(不确定对不对),也就是table入口的偏移量,通过看e_shnum的值为0x001e,表示段表入口有30个。
所以从0x0000000000003960(不确定对不对)开始有30个段,每个段占64字节大小,输入hexdump hello查看。

  • 第一个段:全为0,不表示任何段。
  • 第二个段:

    • sh_name(4字节)的值为001b0000表示该段名称在.shstrtab中偏移量,为.inter段。
    • sh_type(4字节)的值为00010000表示这个段拥有程序所定义的信息,其格式和含义完全由该程序确定,这里表示PROGBITS。
    • sh_flags(8字节)的值为0002000000000000表示alloc和execute。
    • sh_addr(8字节)的值为02a8000000000000表示section在内存中的虚拟地址。
    • sh_offset(8字节)的值为02a8000000000000(000002a8)表示section与文件头之间的偏移。
    • sh_size(8字节)的值为001c000000000000表示文件里面section占用的大小。
    • sh_link(4字节)的值为00000000,表示没有链接信息。
    • sh_info(4字节)的值为00000000,表示没有辅助信息。
    • sh_addralign(8字节)的值为0001000000000000,表示字节对齐长度。
    • sh_entsize(8字节)的值为0000000000000000,表示没有入口。
  • 第三个段:

    • 段名:note.ABI-tag
    • 类型:NOTE
    • 标志:(不知道)
    • 相对文件头偏移:000002c4
    • 占用大小:00000020(不确定)
  • 第四个段

    • 段名:.note-gnu.build-i
    • 类型:NOTE
    • 标志:(不知道)
    • 相对文件头偏移:000002e4
    • 占用大小:00000024(不确定)
      ···
      ···
  • 第三十个段:

    • 段名:.shstrtab
    • 类型:STRTAB
    • 标志:(不知道)
    • 相对文件头偏移:00003855
    • 占用大小:00000107

      参考

      博客1
      博客2
      博客3

正式开始

题目链接:
catalyst-system

无能瞎搞

1.预备了这么久真是没想到..一开始下载下来是个文本文件,但是打开是乱码。

用16进制方式打开后发现开头是.ELF,于是去搜索了,并且按照预备知识学习了一下。

向下划发现这里还有很多有趣的东西

还比如flag

用户名和密码

还有这里很像刚才学的.shstrtab,也像flag的格式

2.啥也不会的我使用预备里学到的指令readelf来查看

发现是一个可执行文件。
3.搜索学习了Linux执行可执行文件的方法,先用chmod -x catalyst.txt给执行权限,然后./catalyst.txt执行。

Wow,好酷
4.刚才预备里学了一个objdump是反汇编的命令,尝试一下。

以上我做的这些花里胡哨的东西可以用下图总结

嗯,没有什么用。所以接下来直接寻找write up照着做吧。(顺便这时候我知道了catalyst是催化剂的意思,好浪漫啊。)

IDA启动

值得一提的是,刚刚在执行此文件时很慢,一直卡在“Loading”那里,没有显示出所有我们在16进制中看到的提示字符串“Username:”。
由于以下题解本人还没看懂,暂时止步于此(。。。)(而且已经第四周了。。)

(未完成)catalyst-system WriteUp(2019暑假CTF第一周reverse)的更多相关文章

  1. 欢迎来到地狱 WriteUp(2019暑假CTF第一周misc)

    目录 0707,0708,0709 题目地址:欢迎来到地狱 1.地狱伊始.jpg 1.5地狱之声.wav 2.第二层地狱.docx 3.快到终点了.zip 参考 0707,0708,0709 题目地址 ...

  2. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  3. C语言I—2019秋作业第一周作业

    1.你对软件工程专业或者计算机科学与技术专业了解是怎样? 软件工程专业是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科.它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设 ...

  4. AYIT-2020 609暑假集训第一周周赛题 A - A计划

    可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下 ...

  5. 暑假集训第一周比赛C题

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83146#problem/C C - 学 Crawling in process... C ...

  6. 暑假集训第一周比赛G题

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83146#problem/G G - 向 Crawling in process... C ...

  7. 2019暑假第三周(HDFS和HBase)

    Hadoop的核心是HDFS和MapReduce. 1.分布式文件系统HDFS理论方面的认知学习. 2.HDFS编程实践. 3.分布式数据库HBase.

  8. 暑假CTF训练一

    暑假CTF训练一 围在栅栏中的爱 题目: 最近一直在好奇一个问题,QWE到底等不等于ABC? -.- .. --.- .-.. .-- - ..-. -.-. --.- --. -. ... --- ...

  9. Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解

    Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解 题目地址:https://codingcompetitions.withgoogle.com/kickstar ...

随机推荐

  1. CSS疑难杂症

    1.text-align: center + letter-spacing: 2em 字体不居中 办法:添加text-indent: 2em 2.first-child伪类选择不到元素 办法:确保备选 ...

  2. 【转】java 环境变量:path与classpath区别

    path指示java命令的路径,像javac.java.javaw等: classpath是javac编译器的一个环境变量,它的作用与import.package关键字有关,当你写下improt ja ...

  3. synchronized关键字的使用

    synchronized关键字是java并发编程中常使用的同步锁,用于锁住方法或者代码块,锁代码块时可以是synchronized(this){}.synchronized(Object){}.syn ...

  4. misc_register杂项设备

    include/linux/miscdevice.h 这些字符设备不符合预先确定的字符设备范畴 设备主设备号10 struct miscdevice { int minor; //次设备号(如果设置为 ...

  5. Java 格式化日期、时间

    有三种方法可以格式化日期.时间. 1.使用DateFormat类 获取DateFormat实例: DateFormat.getDateInstance()    只能格式化日期      2019年5 ...

  6. Python学习日记(三十五) Mysql数据库篇 三

    使用Navicate 创建一个连接去使用Mysql的数据库,连接名可以取任意字符但是要有意义 新增一个数据库 填写新数据库名,设置它的字符集和排序规则 新建一个表 增加表中的信息 点击保存再去输入表名 ...

  7. Linux chown命令详解使用格式和方法

    指令名称 : chown 使用权限 : root(一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的文件拥有者,也没有权限可以自己的文件拥有者改设为别人.只有系统 ...

  8. 【HCIA Gauss】学习汇总-数据库管理(事务 权限 审计 OBDC JDBC)-6

    事务控制事务提交 commit事务回滚 rollback savepoint 用于事务设置保存点 ----> savepoint s1 / savepoint s2 rollback to sa ...

  9. Webmin<=1.920 RCE 漏洞复现

    0x00 前言 本来前一阵就想复现来着,但是官网的版本已经更新了,直到今天才发现Docker上有环境,才进行了复现 0x01影响版本 Webmin<=1.920 ​ 0x02 环境搭建 dock ...

  10. requests+unittest+ddt+xlrd+pymysql+BeautifulReport数据驱动

    # ddcapitestpython XXX接口自动化测试 # 一.数据驱动的思路 1.采用requests+unittest+ddt+xlrd+pymysql+BeautifulReport 2.r ...