shellcode汇编复习

shellcode汇编复习

  • 一、 汇编代码复习
    • 1.1 基础寄存器
      • 1. EAX (Accumulator Register)
      • 2. EBX (Base Register)
      • 3. ECX (Count Register)
      • 4. EDX (Data Register)
      • 5. ESI (Source Index Register)
      • 6. EDI (Destination Index Register)
  • 二、 基础指令
    • 1. `mov` - 数据传送
    • 2. `add` - 加法
    • 3. `sub` - 减法
    • 4. `inc` - 自增
    • 5. `dec` - 自减
    • 6. `lea` - Load Effective Address
    • 7. `jmp` - Jump
    • 8. `cmp` - Compare
    • 9. `push` - Push
    • 10. `pop` - Pop
    • 11. `xor` - Exclusive OR
    • 12. `xchg` - Exchange
    • 13. jz (Jump if Zero)
    • 14. call

一、 汇编代码复习

EAX,EBX,ECX,EDX,ESI和EDI使用详解。
在这里插入图片描述

1.1 基础寄存器

在计算机体系结构中,特别是在x86架构中,通用寄存器(General Purpose Registers, GPRs)是CPU中用于存储临时数据或地址的关键组成部分。这些寄存器对于执行各种算术、逻辑和数据转移操作至关重要。在x86架构中,EAX、EBX、ECX、EDX、ESI和EDI是32位模式下的主要通用寄存器,它们在64位模式下(如x86-64)通常扩展为RAX、RBX、RCX、RDX、RSI和RDI,但保持相似的用途和特性。这里,我们将专注于32位模式下的这些寄存器。

1. EAX (Accumulator Register)

EAX寄存器通常用作累加器,在算术和逻辑运算中扮演主要角色。它经常用于存储操作数、结果以及中间值。在函数调用中,EAX也常用于返回函数的结果。

2. EBX (Base Register)

EBX通常用作基址寄存器,特别是在数组和字符串操作中,它可以用来存储数组或字符串的基地址。此外,在调用操作系统函数时,EBX有时也用于传递参数。

3. ECX (Count Register)

ECX通常用作计数器寄存器,在循环操作中尤其重要。它存储了循环的迭代次数,很多指令(如REP前缀的字符串操作指令)都会递减ECX的值来控制循环次数。

4. EDX (Data Register)

EDX是一个数据寄存器,它在执行双操作数指令时与EAX协同工作。对于较大的数据操作(如64位除法),EDX用于存储高位结果。此外,在多字节操作中,EDX也常用于存储扩展的数据。

5. ESI (Source Index Register)

ESI作为源索引寄存器,在字符串操作中非常有用。它通常用于存储源字符串或数据数组的起始地址,在字符串指令(如MOVSB, CMPSB等)中自动递增,以便按顺序处理数据。

6. EDI (Destination Index Register)

EDI作为目的索引寄存器,与ESI相对应,在字符串操作中用于存储目标字符串或数据数组的起始地址。与ESI相似,EDI也在字符串指令中自动递增,以接收来自源地址的数据。

二、 基础指令

1. mov - 数据传送

mov 指令用于将一个数据(可以是立即数、寄存器内容、内存地址中的数据)传送到另一个地方(寄存器或内存地址)。

语法

mov destination, source

示例

mov eax, 10          ; 将立即数 10 传送到寄存器 eax
mov ebx, eax         ; 将寄存器 eax 的内容传送到寄存器 ebx
mov [var], eax       ; 假设 var 是一个内存地址,将 eax 的内容传送到该地址

2. add - 加法

add 指令用于将两个操作数相加,并将结果存储在第一个操作数中(即目标操作数)。

语法

add destination, source

示例

mov eax, 5
add eax, 3           ; eax 的值变为 8
add [var], eax       ; 假设 var 是一个内存地址,将其内容与 eax 相加,结果存回 var

3. sub - 减法

sub 指令用于从第一个操作数中减去第二个操作数,并将结果存储在第一个操作数中。

语法

sub destination, source

示例

mov eax, 10
sub eax, 3           ; eax 的值变为 7
sub [var], eax       ; 假设 var 是一个内存地址,从其内容中减去 eax,结果存回 var

4. inc - 自增

inc 指令用于将指定操作数的值加 1。

语法

inc operand

示例

mov eax, 5
inc eax             ; eax 的值变为 6
inc [var]           ; 假设 var 是一个内存地址,将其内容加 1

5. dec - 自减

dec 指令用于将指定操作数的值减 1。

语法

dec operand

示例

mov eax, 5
dec eax             ; eax 的值变为 4
dec [var]           ; 假设 var 是一个内存地址,将其内容减 1

当然可以,下面我将详细解释汇编命令 leajmpcmppushpop 的使用方法,并给出对应的使用示例。请注意,这些示例是基于常见的x86汇编语言格式,但不同的汇编器(如NASM、MASM等)可能在语法细节上有所不同。

6. lea - Load Effective Address

lea 指令用于加载有效地址(即将地址计算的结果存储到目标寄存器中,而不是执行内存访问)。这通常用于复杂的地址计算,但不希望实际从内存中加载数据。

语法

lea destination, source

示例

; 假设有一个数组 array,其基地址为 array_base
; 我们想要计算 array[index] 的地址
mov index, 4       ; 索引为 4
lea eax, [array_base + index * 4] ; 假设每个元素是 4 字节的,计算 array[4] 的地址并存储到 eax
; 此时 eax 中存储的是 array[4] 的地址

注意:在上面的示例中,[array_base + index * 4] 实际上是一个地址计算表达式,而 lea 指令将其结果(即地址)存储到 eax 中,而不实际访问该地址处的内存。

7. jmp - Jump

jmp 指令用于无条件跳转到程序中的另一个位置执行。

语法

  • 直接跳转:jmp label
  • 间接跳转:jmp register(寄存器中存储的是跳转目标的地址)

示例

; 直接跳转
label1:; 一些代码
jmp label2
label2:; 跳转到这里执行; 间接跳转
mov eax, offset label3
jmp eax
label3:; 跳转到这里执行(通过寄存器跳转)

8. cmp - Compare

cmp 指令用于比较两个操作数,并根据比较结果设置条件码(如零标志ZF、符号标志SF、溢出标志OF等)。它不存储比较结果,但随后的条件跳转指令(如 jejne 等)会根据这些条件码来决定是否跳转。

语法

cmp operand1, operand2

示例

mov eax, 5
mov ebx, 10
cmp eax, ebx
; 此时 ZF=0(不相等),SF、OF 等可能根据具体值设置
; 接下来可以用 je、jne 等条件跳转指令

9. push - Push

push 指令用于将一个操作数(通常是寄存器或立即数)压入堆栈。堆栈是一种后进先出(LIFO)的数据结构,用于临时存储数据。

语法

push operand

示例

push eax    ; 将 eax 的值压入堆栈
push 10     ; 将立即数 10 压入堆栈

10. pop - Pop

pop 指令用于从堆栈中弹出一个值,并将其存储到指定的寄存器或内存中。

语法

pop destination

示例

; 假设之前已经用 push 指令压入了数据
pop eax     ; 将堆栈顶部的值弹出并存储到 eax
pop [var]   ; 假设 var 是一个内存地址,将堆栈顶部的值弹出并存储到该地址

在x86汇编语言中,xorlodsd(或更常见的lodsd的变体,如lodsd本身通常用于字符串操作,但可能指的是movsd或其他与加载双字相关的指令,因为lodsd不是标准x86指令集中的直接指令)和xchg是几种有用的指令,用于不同的目的。不过,为了回答,我将解释xorxchg,并假设你想要了解的是与lodsd相似的双字加载操作(比如movsd),因为lodsd不是标准指令。

11. xor - Exclusive OR

xor 指令执行两个操作数的按位异或(XOR)操作,并将结果存储在第一个操作数中。异或操作的特点是,当两个比较的位不相同时,结果为1;相同时,结果为0。此外,xor 指令经常用于清零寄存器,因为任何数与自身异或的结果都是0。

语法

xor destination, source

示例

; 使用 xor 清零寄存器
xor eax, eax    ; eax 的值变为 0; 使用 xor 翻转寄存器的位
mov eax, 0xFF   ; eax = 1111 1111b
xor eax, 0x55   ; eax = 0101 0101b (因为 1 ^ 1 = 0, 0 ^ 0 = 0, 1 ^ 0 = 1)

12. xchg - Exchange

xchg 指令交换两个操作数的值。这两个操作数可以是寄存器或内存地址。

语法

xchg operand1, operand2

示例

; 交换两个寄存器的值
mov eax, 10
mov ebx, 20
xchg eax, ebx  ; 现在 eax = 20, ebx = 10; 交换寄存器与内存中的值
mov [var], 30
xchg eax, [var] ; 假设 var 是一个内存地址,现在 eax = 30, [var] = 10

13. jz (Jump if Zero)

jz 指令用于条件跳转。当紧接在jz之前的指令(通常是某种算术或逻辑操作,如addsubcmp等)影响到的标志寄存器中的零标志(ZF)被设置为1时(即,结果为零时),jz会导致程序控制流跳转到指定的标签(label)处继续执行。如果ZF为0,则跳过跳转,继续顺序执行下一条指令。

语法:

jz label

这里,label是程序中定义的一个标签,用于指定跳转的目标位置。

示例:

section .text
global _start_start:mov eax, 1sub eax, 1jz zero_found    ; eax现在是0,ZF被设置,跳转到zero_found; 如果上面的jz没有执行,则会继续执行下面的指令; 这里可以添加一些未找到零时执行的代码; ...zero_found:; 如果执行到这里,说明找到了零(或者某个操作导致了ZF被设置); 这里可以添加找到零时执行的代码; ... 结束程序或继续其他操作

14. call

call 指令用于函数调用。它将当前指令的地址(即,紧接在call指令之后的那条指令的地址)压入堆栈,然后跳转到由call指令后紧跟的操作数指定的地址执行。这个操作数可以是标签、函数名、或是一个直接地址。函数执行完毕后,通常通过ret指令返回,ret会从堆栈中弹出之前保存的返回地址,并跳转到那个地址继续执行。

语法:

call label/function_name/direct_address

示例:

section .text
global _startprint_hello:; 假设这里有一段打印"Hello, World!"的代码; 注意:实际的系统调用依赖于操作系统和具体架构; 这里只是一个示意ret_start:; 调用print_hello函数call print_hello; 接下来可以是程序的其他部分; ...; 注意:在实际的Linux程序中,你需要通过系统调用来退出程序; 这里为了示例的简洁性省略了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansys Zemax|如何有效地模拟散射

附件下载 联系工作人员获取附件 概要 OpticStudio中,有两个用来提升散射模拟效率的工具:Scatter To List以及Importance Sampling。在这篇文章中,我们详细讨论了这两个工具,并且以一个杂散光分析为例示范了如何使用Importance S…

简单的jar包重打包Failed to get nested archive for entry 报错处理

简单的jar包重打包Failed to get nested archive for entry 报错处理 1. 需求 公司有一个后端项目,项目已经打好了jar包,现在我们发现jar包依赖的子包有问题,其中的一个mybatis xml文件查询数据不正确,我们需要替换项目&#xf…

批量将labelme的json文件转为png图片查看

文章目录 前提修改 l a b e l m e labelme labelme然后你就可以在这个环境下用代码批量修改了 前提 安装anaconda或者miniconda安装labelme 修改 l a b e l m e labelme labelme 查看labelme所处环境的路径:conda info --envs 比如我的是在py39_torch里面 修改la…

秋招力扣Hot100刷题总结——链表

1. 反转链表题目连接 题目要求:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 代码及思路 遍历所有节点,将所有节点的next指向前一个节点由于要改变节点的next指向,而链表是单向的,因此需要…

【Mac】植物大战僵尸杂交版 for Mac(经典策略塔防游戏)游戏介绍

游戏介绍 植物大战僵尸杂交版 for Mac是一款非常受欢迎的策略塔防游戏,植物大战僵尸游戏以其独特的主题、幽默的风格和富有挑战性的关卡设计而著称。玩家需要种植各种植物来防御入侵的僵尸,每种植物都有其特定的功能和攻击方式。植物大战僵尸杂交版&…

Android 上下滑隐藏显示状态栏

一、DisplayPolicy类中监听滑动事件,然后发送广播事件 Android12类路径: frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.javamSystemGestures new SystemGesturesPointerEventListener(mUiContext, mHandler,new SystemGest…

SQL注入(head、报错、盲注)

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 1. 报错注入 1.1 那么什么是报错注入呢? 1.2 报错注入原理 extractvalue函数 updatexml函数 1.3 靶场解析 靶场练习 2. HEAD注入 2.1 相关全局变量 2.2 靶场解析 burp暴力破解 靶场练习 3…

java常见面试题汇总

🌏个人博客主页:意疏-CSDN博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 关注 收藏支持一下笔者吧~ 阅读指南: 开篇说明一、封装 继承 多态1.封装2.继承3.多态 二、什么是重载…

初始化列表 / 隐式转换 / 静态

目录 初始化列表隐式转换单参数的隐式类型转换多参数的隐式类型转换explicit关键字 static 初始化列表 大部分时候成员变量在对象实例化的时候调用构造函数就整体定义了,注意此时只有定义,不算初始化。而定义后的值的值是在构造函数里面给的。我们知道构…

<数据集>无人机航拍不同高度牧羊识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:6065张 标注数量(xml文件个数):6065 标注数量(txt文件个数):6065 标注类别数:1 标注类别名称:[sheep] 序号类别名称图片数框数1sheep6065149785 使用标注工具&…

Macos M1 IDEA本地调试 HBase 2.2.2

# 1. 前提 执行 mvn clean package assembly:single -DskipTests没问题,并在hbase-assembly/target目录下生成hbase-2.2.2-bin.tar.gz 文件夹 证明Maven 下载依赖没问题 1.1 报错 1 这里应该是报错找不到 com.google.protobuf:protoc:exe:osx-aarch_64:3.5.1 …

入门STM32—外部中断

外部中断的存在使得微控制器能够及时响应外部事件,避免频繁的轮询操作,从而提高系统的实时性、效率和低功耗性能。 1.什么是外部中断? 外部中断是指微控制器接收到外部引脚的信号变化时触发的中断。STM32F103系列微控制器支持多个外部中断线…

鸿蒙(API 12 Beta3版)【DRM会话管理(C/C++)】数字版权保护开发

DRM会话管理(MediaKeySession)支持媒体密钥管理及媒体解密等,MediaKeySession实例由系统管理里的MediaKeySystem实例创建和销毁。 开发步骤 导入NDK接口,接口中提供了DRM相关的属性和方法,导入方法如下。 #include &…

学习嵌入式第二十九天

ipc进程间通信方式 PC,即进程间通信(Inter-Process Communication),是操作系统中不同进程之间交换数据的一种机制。以下是一些常见的IPC方式: 管道:用于父子进程或兄弟进程之间的通信。消息队列&#xff…

selenium-java实现自动登录跳转页面

如果要一直刷新一个网页,总不能人工一直去点,所以想到大学时候学过selenium技术,写个脚本来一直刷新,因为经常写java语言,所以选用java语言来写 实验环境 注意,需要先准备好Google浏览器和Chrome-Driver驱…

ffmpeg6.1集成Plus-OpenGL-Patch滤镜

可参考上一篇文章。ffmpeg6.1集成ffmpeg-gl-transition滤镜-CSDN博客 安装思路大致相同, 因为 Plus-OpenGL-Patch也是基于 ffmpeg 4.x 进行开发的,所以在高版本上安装会有很多报错。 这是我安装后的示例,需要安装教程或者改代码可私信我。 …

记录一次 Redis 优化发送数据(使用管道批量传送)

一 项目背景 此前的项目中,鉴于客户方服务器的安全配置对 MQ 中间件有所限制,我们只得采用 Redis 的 list 作为简易的 MQ 来传送报文数据。然而,近段时间客户关闭了相关端口,导致大量数据积压,需要进行补发。在补发过程…

大数据背景下基于Python的牛油果销售数据可视化分析

注:源码在最后,只是一次实验记录,不合理的地方自行修改。 一 研究背景及意义 21世纪以来,随着科学技术的进步,人们的生活水平也随之大幅提升提高。在科技和经济快速发展下,全球已经进入了大数据时代。大数…

8.21-部署eleme项目

1.设置主从从mysql57服务器 (1)配置主数据库 [rootmsater_5 ~]# systemctl stop firewalld[rootmsater_5 ~]# setenforce 0[rootmsater_5 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.serv…

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架,它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中,我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序,该程序包含设置标签文本和自增计数器的功能。 …