编辑推荐
本书首先讲解了UNIX Linux中分析目标文件的实用工具和ELF二进制格式的相关内容,随后介绍了进程追踪、各种不同类型的Linux和UNIX病毒,以及如何使用ELF病毒技术进行处理。本书的后半部分介绍了如何使用Kprobe工具进行内核破解、代码修补和调试,如何检测并处理内核模式的rootkit,以及如何分析静态代码;对复杂的用户级内存感染分析进行了相关讲解。本书将带领读者探索甚至连一些专家都未曾接触的领域,正式进入计算机黑客世界。本书读者对象如果你是一名软件工程师或者逆向工程师,想要学习Linux二进制分析相关的内容,本书实为明智之选。本书提供了在安全、取证和杀毒领域中实施二进制分析的解决方案。本书也适合安全爱好者和系统工程师阅读。为了更好地理解本书内容,读者需要具备一定的C语言编程基础和Linux命令行知识。本书内容ELF二进制格式的内部工作原理;UNIX病毒感染和分析的相关技术;二进制加固和软件防篡改技术;修补可执行文件和进程内存;绕过恶意软件中的反调试;二进制取证分析技术;用C语言设计ELF相关的工具;如何使用ptrace操作内存。本书源码可通过www.epubit.com.cn book details 4696下载。
内容简介
二进制分析属于信息安全业界逆向工程中的一种技术,通过利用可执行的机器代码(二进制)来分析应用程序的控制结构和运行方式,有助于信息安全从业人员更好地分析各种漏洞、病毒以及恶意软件,从而找到相应的解决方案。《Linux二进制分析》是一本剖析Linux ELF工作机制的图书,共分为9章,其内容涵盖了Linux环境和相关工具、ELF二进制格式、Linux进程追踪、ELF病毒技术、Linux二进制保护、Linux中的ELF二进制取证分析、进程内存取证分析、扩展核心文件快照技术、Linux proc kcore分析等。《Linux二进制分析》适合具有一定的Linux操作知识,且了解C语言编程技巧的信息安全从业人员阅读。
作者简介
Ryan O'Neill(ELF大师)是一名计算机安全研究员兼软件工程师,具有逆向工程、软件开发、安全防御和取证分析技术方面的背景。他是在计算机黑客亚文化的世界中成长起来的——那个由EFnet、BBS系统以及系统可执行栈上的远程缓冲区溢出组成的世界。他在年轻时就接触了系统安全、开发和病毒编写等领域。他对计算机黑客的极大热情如今已经演变成了对软件开发和专业安全研究的热爱。Ryan在DEFCON和RuxCon等很多计算机安全会议上发表过演讲,还举办了一个为期两天的ELF二进制黑客研讨会。他的职业生涯非常成功,曾就职于Pikewerks、Leviathan安全集团这样的大公司,最近在Backtrace担任软件工程师。Ryan还未出版过其他图书,不过他在Phrack和VXHeaven这样的在线期刊上发表的论文让他声名远扬。还有许多其他的作品可以从他的网站(http: www.bitlackeys.org)上找到。
目录
- 第1章 Linux环境和相关工具1
- 1.1 Linux工具1
- 1.1.1 GDB2
- 1.1.2 GNU binutils中的objdump2
- 1.1.3 GNU binutils中的objcopy3
- 1.1.4 strace3
- 1.1.5 ltrace4
- 1.1.6 基本的ltrace命令4
- 1.1.7 ftrace4
- 1.1.8 readelf4
- 1.1.9 ERESI——ELF反编译系统接口5
- 1.2 有用的设备和文件6
- 1.2.1 proc maps6
- 1.2.2 proc kcore6
- 1.2.3 boot System.map6
- 1.2.4 proc kallsyms7
- 1.2.5 proc iomem7
- 1.2.6 ECFS7
- 1.3 链接器相关环境指针7
- 1.3.1 LD_PRELOAD环境变量8
- 1.3.2 LD_SHOW_AUXV环境变量8
- 1.3.3 链接器脚本9
- 1.4 总结10
- 第2章 ELF二进制格式11
- 2.1 ELF文件类型12
- 2.2 ELF程序头14
- 2.2.1 PT_LOAD14
- 2.2.2 PT_DYNAMIC——动态段的Phdr15
- 2.2.3 PT_NOTE17
- 2.2.4 PT_INTERP17
- 2.2.5 PT_PHDR17
- 2.3 ELF节头18
- 2.3.1 .text节20
- 2.3.2 .rodata节20
- 2.3.3 .plt节21
- 2.3.4 .data节21
- 2.3.5 .bss节21
- 2.3.6 .got.plt节21
- 2.3.7 .dynsym节21
- 2.3.8 .dynstr节22
- 2.3.9 .rel.*节22
- 2.3.10 .hash节22
- 2.3.11 .symtab节22
- 2.3.12 .strtab节23
- 2.3.13 .shstrtab节23
- 2.3.14 .ctors和.dtors节23
- 2.4 ELF符号27
- 2.4.1 st_name28
- 2.4.2 st_value28
- 2.4.3 st_size28
- 2.4.4 st_other28
- 2.4.5 st_shndx29
- 2.4.6 st_info29
- 2.5 ELF重定位34
- 2.6 ELF动态链接43
- 2.6.1 辅助向量44
- 2.6.2 了解PLT GOT46
- 2.6.3 重温动态段49
- 2.7 编码一个ELF解析器52
- 2.8 总结55
- 第3章 Linux进程追踪57
- 3.1 ptrace的重要性57
- 3.2 ptrace请求58
- 3.3 进程寄存器状态和标记60
- 3.4 基于ptrace的调试器示例61
- 3.5 ptrace调试器67
- 3.6 高级函数追踪软件75
- 3.7 ptrace和取证分析75
- 3.8 进程镜像重建77
- 3.8.1 重建进程到可执行文件的挑战78
- 3.8.2 重建可执行文件的挑战78
- 3.8.3 添加节头表79
- 3.8.4 重建过程算法79
- 3.8.5 在32位测试环境中使用Quenya重建进程81
- 3.9 使用ptrace进行代码注入83
- 3.10 简单的例子演示复杂的过程91
- 3.11 code_inject工具演示92
- 3.12 ptrace反调试技巧92
- 3.13 总结94
- 第4章 ELF病毒技术——Linux UNIX病毒95
- 4.1 ELF病毒技术96
- 4.2 设计ELF病毒面临的挑战97
- 4.2.1 寄生代码必须是独立的97
- 4.2.2 字符串存储的复杂度99
- 4.2.3 寻找存放寄生代码的合理空间100
- 4.2.4 将执行控制流传给寄生代码100
- 4.3 ELF病毒寄生代码感染方法101
- 4.3.1 Silvio填充感染101
- 4.3.2 逆向text感染106
- 4.3.3 data段感染108
- 4.4 PT_NOTE到PT_LOAD转换感染110
- 4.5 感染控制流112
- 4.5.1 直接PLT感染113
- 4.5.2 函数蹦床(function trampolines)113
- 4.5.3 重写.ctors .dtors函数指针114
- 4.5.4 GOT感染或PLT GOT重定向115
- 4.5.5 感染数据结构115
- 4.5.6 函数指针重写115
- 4.6 进程内存病毒和rootkits——远程代码注入技术115
- 4.6.1 共享库注入116
- 4.6.2 text段代码注入120
- 4.6.3 可执行文件注入120
- 4.6.4 重定位代码注入——ET_REL注入120
- 4.7 ELF反调试和封装技术121
- 4.7.1 PTRACE_TRACEME技术121
- 4.7.2 SIGTRAP处理技术122
- 4.7.3 proc self status技术122
- 4.7.4 代码混淆技术123
- 4.7.5 字符串表转换技术124
- 4.8 ELF病毒检测和杀毒124
- 4.9 总结126
- 第5章 Linux二进制保护127
- 5.1 ELF二进制加壳器127
- 5.2 存根机制和用户层执行128
- 5.3 保护器存根的其他用途133
- 5.4 现存的ELF二进制保护器133
- 5.4.1 DacryFile——Grugq于2001年发布134
- 5.4.2 Burneye——Scut于2002年发布134
- 5.4.3 Shiva——Neil Mehta和Shawn Clowes于2003年发布135
- 5.4.4 May's Veil——Ryan O'Neill于2014年发布136
- 5.5 下载Maya保护的二进制文件142
- 5.6 二进制保护中的反调试142
- 5.7 防模拟技术143
- 5.7.1 通过系统调用检测模拟144
- 5.7.2 检测模拟的CPU不一致144
- 5.7.3 检测特定指令之间的时延144
- 5.8 混淆方法145
- 5.9 保护控制流完整性145
- 5.9.1 基于ptrace的攻击145
- 5.9.2 基于安全漏洞的攻击146
- 5.10 其他资源147
- 5.11 总结147
- 第6章 Linux下的ELF二进制取证分析149
- 6.1 检测入口点修改技术150
- 6.2 检测其他形式的控制流劫持154
- 6.2.1 修改.ctors .init_array节154
- 6.2.2 检测PLT GOT钩子155
- 6.2.3 检测函数蹦床158
- 6.3 识别寄生代码特征159
- 6.4 检查动态段是否被DLL注入161
- 6.5 识别逆向text填充感染164
- 6.6 识别text段填充感染166
- 6.7 识别被保护的二进制文件170
- 6.8 IDA Pro175
- 6.9 总结175
- 第7章 进程内存取证分析177
- 7.1 进程内存布局178
- 7.1.1 可执行文件内存映射179
- 7.1.2 程序堆179
- 7.1.3 共享库映射180
- 7.1.4 栈、VDSO和vsyscall180
- 7.2 进程内存感染181
- 7.2.1 进程感染工具181
- 7.2.2 进程感染技术182
- 7.3 检测ET_DYN注入184
- 7.3.1 Azazel:用户级rootkit检测184
- 7.3.2 映射出进程的地址空间184
- 7.3.3 查找栈中的LD_PRELOAD187
- 7.3.4 检测PLT GOT钩子188
- 7.3.5 ET_DYN注入内部原理190
- 7.3.6 操纵VDSO194
- 7.3.7 共享目标文件加载195
- 7.3.8 检测.so注入的启发方法196
- 7.3.9 检测PLT GOT钩子的工具197
- 7.4 Linux ELF核心文件198
- 7.5 总结204
- 第8章 ECFS——扩展核心文件快照技术205
- 8.1 历史205
- 8.2 ECFS原理206
- 8.3 ECFS入门206
- 8.3.1 将ECFS嵌入到核心处理器中207
- 8.3.2 在不终止进程的情况下使用ECFS快照208
- 8.4 libecfs——解析ECFS文件的库208
- 8.5 readecfs工具209
- 8.6 使用ECFS检测被感染的进程210
- 8.6.1 感染主机进程210
- 8.6.2 捕获并分析ECFS快照211
- 8.6.3 使用readecfs提取寄生代码215
- 8.6.4 Azazel用户级rootkit分析216
- 8.7 ECFS参考指南224
- 8.7.1 ECFS符号表重建225
- 8.7.2 ECFS节头226
- 8.7.3 使用ECFS文件作为常规的核心文件229
- 8.7.4 libecfs API的使用229
- 8.8 使用ECFS恢复中断的进程230
- 8.9 了解更多ECFS相关内容231
- 8.10 总结232
- 第9章 Linux proc kcore分析233
- 9.1 Linux内核取证分析和rootkit233
- 9.2 没有符号的备份vmlinux234
- 9.3 探索 proc kcore和GDB236
- 9.4 直接修改sys_call_table237
- 9.4.1 检测sys_call_table修改238
- 9.4.2 内核函数蹦床238
- 9.4.3 函数蹦床示例239
- 9.4.4 检测函数蹦床241
- 9.4.5 检测中断处理器修复243
- 9.5 Kprobe rootkit243
- 9.6 调试寄存器rootkit——DRR244
- 9.7 VFS层rootkit244
- 9.8 其他内核感染技术245
- 9.9 vmlinux和.altinstructions修补245
- 9.9.1 .altinstructions和.altinstr_replace246
- 9.9.2 arch x86 include asm alternative.h代码片段246
- 9.9.3 使用textify验证内核代码完整性247
- 9.9.4 使用textify检查sys_call_table247
- 9.10 使用taskverse查看隐藏进程248
- 9.11 感染的LKM——内核驱动249
- 9.11.1 方法一:感染LKM文件——符号劫持249
- 9.11.2 方法二:感染LKM文件——函数劫持249
- 9.11.3 检测被感染的LKM250
- 9.12 dev kmem和 dev mem250
- 9.12.1 dev mem251
- 9.12.2 FreeBSD dev kmem251
- 9.13 K-ecfs ——内核ECFS251
- 9.14 内核黑客工具252
- 9.14.1 通用的逆向工程和调试253
- 9.14.2 高级内核劫持 调试接口253
- 9.14.3 本章提到的论文253
- 9.15 总结254