linux将汇编转为机器码,如何将汇编语言转化为机器码
很简单,使用gcc即可,我们写如下程序:
pop eax
复制代码
保存为文本文件,命名为test.s
然后使用gcc在32位的环境下编译
gcc test.s
复制代码
结果会报错,为什么呢?
/usr/bin/ld: /tmp/ccj87S8M.o: relocation R_X86_64_32S against undefined >symbol eax' can not be used when making a PIE object; recompile with -fPIC /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function_start':
(.text+0x20): undefined reference to `main'
/usr/bin/ld: final link failed: Invalid operation
collect2: error: ld returned 1 exit status
因为gcc默认汇编是要编译链接一气呵成的。这里我们使用参数-c,即可只编译不链接。
gcc -c test.s
复制代码
这样就出来了一个test.o文件,里面只有pop eax的机器码,我们可以使用objdump -d查看。
objdump -d test.o
复制代码
可以看到pop eax被转化为了popq,为什么呢?因为gcc采用的是AT&T 语法pop eax要写成pop %eax再编译才行
既然gcc编译这个并不准确,那么有什么是准确的呢?我们可以采用nasm,nasm使用intel语法,兼容这个格式。
没安装的可以安装下,很快
apt install nasm
复制代码
之后使用nasm编译这个文件
nasm -f elf32 test.s
复制代码
之后生成的test.o文件就可以用objdump正常分析。
我们也可以在objdump后面加-M intel来转化为intel语法,这种语法没有百分号。
除此之外,直接使用pwntools里面的函数似乎更加方便,比如
from pwn import *
context.arch='i386' #指定架构
print(asm('mov eax, 0'))
复制代码
结果
b'\xb8\x00\x00\x00\x00'
复制代码
如果有报错没装binutil,请参考这个页面安装对应的,比如安装在Mac OS:
brew install https://raw.githubusercontent.com/Gallopsled/pwntools-binutils/master/osx/binutils-$ARCH.rb
复制代码
这里的$ARCH一般只要填i386或者amd64就行了。
linux将汇编转为机器码,如何将汇编语言转化为机器码相关推荐
- linux将汇编转为机器码,汇编语言 高级语言 机器语言 本地代码
不管是什么语言,最终都会转化为机器语言(本地代码)(机器码),计算机程序的运行最终仍是以机器语言(本地代码)(机器码)运行的.java 汇编语言:linux 汇编语言是低级编程语言,不像高级语言有跨平 ...
- Linux汇编代码中加打印,汇编语言中调用C函数打印“hello world”
linux中的汇编语言开发一般采用的是AT&T语法,而一些老版本的as对于intel的语法支持还不是很好,保险起见还是用AT&T语法才是王道啊 呵呵 # filename:hello. ...
- linux 嵌入式汇编 adc,嵌入式Linux ARM汇编(四)——ARM汇编程序设计
嵌入式Linux ARM汇编(四)--ARM汇编程序设计 汇编程序有顺序.循环.分支.子程序四种结构形式. 一.顺序结构 程序实例: AREA Buf,DATA,READWRITE;定义数据段Buf ...
- 8086汇编学习小记-王爽汇编语言实验12
8086汇编学习小记-王爽汇编语言实验12 0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出'divided error',改成直接退出就正常显示了.注意修改ss,sp之 ...
- 第5部分- Linux ARM汇编 ARM 架构细节
第5部分- Linux ARM汇编 ARM 架构细节 ARM处理器有37个寄存器,包括31个通用寄存器,和6个状态寄存器. 通用寄存器是31个从x0-x30,31个数量是比较奇怪的,其实还有一个是Ze ...
- Linux内核汇编代码分析
Linux内核汇编代码分析 1.vmlinux.lds.S文件分析 1.2 vmlinux.lds.S文件总体框架 1.3 代码段 1.4 只读数据段 1.5 init段 1.6 数据段 1.7 未初 ...
- 第19部分- Linux ARM汇编 函数调用栈使用-阶乘
第19部分- Linux ARM汇编 函数调用栈使用-阶乘 调用栈我们以阶乘为例.阶乘比较经典. 堆栈定义:堆栈是仅由当前动态激活拥有的内存区域. 我们先来看下阶乘的C代码如下: int factor ...
- linux 编译汇编,linux下的汇编教程
linux下的汇编教程 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初 ...
- c语言编译机器码,[转载]单片机C语言到机器码的全过程
我们平时做单片机编程,最常使用的是C语言和汇编语言两种,但是最终下载到单片机内部的,却是HEX文件里的二进制机器代码,很多同学不懂这个过程是如何转换的. 我们的程序开发环境,比如KEIL和伟福等等,都 ...
- 从键盘输入一字符串,以#为结束标志 将大写转为小写小写转为大写 其他不变输出转化后的字符串
int main()//7 从键盘输入一字符串,以#为结束标志 将大写转为小写小写转为大写 其他不变输出转化后的字符串 { char x,y; scanf("%c" ...
最新文章
- selenium常用命令之操作页面元素及获取元素内容的事件整理
- Linux cut命令
- Vivado 随笔(2) 综合属性之use_dsp48?
- 【算法】模拟退火算法解决TSP问题的matlab实现
- C++基础--简单Socket通信实例
- 四十二、开始Vuex的学习:如何在Vue中使用Vuex
- 几何基础之判断线段相交问题
- Myeclipse中weblogic配置
- ApplicationInsights的探测器尝鲜
- 一起谈.NET技术,Linq学习笔记
- Libsvm Java
- 零基础怎么学习单片机?
- 批量保存网页_一键下载网页所有图片,把美丽存下来
- Kafka | Kafka中如何实现死信队列重试队列
- 西数、希捷、DIY移动硬盘详细拆解,暴力解析
- criteo 点击率预估_预处理criteo数据集以预测广告的点击率
- Timeline 时间线基础用法
- vb.net机房收费系统——类的理解(sqlhelper)
- centos go 连结oracle报ping failed 问题
- 欧几里得算法求解最大公因数详解