diff --git a/README.md b/README.md index 9211b76..19358ae 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ - [一、基础知识篇](doc/1_basic.md) - [1.1 ctf 介绍](doc/1.1_ctf.md) - - [1.2 打造虚拟机](doc/1.2_vm.md) + - [1.2] - [1.3 Linux基础](doc/1.3_linux_basic.md) - [1.4 Web 安全基础](doc/1.4_web_basic.md) - [1.5 逆向工程基础](doc/1.5_reverse_basic.md) @@ -12,14 +12,20 @@ - [1.5.4 Windows PE](doc/1.5.4_pe.md) - [1.5.5 静态链接](doc/1.5.5_static_link.md) - [1.5.6 动态链接](doc/1.5.6_dynamic_link.md) + - [1.5.7 内存与虚拟内存](doc/1.5.7_memory.md) + - [1.6 密码学基础](doc/1.6_crypto_basic.md) + - [1.7 Android安全基础](doc/1.7_android_basic.md) - [二、工具篇](doc/2_tools.md) - - [2.1 gdb/peda](doc/2.1gdb&peda.md) - - [2.2 ollydbg](doc/2.2_ollydbg.md) - - [2.3 windbg](doc/2.3_windbg.md) - - [2.4 radare2](doc/2.4_radare2.md) - - [2.5 IDA Pro](doc/2.5_idapro.md) - - [2.6 pwntools](doc/2.6_pwntools.md) + - [2.1 VM](doc/2.1_vm.md) + - [2.1 gdb/peda](doc/2.2_gdb&peda.md) + - [2.2 ollydbg](doc/2.3_ollydbg.md) + - [2.3 windbg](doc/2.4_windbg.md) + - [2.4 radare2](doc/2.5_radare2.md) + - [2.5 IDA Pro](doc/2.6_idapro.md) + - [2.6 pwntools](doc/2.7_pwntools.md) + - [2.8 zio](doc/2.8_zio.md) + - [2.9 metasploit](doc/2.9_metasploit.md) - [三、分类专题篇](doc/3_topics.md) - [3.1 Reverse](doc/3.1_reverse.md) @@ -32,6 +38,7 @@ - [四、技巧篇](doc/4_tips.md) - [五、高级篇](doc/5_advanced.md) + - [5.1 Fuzz 测试](doc/5.1_fuzz.md) - [六、附录](doc/6_appendix.md) - [6.1 更多 Linux 工具](doc/6.1_Linuxtools.md) diff --git a/doc/1.3_linux_basic.md b/doc/1.3_linux_basic.md index eb126ce..892e0a9 100644 --- a/doc/1.3_linux_basic.md +++ b/doc/1.3_linux_basic.md @@ -1,6 +1,9 @@ # Linux 基础 -## 常用基础命令 +- [常用基础命令](#command) +- [字节序](#order) + +## 常用基础命令 ```text ls 用来显示目标列表 @@ -27,3 +30,17 @@ nano / vim / emacs 字符终端的文本编辑器 ```text 管道命令符 "|" 将一个命令的标准输出作为另一个命令的标准输入 ``` + + +## 字节序 +目前计算机中采用两种字节存储机制:大端(Big-endian)和小端(Little-endian)。 + +>MSB (Most Significan Bit/Byte):最重要的位或最重要的字节。 +> +>LSB (Least Significan Bit/Byte):最不重要的位或最不重要的字节。 + +Big-endian 规定 MSB 在存储时放在低地址,在传输时放在流的开始;LSB 存储时放在高地址,在传输时放在流的末尾。Little-endian 则相反。常见的 Intel 处理器使用 Little-endian,而 PowerPC 系列处理器则使用 Big-endian,另外 TCP/IP 协议和 Java 虚拟机的字节序也是 Big-endian。 + +例如十六进制整数 0x12345678 存入以 1000H 开始的内存中: + +![](../pic/1.3_byte_order.png) diff --git a/doc/1.5.1_c_basic.md b/doc/1.5.1_c_basic.md index 28da748..e08018e 100644 --- a/doc/1.5.1_c_basic.md +++ b/doc/1.5.1_c_basic.md @@ -1 +1,52 @@ # C 语言基础 + +## 从源代码到可执行文件 +我们以经典著作《The C Programming Language》中的第一个程序 “Hello World” 为例,讲解 Linux 下 GCC 的编译过程。 + +```c +#include +main() +{ + printf("hello, world\n"); +} +``` + +```text +$gcc hello.c +$./a.out +hello world +``` + +以上过程可分为4个步骤:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。 + +![](../pic/1.5.1_compile.png) + +### 预编译 +```text +$gcc -E hello.c -o hello.i +``` + +预编译过程主要处理源代码中以 “#” 开始的预编译指令: +- 将所有的 “#define” 删除,并且展开所有的宏定义。 +- 处理所有条件预编译指令,如 “#if”、“#ifdef”、“#elif”、“#else”、“#endif”。 +- 处理 “#include” 预编译指令,将被包含的文件插入到该预编译指令的位置。注意,该过程递归执行。 +- 删除所有注释。 +- 添加行号和文件名标号。 +- 保留所有的 #pragma 编译器指令。 + +### 编译 +```text +$gcc -S hello.c -o hello.s +``` +编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。 + +### 汇编 +```text +$gcc -c hello.s -o hello.o +或者 +$gcc -c hello.c -o hello.o +``` +汇编器将汇编代码转变成机器可以执行的指令。 + +### 链接 +目标文件需要链接一大堆文件才能得到最终的可执行文件。链接过程主要包括地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定向(Relocation)等。 diff --git a/doc/1.5.7_memory.md b/doc/1.5.7_memory.md new file mode 100644 index 0000000..4cb6b34 --- /dev/null +++ b/doc/1.5.7_memory.md @@ -0,0 +1 @@ +# 内存与虚拟内存 diff --git a/doc/1.6_crypto_basic.md b/doc/1.6_crypto_basic.md new file mode 100644 index 0000000..57dc05f --- /dev/null +++ b/doc/1.6_crypto_basic.md @@ -0,0 +1 @@ +# 密码学基础 diff --git a/doc/1.7_android_basic.md b/doc/1.7_android_basic.md new file mode 100644 index 0000000..2c724cc --- /dev/null +++ b/doc/1.7_android_basic.md @@ -0,0 +1 @@ +# Android 安全基础 diff --git a/doc/1_basic.md b/doc/1_basic.md index 5c6e859..94b6414 100644 --- a/doc/1_basic.md +++ b/doc/1_basic.md @@ -1,7 +1,7 @@ # 第一章 基础知识篇 - [1.1 CTF 介绍](1.1_ctf.md) -- [1.2 打造虚拟机](1.2_vm.md) +- [1.2 打造虚拟机](2.1_vm.md) - [1.3 Linux基础](1.3_linux_basic.md) - [1.5 逆向工程基础](1.5_reverse_basic.md) - [1.5.1 C语言基础](1.5.1_c_basic.md) @@ -10,3 +10,4 @@ - [1.5.4 Windows PE](1.5.4_pe.md) - [1.5.5 静态链接](1.5.5_static_link.md) - [1.5.6 动态链接](1.5.6_dynamic_link.md) + - [1.5.7 内存与虚拟内存](1.5.7_memory.md) diff --git a/doc/1.2_vm.md b/doc/2.1_vm.md similarity index 100% rename from doc/1.2_vm.md rename to doc/2.1_vm.md diff --git a/doc/2.1gdb&peda.md b/doc/2.2_gdb&peda.md similarity index 100% rename from doc/2.1gdb&peda.md rename to doc/2.2_gdb&peda.md diff --git a/doc/2.2_ollydbg.md b/doc/2.3_ollydbg.md similarity index 100% rename from doc/2.2_ollydbg.md rename to doc/2.3_ollydbg.md diff --git a/doc/2.3_windbg.md b/doc/2.4_windbg.md similarity index 100% rename from doc/2.3_windbg.md rename to doc/2.4_windbg.md diff --git a/doc/2.4_radare2.md b/doc/2.5_radare2.md similarity index 100% rename from doc/2.4_radare2.md rename to doc/2.5_radare2.md diff --git a/doc/2.5_idapro.md b/doc/2.6_idapro.md similarity index 77% rename from doc/2.5_idapro.md rename to doc/2.6_idapro.md index b423c99..dabd2aa 100644 --- a/doc/2.5_idapro.md +++ b/doc/2.6_idapro.md @@ -1,6 +1,9 @@ # 2.5 IDA Pro -#### 内存 dump 脚本 +- [内存 dump 脚本](#dump) + + +#### 内存 dump 脚本 调试程序时偶尔会需要 dump 内存,但 IDA Pro 没有直接提供此功能,可以通过脚本来实现。 ```python import idaapi diff --git a/doc/2.6_pwntools.md b/doc/2.7_pwntools.md similarity index 100% rename from doc/2.6_pwntools.md rename to doc/2.7_pwntools.md diff --git a/doc/2.8_zio.md b/doc/2.8_zio.md new file mode 100644 index 0000000..d57e34f --- /dev/null +++ b/doc/2.8_zio.md @@ -0,0 +1 @@ +# Zio diff --git a/doc/2.9_metasploit.md b/doc/2.9_metasploit.md new file mode 100644 index 0000000..6aa60c3 --- /dev/null +++ b/doc/2.9_metasploit.md @@ -0,0 +1 @@ +# MetaSploit diff --git a/doc/2_tools.md b/doc/2_tools.md index c8e7179..6499a2f 100644 --- a/doc/2_tools.md +++ b/doc/2_tools.md @@ -1,8 +1,8 @@ # 第二章 工具篇 -- [2.1 gdb/peda](2.1gdb&peda.md) -- [2.2 ollydbg](2.2_ollydbg.md) -- [2.3 windbg](2.3_windbg.md) -- [2.4 radare2](2.4_radare2.md) -- [2.5 IDA Pro](2.5_idapro.md) -- [2.6 pwntools](2.6_pwntools.md) +- [2.1 gdb/peda](2.2_gdb&peda.md) +- [2.2 ollydbg](2.3_ollydbg.md) +- [2.3 windbg](2.4_windbg.md) +- [2.4 radare2](2.5_radare2.md) +- [2.5 IDA Pro](2.6_idapro.md) +- [2.6 pwntools](2.7_pwntools.md) diff --git a/doc/5.1_fuzz.md b/doc/5.1_fuzz.md new file mode 100644 index 0000000..0ebbd21 --- /dev/null +++ b/doc/5.1_fuzz.md @@ -0,0 +1 @@ +# Fuzz 测试 diff --git a/doc/5_advanced.md b/doc/5_advanced.md index 864d78c..2624c72 100644 --- a/doc/5_advanced.md +++ b/doc/5_advanced.md @@ -1 +1,3 @@ # 第五章 高级篇 + +- [5.1 Fuzz 测试](doc/5.1_fuzz.md) diff --git a/doc/6.1_Linuxtools.md b/doc/6.1_Linuxtools.md index a00c857..e7c7de2 100644 --- a/doc/6.1_Linuxtools.md +++ b/doc/6.1_Linuxtools.md @@ -2,6 +2,7 @@ - [file](#file) - [edb](#edb) +- [ldd](#ldd) - [ltrace](#ltrace) - [md5sum](#md5sum) - [objdump](#objdump) @@ -19,6 +20,10 @@ **edb**是一个同时支持x86、x86-64的调试器。它主要向 OllyDbg 工具看齐,并可通过插件体系进行功能的扩充。 +## ldd +用于打印程序或者库文件所依赖的共享库列表。 + + ## ltrace **ltrace**命令用于跟踪进程调用库函数的情况。 @@ -118,7 +123,7 @@ ssdeep -bm hash.txt modified.elf #### 重要参数 ```text --d --data Only scan the data sections in the file +-a --all Scan the entire file, not just the data section [default] -t --radix={o,d,x} Print the location of the string in base 8, 10 or 16 -e --encoding={s,S,b,l,B,L} Select character size and endianness: s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit diff --git a/pic/1.3_byte_order.png b/pic/1.3_byte_order.png new file mode 100644 index 0000000..666b9a4 Binary files /dev/null and b/pic/1.3_byte_order.png differ diff --git a/pic/1.5.1_compile.png b/pic/1.5.1_compile.png new file mode 100644 index 0000000..83e5ac1 Binary files /dev/null and b/pic/1.5.1_compile.png differ