黑客的存在,对于软件世界是什么呢?如果把一个软件构建的环境比作一个世界,那么毫无疑问这个软件的首席工程师就是它的规则秩序者,是这个世界的“主席”。那么编译器或者说程序语言的标准的制定者可以看作是“”天神“一样的存在。然而,有规则的指定者,就会有规则的破坏者。普通的黑客,破坏“人界”的规则,高级的黑客,破坏“天界”的规则。
黑客的一个行为规则就是不走寻常路。一个程序的设计者,设计了一条它认为的应用程序的流程路径,在这个路径上他考虑周到,设计精美,整个程序不会有任何安全故障,不会影响计算机其他数据。然而,这个这个世界偏偏就有人说:“你以为的你以为是你以为吗?”。黑客往往会直接跳过所谓的“正常”思路,直插软件系统的心脏。
黑客通常比软件设计者更了解软件在运行时整体系统运行环境的框架,在程序设计者眼中,一个程序是一个个流程和一条条的逻辑,然而在黑客眼中或许那些都只是0101010的二进制代码。黑客很多时候会直接与二进制代码接触,而不会去过多理会软件设计者配置的逻辑。这篇文章将介绍一些linux系统下直接操作二进制代码的工具。需要提一下的就是,本文对工具的介绍仅仅都是点到为止,有心者看到我这篇文章必然会去深入查询更多信息。
1. readelf
1.1说明
读取elf格式可执行文件的内容,elf为linux系统下基本的可执行程序格式,它广泛应用于各种嵌入式系统中(包括安卓手机)。直接读取elf格式文件中的符号列表等有助于获取程序的内部信息。
1.2 用法举例
下面是一段c语言编写的程序源代码t.c:
void foo() {}
int main(){
foo();
return 0;
}
用gcc编译器编译它:gcc -o t t.c
接着,我们用readelf来查看生成的可执行文件的符号表格:readelf -s t
得到以下结果:
Symbol table '.dynsym' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
Symbol table '.symtab' contains 50 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000400270 0 SECTION LOCAL DEFAULT 1
....
29: 0000000000600e40 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC
2 objdump
2.1说明
这也是个查询2进制代码的工具
2.2 使用举例:objdump -i objfilename
3 objcopy
3.1 说明:
拷贝并对一些2进制文件做部分修改。它有很多参数可以选择,你可以利用这个工具拷贝一个文件并对其中的部分格式或者内容做修改或者仅仅拷贝二进制文件中的部分内容。
3.2 使用举例:objcopy -j section1 in-file out-file
这段代码可以将in-file这个二进制文件中的section1部分剥离出来放到out-file中去。
linux系统自带的直接操作二进制文件的工具还有很多,这里对工具的介绍也点到为止,本文在这里只开一条小门通往另一个世界。windows下直接操作二进制文件的工具需要特别的去找,不过你也可以装一个cygwin(mingw),在windows下也可以运行类linux程序。