PWN基础:从源文件到可执行文件

news/2024/5/19 20:53:06 标签: PWN, CTF, Linux

目录

编译原理

GCC编译过程

Preprocess阶段

File命令

Compile阶段

Assemble阶段

Link阶段


        高级语言编写的程序想在操作系统运行,需要被翻译为机器指令,在按照可执行目标文件格式打包并以二进制形式存储在文件中

编译原理

编译器作用:把高级语言编写的程序转换为目标语言编写的程序
编译器的结构可分为前端(Frontend)和后端(Backend)两部分

  • 前端是机器无关的,其功能是把源程序分解成组成要素和相应的语法结构’通过这个结构创建源程序的中间表示 同时收集和源程序相关的信息,存放到符号表中;
  • 后端则是机器相关的其功能是根据中间表示和符号表信息构造目标程序。

编译过程大概有下面五个部分:

  1. 词法分析:读人源程序的字符流,输出为有意义的词素
  2. 语法分析:根据各个词法单元的第一个分量来创建树型的中间表示形式通常是语法树
  3. 语义分析:使用语法树和符号表中的信息,检测源程序是否满足语言定义的语义约束同时收集类型信息用于代码生成、类型检查和类型转换;
  4. 中间代码生成和优化:根据语义分析输出,生成类机器语言的中间表示,如三地址码。然后对生成的中间代码进行分析和优化;
  5. 代码生成和优化:把中间表示形式映射到目标机器语言。

GCC编译过程

测试代码  hello.c

#include<stdio.h>

int main()
{
    printf("Hello World!\n");
}

编译时添加"-save-temps"和"--verbose"编译选项

  • 前者用于将编译过程中生成的中间文件保存下来
  • 后者用于查看GCC编译的详细工作流程

编译hello.c

gcc hello.c -o -save-temps --verbose

GCC的编译经过四个阶段:预处理(Preprocess),编译(Compile),汇编(Assemble),链接(Link)

cc1是编译器,对应一二阶段,hello.c ---> hello.s

as是汇编器,对应第三阶段,hello.s ---> hellos.o

collect2链接器,对应第四阶段,把程序运行库(CRT)中的目标文件(crt1.o,文件以.o结尾)和动态链接库(libgcc.so,文件以.so结尾)链接到hello

Preprocess阶段

主要处理源代码的 "#include","#define"这样的预处理指令,转换后插入程序文本得到 .i 文件

gcc -E参数:可以单独处理预处理过程

gcc -E hello.c -o hello.i

程序处理规则:

  1. 递归处理 #include ,把文件内容复制到文件中
  2. 删除所有 #define,在其被引用的位置递归展开所有宏定义
  3. 预处理所有条件预处理指令:#if # ifdef #elf等
  4. 删除所有注释
  5. 添加行号以及文件名标识

File命令

可以查看文件的类型

Compile阶段

对 .i 文件分析词法,语法,语义以及优化,生成汇编代码

gcc -S:单独处理编译阶段,这个指令包含预处理和编译阶段

gcc -S hello.c -o hello.s

Assemble阶段

汇编器会把根据汇编指令和机器指令的对照表进行编译,生成.o文件

gcc -C:操作对象可以是.c

gcc -c hello.c -o hello.o

.o是一个可重定向文件,使用objdump命令可查看

objdump -sd hello.o -M intel

objdump 是一个反汇编工具,用于查看二进制可执行文件或目标文件的汇编代码。通过使用 -sd 选项,可以显示详细的符号表和反汇编代码。-M intel 选项指定以 Intel 格式显示汇编代码。

输出结果将包含以下信息:

  1. 符号表:包含在目标文件中定义的全局符号和局部符号的地址和名称。
  2. 反汇编代码:以汇编语言的形式显示二进制代码的内容,可以看到每行汇编指令的地址、机器码和对应的汇编代码。

此时由于还未Link,对象文件中符号的虚拟地址无法确定。

Link阶段

把目标文件及其依赖库进行链接,生成可执行文件;链接操作由链接器(id.so)完成,主要工作是地址和空间重新分配,符号绑定和重定位操作;链接有静态,动态两种,gcc默认动态;-static 可指定使用静态链接。

gcc hello.o -o hello -static

通过链接操作,对象文件无法确定的符号,地址都已修正,程序可加载到内存正常执行。

linux可执行文件是elf格式,对应的二进制特征   7F 45 4C 46


http://www.niftyadmin.cn/n/5050701.html

相关文章

CSS实现鼠标悬停图片上升显示

文章目录 前言一、实现效果二、实现思路 前言 当我们想在图片上面放置一些文字内容时&#xff0c;发现不管怎么放置&#xff0c;要么就是图片影响到文字的观感&#xff0c;要么就是文字挡住图片的细节&#xff0c;那么怎么可以既看到图片的细节又可以看到对图片的文字描述呢&a…

2、靶机——Pinkys-Place v3(2)

文章目录 一、获取flag21.1 访问web网站1.2 查看日志文件1.2 查看Drupal漏洞1.3 获取shell 二、获取flag32.1 信息收集2.2 利用socat获取稳定权限2.3 获取数据库信息2.4 连接mysql数据库2.5 查看靶机开放的端口信息2.6 端口转发2.7 访问web服务2.8 利用wfuzz模糊测试2.9 获取用…

MySQL数据库入门到精通8--进阶篇( MySQL管理)

7. MySQL管理 7.1 系统数据库 Mysql数据库安装完成后&#xff0c;自带了一下四个数据库&#xff0c;具体作用如下&#xff1a; 7.2 常用工具 7.2.1 mysql 该mysql不是指mysql服务&#xff0c;而是指mysql的客户端工具。 语法 &#xff1a; mysql [options] [database] 选…

echarts 学习网址

1、PPChart 网址&#xff1a;PPChart - 让图表更简单 2、YX-Chartlib 网址&#xff1a;http://chartlib.datains.cn3、isqqw 网址&#xff1a;echarts图表集4、makeapie 网址&#xff1a;makeapie echarts社区图表可视化案例5、Chart.Top 网址&#xff1a;chart.top - 让图…

00-MySQL数据库的使用-上

一 数据库基础知识 先谈发音 MySQL如何发音&#xff1f;在国内MySQL发音有很多种&#xff0c;Oracle官方文档说 他们念作 My sequal[si:kwəl]。 数据库基本概念 数据 数据&#xff08;Data&#xff09;是指对客观事物进行描述并可以鉴别的符号&#xff0c;这 些符号是可识别…

在嵌入式设计中添加双向I2C数字隔离

嵌入式开发工程师曾使用光电耦合器进行I2C隔离。这些电路有些复杂&#xff0c;对总线电容敏感&#xff0c;并且速度有限。它们也与具有标准CMOS输入电平的高速数字隔离器不兼容。 该嵌入式开发工程师思想展示了如何将标准的高速数字隔离器转换为双向I2C隔离器。除了与数字隔离…

Linux 链表示例 LIST_INIT LIST_INSERT_HEAD

list(3) — Linux manual page 用Visual Studio 2022创建CMake项目 * CmakeLists.txt # CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.12)project ("llist")# I…

论文速览【序列模型 seq2seq】—— 【Ptr-Net】Pointer Networks

标题&#xff1a;Pointer Networks文章链接&#xff1a;Pointer Networks参考代码&#xff08;非官方&#xff09;&#xff1a;keon/pointer-networks发表&#xff1a;NIPS 2015领域&#xff1a;序列模型&#xff08;RNN seq2seq&#xff09;改进 / 深度学习解决组合优化问题【…