Linux逆向---ELF格式分析之文件头和程序头

在Linux下,可以利用vim编辑器来对编译生成后的可执行程序进行编辑,比如说把75jne指令改成74je指令,这样可以在不重新编译的情况下去修改程序的控制流,这样玩感觉还是很有意思的,不过也仅限于此,所以我借了一本书想要学学逆向。。结果发现这本书真的难啃。。如果只是读它的内容的话很快就读过去了,但是会发现读完之后自己还是什么都不知道,于是我决定慢慢读,并且用例子去对照着看,感觉这样或许会有些效果。

这里我的系统是64位Ubuntu,32位和64位的可执行程序的十六进制表示还是有一些区别的,所以这里有必要说明一下,很显著的一个特征就是32位中用4个字节表示的东西,这里需要用8个字节来进行表示。

1.源代码:

这里为了简单期间,我实现了一个helloworld。。然后用它编译后的程序来进行之后的分析。

hello.c:

#include <stdio.h>
int main()
{
   
    printf("hello world");
    return 0;
}

编译生成hello.out

gcc hello.c -o hello.out

2.文件头

1.查看文件头信息:

readelf -h hello.out

输出:

ELF 头:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  类别:                              ELF64
  数据:                              2 补码,小端序 (little endian)
  版本:                              1 (current)
  OS/ABI:                            UNIX - System V
  ABI 版本:                          0
  类型:                              EXEC (可执行文件)
  系统架构:                          Advanced Micro Devices X86-64
  版本:                              0x1
  入口点地址:               0x400430
  程序头起点:          64 (bytes into file)
  Start of section headers:          6616 (bytes into file)
  标志:             0x0
  本头的大小:       64 (字节)
  程序头大小:       56 (字节)
  Number of program headers:         9
  节头大小:         64 (字节)
  节头数量:         31
  字符串表索引节头: 28

2.查看十六进制格式:

hexedit hello.out

输出

00000000   7F 45 4C 46  02 01 01 00  00 00 00 00  00 00 00 00  .ELF............
00000010   02 00 3E 00  01 00 00 00  30 04 40 00  00 00 00 00  ..>.....0.@.....
00000020   40 00 00 00  00 00 00 00  D8 19 00 00  00 00 00 00  @...............
00000030   00 00 00 00  40 00 38 00  09 00 40 00  1F 00 1C 00  ....@.8...@.....

通过man 5 ELF对ELF手册的查看,可以知道头部可以使用一个结构体表示:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值