刚从第一章开始看,emmm总体来说就是先认识了解:file、ldd、nm、objdump等这些命令的使用,社畜师傅也说了,主要用到的还是file和ldd这两歌命令
首先拿到一个PWN程序,可以先使用file命令来判断是32位还是64位。
l dd结果分为三列,第一列:程序依赖库的名字;第二列:系统提供库的名字;第三列:库加载的开始地址。而在pwn中可以多次用ldd命令查看,来判断该程序是否提供了ASLR保护
后面的话还看了一些汇编的命令
机械码的16进制代表的就是汇编代码,然后汇编代码可以约等于c语言代码。
还有gcc,我上网查了一些资料:
1.1 预处理(Pre-Processing)
这个阶段主要处理源文件中的#indef、#include和#define预处理命令;
这里主要是把一些include的头文件和一些宏定义,放到源文件中。
- 输入的是C语言的源文件
- 输出 :生成一个中间/预加载文件 *.i(以 .i 结尾的文件)
- 这个阶段对应的gcc命令如下:
- #gcc –E(预处理) test.c(源文件) -o test.i(将结果生成的文件)
- 说明:它通过对源文件test.c使用E选项来生成中间文件test.i
1.2 汇编(Assembling)
- 输入:中间文件*.i
- 输出:编译后生成汇编编语言文件*.s
- 这个阶段对应的gcc命令如下:
- #gcc -S(汇编) test.i -o test.s(汇编编语言文件)
- 说明:它通过对源文件test.c使用S选项来生成汇编文件test.s
1.3 编译(Compiling)
- 输入文件:汇编文件*.s
- 输出文件:二进制机器代码*.o
- 这个阶段对应的gcc命令如下:
- #gcc -c(编译) test.s -o test.o
* gcc -c
在功能上,预处理、编译、汇编是3个不同的阶段
但gcc在实际操作时可以把这3个步骤合并为一个步骤来执行,即使用 -c选项:
- 输入文件:源码*.c文件
- 输出文件:二进制机器代码*.o
- 这个阶段对应的gcc命令如下:
# gcc –c test.c -o test.o
// -o指定了output_filename
或 :
#gcc -c test.c
//省略-o output_filename
//默认输出为test.o
//与源文件同名,后缀为.o
1.4 链接(Linking)
- 输入文件:二进制机器码*.o文件
- 输出文件:与其它的机器代码和库文件汇集成一个可执行的二进制代码文件(无后缀)
- 这个阶段对应的gcc命令如下:
- #gcc (没有选项符号) test.o example.o -o test