汇编和反汇编的理解

红队专题-REVERSE汇编/二进制PWN/逆向/反编译 ROP(Return-Oriented Programming)链是一种计算机安全领域中的攻击技术,用于绕过内存执行保护措施,实现利用漏洞进行代码注入控制流劫持。由一系列已存在于程序内存中的代码片段(称为gadget)组成的,这些片段通常是程序的合法指令序列。通过将这些gadget按照特定的顺序串联起来,攻击者可以构造出一条可执行的ROP链,用于实现特定的攻击目的。ROP链的基本原理依赖于已存在的代码片段,而不是插入自定义的恶意代码。这样可以避免执行数据区域中的恶意代码, 阅读详情

汇编语言是高级语言转换成机器码的桥梁,通过汇编语言的编译转换成机器码,计算机就可以执行程序。因为在计算机中,所有的程序都是按照机器码执行的,所以对汇编语言的理解,能够增加对底层执行的认识。

下面介绍的是汇编语言编译的过程(手工的方式编译68HC11的子例程):

LDAA(立即寻址)指令的长度为两个字节,操作码是86(这个是在计算机中的机器码,也就是说如果计算机存储的数据是86,就会执行LDAA操作),另一个字节是操作码。而ADDA(立即寻址)指令的长度也是两个字节。操作码是8B,在技术手册或程序员参考手册中查找其余的操作码,就对得到如下的结果:

0100    86    10    LDAA #$10    ;把第一个数载入到累加器A中
0102    8B    1F    ADDA #$1F    ;把第二个数加到累加器A
0104    8B    0C    ADDA #$0C    ;把第三个数加到累加器A
0106    B7    00 27 STAA $0027   ;把累加器A的内容存到地址0x0027中
0109    39    RTS                ;返回主程序

此处,做了如下的假定:程序的起始地址是0x0100,每条指令的地址都附在左左边。注意地址的变化与指令长度的关系。

如果我们要明确的告诉编译器,程序的起始地址是0x0100,则可以使用org这条伪指令语句:

org 0x0100

org伪指令必须始终放在第一条指令的前面,用于把程序的代码定位在特定的位置上。例如处理器芯片的ROM上。

 

反汇编

反汇编就是我们把一系列的机器码转换成改程序的助记符。如果我们拿到一份机器码程序,而我们想要知道他的功能和工作方式,可以对机器码进行反汇编。

例如,我们拿到了一份68HC11机器码程序的字节序如下:

8E 56 78 86 56 84 06 36 4C 36

首先,我们假定第一个字节为操作码,在Motorola (或68HC11)指令集的数据手册里,查找0x8E这个操作码,就会发现它是LDS(load stack pointer 加载堆载指针)指令,而该指令的长度为3个字节(一个为操作码,另外两个为操作数)。因此,如果第一个字节为操作码,则其后的两个字节为相关的数据。所以,第一条指令就是:

8E 56 78    LDS #$5678;    把0x5678载入到堆栈指针中

后面的指令操作首先要查找到机器码对应的操作码,再看这个操作码有几个字节,然后就能够反汇编出机器码的程序。

转载自:《嵌入式硬件设计第2版》53-56

交叉编译工具链反汇编 阅读详情

相关推荐

反汇编理解指针引用的区别

目录 初始化 赋值 取地址 总结 本文主要基于反汇编代码,从初始化、赋值以及取地址三个角度来理解指针引用的区别。 初始化 写出以下代码并查看反汇编代码: int main() { int x = 5; int * ptr = &x; //指针 int & ref = x; //引用 return 0; } ...

HerofH_的博客 735

反汇编工具IDA使用详解(使用IDA查看二进制文件的汇编代码以及使用IDA分析崩溃问题实例分享)

本文详细介绍一下IDA反汇编工具,介绍如何使用IDA反汇编工具查看二进制文件的汇编代码,并分享一个使用IDA排查程序崩溃的实例。

dvlinker的技术专栏 6万+

反汇编工具objdump的使用以及反汇编文件的解读

什么是反汇编 为什么要反汇编 反汇编文件的生成解读

weixin_42031299的博客 1万+

汇编反汇编

C为了方便人类方便使用,发明的高级语言,要转换为汇编汇编为了解放人类的记忆,发明的“助记符”,不用去记各类机器码。最终要转换为机器码。机器码给CPU使用。

Caramel_biscuit的博客 2829

反汇编基础学习(一)

参考教材:《IDA Pro权威指南》(第2版) 编程语言 第一代语言:01,十六进制码,也称为机器语言,字节码,机器语言程序常被称为二进制文件 第二代语言:汇编语言,助记符对应具体模式的位模式或操作码 第三代语言:引入了关键字结构,表达更接近自然语言,常见的C,Java,C++ 需要编译器转换为汇编语言或机器语言 第四代语言:用户定义“做什么”而不是“如何做”,依靠更高级的第四代工具,SQL,QBE 反汇编反编译 概念 为了回溯编程过程(或对程序进行逆向工程)使用各种反汇编工具撤销汇编编译过程,

RMC131的博客 1万+

反汇编角度深入理解C++继承多态

反汇编角度理解C++继承多态

只为改变自己 1172

2020-12-6(从反汇编理解指针引用的区别)

这是我10个月前看到的一篇博客吧,感觉分析指针引用的文章这是我目前见过讲解得最清晰的一篇: 本文主要基于反汇编代码,从初始化、赋值以及取地址三个角度来理解指针引用的区别。 初始化 写出以下代码并查看反汇编代码: int main() { int x = 5; int * ptr = &x; //指针 int & ref = x; //引用 return 0; } 在初始化阶段,指针引用的行为都是一样的:先将x的地址加载到寄存器eax中,

寻梦&之璐 709

深入理解char [] char * ,const char[] const char*--反汇编分析

首先这个是我在2012-06-15日去某公司面试遇到的问题,当时写错了,被鄙视了,现在痛定思痛,深入分析一下。   1 char a[]="abc"; 2 char b[]="abc"; 3 4 char *c="abc"; 5 char *d="abc"; 6 7 const char e[]="abc"; 8

辛未的专栏 844

通过反汇编理解函数调用机制(x86ARM)

如下,一个简单的程序 1 #include <stdio.h> 2 int add(int a, int b) 3 { 4 return a + b; 5 } 6 7 void main() 8 { 9 int a = 1, b = 2; 10 int result; 11 r...

weixin_34315189的博客 112

深入理解操作系统(5)第三章:程序的机器级表示(1)intel历史+程序编码+算术逻辑操作(包括:8086/汇编/摩尔/机器级代码/汇编指令/objdump/汇编指令/反汇编/8个常用寄存器/lea

深入理解操作系统(5)第三章:程序的机器级表示(1)intel历史+程序编码+算术逻辑操作(包括:8086由来/汇编/摩尔定律/机器级代码/汇编指令特性/objdump/汇编指令/反汇编/8个常用寄存器/操作数的三种类型/lea指令/移位操作sall,shll)1. 前言1.1 现代编译器的优点1.2 理解汇编代码的重要性1.3 编译器的优化1.4 精通细节是理解更深更基本概念的先决条件2. 历史观点-Intel处理器发展2.1 intel历史(8086由来)2.2 IA32-Intel32位体系结构2

哈尼的博客 3447

反汇编工具objdump的使用简介

1、反汇编的原理&为什么要反汇编 arm-linux-objdump -D led.elf > led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf(操作系统上的可执行文件)格式的可执行程序反过来得到汇编源代码。 -D(objdump 后面可以带不同参数实现不同功能)表示反 > 左边的是elf的可执行程序(反汇编的原材料), >右...

qq_41680432的博客 2306

gdb反汇编disassemble

GDB Command Reference - disassemble command gdb反汇编可用disassemble/disass命令。用法如下:disassemble disassemble [Function] 指定要反汇编的函数。如果指定,反汇编命令将产生整个函数的反汇编输出。 (gdb) disassemble main disassemble [Address] 指定要反汇编的地址。请注意,当仅指定一个地址时,此命令将反汇编包含给定地址的...

qq_28499879的博客 1万+

使用GDB(三):调试程序反汇编方法

一、LuaJit LuaJit是lua语言的虚拟机,用来运行lua代码,同java虚拟机JVM运行java一样,有两种执行模式,解释模式即时编译模式。 解释模式: 将lua source 解析生成byte code,然后同一般解释器一样把byte code一个一个的进行解析执行。但是有同一般解释器不一样的地方,LuaJit的作者搞了个叫DynASM的工具,通过DynASM预处理可以把汇编指令变成可执行的二进制码,所以解释模式解释执行byte code的逻辑是用汇编写的,如下: |//符合DynASM语法的

yelvens的博客 1万+

深入理解char [] char * ,const char[] const char*--反汇编分析

首先这个是我在2012-06-15日去某公司面试遇到的问题,当时写错了,被鄙视了,现在痛定思痛,深入分析一下。 1 char a[]="abc"; 2 char b[]="abc"; 3 4 char *c="abc"; 5 char *d="abc"; 6 7 const char e[]="abc"; 8 ...

weixin_34417200的博客 227

深入了解 Linux 反汇编

深入了解 Linux 反汇编

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 1067

嵌入式学习笔记(16)反汇编工具objdump

反汇编的时候得到的指令地址是链接器考虑了链接之后得到的地址,而我们写代码时通过指定的链接脚本来让链接器给我们链接合适的地址。但是有时候我们写的链接脚本有误(或者我们根本不知道这个链接脚本会怎么样),这时候可以通过反汇编文件来分析这个链接脚本的效果。这些指令每一条都有一个指令地址,这个地址时链接的时候ld给指定的(ld根据我们写的链接脚本来指定)3)把C语言源代码编译链接生成的可执行程序反汇编后得到的反汇编代码可以帮助我们理解C语言汇编语言之间的对应关系。> 左边的是elf可执行程序(反汇编的源)

m0_70888041的博客 1097

java学习(java反汇编

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 学过c或者cpp的同学都知道,exe或者dll、so、a文件都可以反汇编成对应的汇编文件。当然,这个对应的cpu也有关系。比如,如果是x86程序,那么只能翻译成x86的代码,如果是arm的程序,那么只能反汇编成对应的arm程序。这个时候,很多同学会说,如果是java的程序,有没有办法看到对应的反汇编代码。其实是有的。答案就是javap程序。 1、编写简单的java代码 impo....

嵌入式-老费,一个分享专业嵌入式知识的blog 1520
上一篇: C语言转换成C++语言时,强制转换的意义和实现
下一篇: CAJ VIEWER 7.2 已停止工作(正确的处理方法,最快最正确的方法,网上的其他方法也就是看看,很难找到问题的正确办法)
XRay_XQ
博客等级 码龄9年 2粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值