从一个简单的汇编程序学习汇编程序的结构以及编译链接的过程
由于大部分的pwn都是在Linux平台下的,故下面所涉及到的汇编都是在Linux平台下的汇编。
汇编指令和伪指令
在汇编语言源程序中,包含两种指令,一种是汇编指令,一种是伪指令。
汇编指令是有对应机器码的指令,可以被编译为机器指令,最终被CPU执行。
伪指令没有对应的机器指令,最终不被CPU执行,而是被编译器执行,编译器根据伪指令进行相关的编译工作。
汇编程序的结构
一个linux平台下的汇编程序的结构如下:
1 | global _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的汇编程序
1 | global _start |
_start后的汇编指令代码下期详细介绍。
编译链接的过程
1、过程
在编译链接的过程中,第一步是使用汇编编译程序nasm(linux)将源程序编译为目标文件(机器码),
然后再用链接程序ld(linux)对目标文件进行链接,生成可在操作系统中直接执行的可执行文件。
2、命令
编译
1 | nasm -f elf32 hello.asm -o hello.o |
链接
1 | ld -m elf_i386 hello.o -o hello//使用elf_i386链接器 |
3、例子
下期预告
Linux下的系统调用机制