很简单,使用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将汇编转为机器码,如何将汇编语言转化为机器码相关推荐

  1. linux将汇编转为机器码,汇编语言 高级语言 机器语言 本地代码

    不管是什么语言,最终都会转化为机器语言(本地代码)(机器码),计算机程序的运行最终仍是以机器语言(本地代码)(机器码)运行的.java 汇编语言:linux 汇编语言是低级编程语言,不像高级语言有跨平 ...

  2. Linux汇编代码中加打印,汇编语言中调用C函数打印“hello world”

    linux中的汇编语言开发一般采用的是AT&T语法,而一些老版本的as对于intel的语法支持还不是很好,保险起见还是用AT&T语法才是王道啊 呵呵 # filename:hello. ...

  3. linux 嵌入式汇编 adc,嵌入式Linux ARM汇编(四)——ARM汇编程序设计

    嵌入式Linux ARM汇编(四)--ARM汇编程序设计 汇编程序有顺序.循环.分支.子程序四种结构形式. 一.顺序结构 程序实例: AREA Buf,DATA,READWRITE;定义数据段Buf ...

  4. 8086汇编学习小记-王爽汇编语言实验12

    8086汇编学习小记-王爽汇编语言实验12 0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出'divided error',改成直接退出就正常显示了.注意修改ss,sp之 ...

  5. 第5部分- Linux ARM汇编 ARM 架构细节

    第5部分- Linux ARM汇编 ARM 架构细节 ARM处理器有37个寄存器,包括31个通用寄存器,和6个状态寄存器. 通用寄存器是31个从x0-x30,31个数量是比较奇怪的,其实还有一个是Ze ...

  6. Linux内核汇编代码分析

    Linux内核汇编代码分析 1.vmlinux.lds.S文件分析 1.2 vmlinux.lds.S文件总体框架 1.3 代码段 1.4 只读数据段 1.5 init段 1.6 数据段 1.7 未初 ...

  7. 第19部分- Linux ARM汇编 函数调用栈使用-阶乘

    第19部分- Linux ARM汇编 函数调用栈使用-阶乘 调用栈我们以阶乘为例.阶乘比较经典. 堆栈定义:堆栈是仅由当前动态激活拥有的内存区域. 我们先来看下阶乘的C代码如下: int factor ...

  8. linux 编译汇编,linux下的汇编教程

    linux下的汇编教程 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初 ...

  9. c语言编译机器码,[转载]单片机C语言到机器码的全过程

    我们平时做单片机编程,最常使用的是C语言和汇编语言两种,但是最终下载到单片机内部的,却是HEX文件里的二进制机器代码,很多同学不懂这个过程是如何转换的. 我们的程序开发环境,比如KEIL和伟福等等,都 ...

  10. 从键盘输入一字符串,以#为结束标志 将大写转为小写小写转为大写 其他不变输出转化后的字符串

    int main()//7  从键盘输入一字符串,以#为结束标志 将大写转为小写小写转为大写 其他不变输出转化后的字符串 {     char x,y;     scanf("%c" ...

最新文章

  1. selenium常用命令之操作页面元素及获取元素内容的事件整理
  2. Linux cut命令
  3. Vivado 随笔(2) 综合属性之use_dsp48?
  4. 【算法】模拟退火算法解决TSP问题的matlab实现
  5. C++基础--简单Socket通信实例
  6. 四十二、开始Vuex的学习:如何在Vue中使用Vuex
  7. 几何基础之判断线段相交问题
  8. Myeclipse中weblogic配置
  9. ApplicationInsights的探测器尝鲜
  10. 一起谈.NET技术,Linq学习笔记
  11. Libsvm Java
  12. 零基础怎么学习单片机?
  13. 批量保存网页_一键下载网页所有图片,把美丽存下来
  14. Kafka | Kafka中如何实现死信队列重试队列
  15. 西数、希捷、DIY移动硬盘详细拆解,暴力解析
  16. criteo 点击率预估_预处理criteo数据集以预测广告的点击率
  17. Timeline 时间线基础用法
  18. vb.net机房收费系统——类的理解(sqlhelper)
  19. centos go 连结oracle报ping failed 问题
  20. 欧几里得算法求解最大公因数详解

热门文章

  1. springboot毕设项目自驾旅游网站的设计与实现gah85(java+VUE+Mybatis+Maven+Mysql)
  2. IDEA 插件开发 向主菜单注册菜单项目
  3. 激光雷达应用技术分析
  4. Odoo报表的report标签和报表格式定义
  5. AI自动写报告,原来如此简单
  6. Excel的DATEDIF函数及其用法实例——求日期之间的间隔
  7. 中国大陆加港澳台手机正则验证
  8. 应该怎么正确向老板提加薪呢?
  9. 压缩文件已损坏怎么办?恢复压缩文件,解决方法看这里
  10. 射灯安装方法图解_射灯如何安装—射灯的安装方法介绍