从一个简单的汇编程序学习汇编程序的结构以及编译链接的过程
时间:2022-07-23
本文章向大家介绍从一个简单的汇编程序学习汇编程序的结构以及编译链接的过程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本篇原创作者:Rj45
由于大部分的pwn都是在Linux平台下的,故下面所涉及到的汇编都是在Linux平台下的汇编。
汇编指令和伪指令
在汇编语言源程序中,包含两种指令,一种是汇编指令,一种是伪指令。汇编指令是有对应机器码的指令,可以被编译为机器指令,最终被CPU执行。伪指令没有对应的机器指令,最终不被CPU执行,而是被编译器执行,编译器根据伪指令进行相关的编译工作。
汇编程序的结构
一个linux平台下的汇编程序的结构如下:
global _start
section .data
section .bss
section .text
_start:
...
...
1、伪指令 global_start
global
是告诉编译器,其后是全局可见的名字【变量或函数名】。
_start
是一个函数的起始地址,也是编译链接后程序的起始地址, _start
必须定义为全局的,以便存在于编译后的全局符号表中。
2、伪指令 .section.data
section.data
是数据段的开始,数据段中要列出程序数据和其所需要的所有内存存储空间。
3、伪指令 section.bss
section.bss
是声明全局变量的,其内声明的变量,不会包含在可执行程序中,而是在一个内存区域被保留在运行时候使用。
4、伪指令 section.text
section.text
是文本段,也是存放程序汇编指令的部分。
5、例子 下面为一个打印hello,world的汇编程序
global _start
section .data
msg db "hello,world",0xa ;设置要输出的字符
len equ $ - msg ;$代表当前行的内存地址,$ - msg 代表msg的长度
section .text
_start: ;链接器从这里开始执行
mov eax,4
mov ebx,1
mov ecx,msg
mov edx,len
int 0x80
mov eax,1
mov ebx,0
int 0x80
_start后的汇编指令代码下期详细介绍。
编译链接的过程
1、过程 在编译链接的过程中,第一步是使用汇编编译程序nasm(linux)将源程序编译为目标文件, 然后再用链接程序ld(linux)对目标文件进行链接,生成可在操作系统中直接执行的可执行文件。
2、命令 编译
nasm -f elf32 hello.asm -o hello.o
nasm -f elf64 hello.asm -o hello.o
链接
ld -m elf_i386 hello.o -o hello//使用elf_i386链接器
ld -m elf_x86_64 hello.o -o hello//使用elf_x86_64链接器
3、例子
- 解决Sublime在LinuxMint下无法输入中文的问题
- 使用Redis做MyBatis的二级缓存
- C/C++ 如何劫持别人家的命令||函数||程序(只能对于window而言)
- windows添加静态路由
- C++继承与派生(原理归纳)
- Linux下如何查看自己的服务器有没有无线网卡
- WAMP配置虚拟主机
- linux开关端口问题
- Python 3.6实现单博主微博文本、图片及热评爬取
- 用Django实现一个可运行的区块链应用
- Python的dict实现原理及与Java的比较探究
- 关于位域如何节省内存(C++)
- mysql的小知识点(关于数据库的导入导出 对于windows)
- Python网络编程中的套接字名和DNS解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 比对软件STAR创建索引文件(index)
- linux|无需解压查看压缩文件内容
- R函数不会写,"抄"总会吧!
- @Resource和@Autowire的区别
- R函数,如何“抄”出水平
- 【STM32H7】第1章 当前主流的小型嵌入式GUI
- 链表反转的两种实现方法,后一种击败了100%的用户!
- envoy filter 开发实践系列 1:官网 echo 示例编译测试
- [Jmeter]---JsonPath表达式提取响应&断言
- envoy filter 开发实践系列 2:官网 http filter 示例编译测试
- 快速入门ElasticSearch
- 如何用 JS 一次获取 HTML 表单的所有字段 ?
- Docker与容器
- Go 每日一库之 air
- Go 每日一库之 goquery