Linux_C++_编译过程以及二进制分析

目标

1.编写代码-解剖代码
   了解二进制格式、内存布局和给定处理器的指令集	
   使用反汇编器和逆向工具的组合来理解、解剖或修改程序的行为
   分析内存转储、重建进程映像,并探索一些更神秘的二进制分析领域,包括 Linux 病毒感染和二进制取证
   
   Linux 二进制分析学习手册 二进制分析实战

工具

 Binutils 是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具	  
 进阶--ida	
 
ptrace, 这个系统调用是Linux程序调试工具gdb以及系统调用追踪器strace的基础
    硬件_CPU特权级别分层机制  -->用户态和内核态	--> 系统调用  --> CPU上下文切换 
命令行
	ptrace 即 (process trace    )进程跟踪  控制进程被称为tracer  被控制的进程被称为tracee
	strace 即 (system call trace)系统调用跟踪 利用
	  循环中的
	     PTRACE_SYSCALL请求来显示运行程序中系统调用(也称为syscalls)活动的信息,以及执行过程中捕获的信号
	ltrace 即 (library trace )   库跟踪 提供更细粒度的信息,因为它解析可执行文件的动态段,并打印来自共享和静态库的实际符号/函数	 
  readelf 命令是解剖ELF二进制文件的最有用的工具之一	 
内容
  设备和文件:
  环境变量
  命令行	

发展

 本地工具链(native toolchain)与交叉编译工具链(cross-compilation toolchain) 
   预处理-编译器-汇编器--链接器 

GNU编译工具链
  Frontend:前端词法分析、语法分析、语义分析、生成中间代码
  Optimizer:优化器   中间代码优化
  Backend:后端  生成机器码
    编译器-gcc
       语法语义--汇编程序
       编译器(如gcc或clang)来自动处理从源代码到可执行文件的整个编译过程。
      这些编译器内部集成了汇编器和其他工具,使得我们可以更方便地进行编程和调试。
	  在生成目标代码之前,编译器通常会对中间表示进行优化,以提高程序的性能和效率
    
    汇编器 GNU Assembler
        as是GNU Binutils工具集的一部分,
          用于将汇编语言源程序(通常以.s或.S为扩展名)转换为机器语言的目标文件(通常以.o为扩展名)
        二进制机器码
    链接器
        将编译器生成的目标文件(.o文件)链接成可执行文件或共享库
        ld  
          输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局.
            输入文件内的section称为输入section(input section),
        	    每个section至少包含两个信息: 名字和大小。 
        		     大部分section还包含与它相关联的一块数据, 称为section contents(section内容).
        		     “loadable(可加载的)”或“allocatable(可分配的)
        	输出section
        	   两个地址: VMA(virtual memory address )虚拟内存地址或 程序地址空间地址)和
        	             LMA(load memory address    )加载内存地址或 进程地址空间地址)
        		 VMA是执行输出文件时section所在的地址,而LMA是加载输出文件时section所在的地址
        ld.gold 是GNU二进制工具链中的一个链接器,它作为GNU ld(GNU Linker)的一个快速替代品
          ELF链接器

llvm 编译工具链支持
    LLVM中间表示(Intermediate Representation, IR)

ELF 二进制格式

        包括程序加载、动态链接、符号表查找以及许多其他紧密协调的组件
        readelf
 ELF 二进制文件保护程序
 ELF文件有两种视图形式:链接视图和执行视图
 
Linux下gcc 编译 C 源文件时,生成的是Shared object file而不是Executable file	 
   文件类型是DYN (Shared object file),而不是EXEC (Executable file)
      gcc默认加了--enable-default-pie选项
   Position-Independent-Executable是Binutils,glibc和gcc的一个功能,能用来创建介于共享库和通常可执行代码之间的代码–	  
      上-no-pie 禁用掉该默认选项:
   
readelf, objdump, ldd, xxd,hexdump, dd, strace,   
    1. 使用 file 解决类型问题
	    Linux操作系统自带了base64的小工具(通常作为 GNU coreutils 的一部分),这个工具可以对Base64进行编码和解码
		file的另一个功能:查看压缩文件。将-z选项传递给file,查看压缩文件的内容而无须进行提取文件的操作
	2 使用ldd探索依赖性
	3 使用xxd查看文件内容
	4 使用readelf解析并提取ELF库文件
	5 使用nm解析符号 C++编译器提出了符号修饰(mangled name)。符号修饰实质上是原始函数名称与函数参数编码的组合。这样,函数的每个版本都会获得唯一的名
	6 使用strings查看Hints
	7 使用strace和ltrace跟踪系统调用和库文件调用
	8 使用objdump检查指令集行为
	9 使用GDB转储动态字符串缓冲区
		
    GNU binutils    (配合gcc工作)
    GNU coreutils	  coreutils【对应的嵌入式场合,主要是 busybox 】

交叉编译

 交叉编译工具链主要由binutils、gcc和glibc 3个部分组成
    确定目标平台
	构建交叉工具链:

	crosstool-ng的

设计和实现了机器学习框架

 (如TensorFlow、PyTorch、MindSpore等)
 编译器前端
   编译器前端: 机器学习框架往往具有AI编译器来构建计算图,并将计算图转换为硬件可以执行的程序
 编译器后端和运行时: 
    完成计算图的分析和优化后,机器学习框架进一步利用编译器后端和运行时实现针对不同底层硬件的优化

通用编译器中的概念,
  如AOT(Ahead of Time提前编译)、
   JIT(Just in time 即时)、IR(Intermediate Representation中间表示)、
   PASS优化、AST(Abstract Trees)、副作用、闭包等概念
机器学习编译器-AI编译器
    AI编译器的设计受到了主流编译器(如LLVM)的影响
	      AI编译器一般采用多层级IR设计
        MLIR(Multi-Level Intermediate Representation)是一种用于构建可重用和可扩展编译的新方法
		   使用MLIR为Fortran、机器学习图构建抽象
		   
		   
机器学习框架如 MindSpore 采用统一的IR设计(MindIR)		
    MindSpore IR (MindIR) is a function-style IR based on graph representation	

使用机器学习框架

参考

 www.gnu.org/software/binutils/	
 Linux交叉编译工具链 https://www.cnblogs.com/hellokitty2/p/9745959.html	
   https://www.cnblogs.com/apachecn/p/18196561
   成为一名二进制分析师需要用到的Linux二进制分析工具有哪些?
MindSpore IR(MindIR)   
 https://www.mindspore.cn/docs/zh-CN/r0.7/design/mindspore/ir.html   
 https://openmlsys.github.io/chapter_introduction/design.html
posted @ 2024-12-02 18:08  辰令  阅读(52)  评论(0)    收藏  举报