0x00 前言
学习过ELF文件格式之后,为了加深理解就想着自己去解析一遍,文件结构网上有大量的资料,就不多说啦0.0
0x01手动解析
这里编译了带有调试信息的glibc,对于版本的glibc可以去这里下载应版本http://mirrors.ustc.edu.cn/gnu/libc/
编译:
64位:
1 | cd glibc && mkdir build && cd build |
32位:
1 | cd glibc && mkdir build32 && cd build32 |
然后先编写一个简单的HelloWorld
1 | # include<stdio.h> |
然后指定glibc版本编译,这里引用的是我编译好的glibc存放的目录
1 | hello.o: hello.c |
然后再在命令行下指定下LD_LIBRARY_PATH路径(这只是临时的,退出这个shell即失效)
1 | export LD_LIBRARY_PATH=/home/ubuntu/debugGlibc/lib |
然后gdb开始调试运行,这里查看一下进程布局
i proc mappings
进程起始地址为0x400000
那么来手动解析下elf header
对比下readelf
那么再来解析下section header啊
嘛玩意儿?emmmm,别忘了section header并不会加载进内存(手动滑稽)
那敢情好,解析下program header试试
那么手动解析到此,别的字段可以自行试试
0x02 编写简易的ELF解析器
本来想用python或者java写的,但想想指针这个东西某些时候确实方便(手动滑稽)
代码部分参考自https://github.com/finixbit/elf-parser
自己用CMake重新编译了下,然后稍稍修改了一丢丢
当然本身也就是学习为了熟悉下elf结构,所以自己添加了大量的注释说明
这个简易的解析器只实现了解析section header table功能
首先看头文件
1 | // |
再来看获取section的主控函数
1 | #include <iostream> |
CMakelist.txt
1 | cmake_minimum_required(VERSION 3.9) |
运行看看效果
emmm还可以,其他字段的解析类似,只要对着elf的文件结构解析即可
0x03 一点小小的学习笔记
有关mmap函数
https://blog.csdn.net/yangle4695/article/details/52139585
C++ 11的一些新特性