在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手册的查看,可以知道头部可以使用一个结构体表示: