shellcode汇编复习

news2024/9/28 9:21:25

shellcode汇编复习

  • 一、 汇编代码复习
  • 二、 基础寄存器
    • 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使用详解。
在这里插入图片描述

二、 基础寄存器

在计算机体系结构中,特别是在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, 1
    sub eax, 1
    jz 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 _start

print_hello:
    ; 假设这里有一段打印"Hello, World!"的代码
    ; 注意:实际的系统调用依赖于操作系统和具体架构
    ; 这里只是一个示意
    ret

_start:
    ; 调用print_hello函数
    call print_hello

    ; 接下来可以是程序的其他部分
    ; ...

    ; 注意:在实际的Linux程序中,你需要通过系统调用来退出程序
    ; 这里为了示例的简洁性省略了

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

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

相关文章

vue js 前端同时下载多个文件,前端多文件下载

在日常需求中,一般情况下,单次点击下载文件数量一般是一个,当然也有多个文件同时下载的需求,由于浏览器机制,不支持直接多个文件下载,所有需要特殊处理 案例图 不多说了,直接上代码 //下载文…

Transformer经典模型实战:零基础训练一个面向中文的T5模型(Text to Text Transfer Transformer)

scient scient一个用python实现科学计算相关算法的包,包括自然语言、图像、神经网络、优化算法、机器学习、图计算等模块。 scient源码和编译安装包可以在Python package index获取。 The source code and binary installers for the latest released version ar…

景联文科技提供语音采集服务:开启智能交互新纪元

随着人工智能技术的飞速发展,语音交互已成为连接人与智能设备的重要桥梁。无论是智能助手、智能家居还是自动驾驶汽车,语音识别技术都是其背后不可或缺的核心力量。 为了满足各行各业对高质量语音数据的需求,景联文科技凭借自身强大的数据采集…

XGen —— 导入Hou

动力学解算 选择description,转化为交互式Groom; 选择description,将引导线转化为曲线; 添加linearWire,并选择转化后的曲线生成解算线 选择上述生成的解算线,创建动力学; 导出解算的Xgen 导出a…

Edge SCDN:构建更快更安全的网络世界

什么是Edge SCDN? Edge SCDN,即边缘安全加速,是一种结合了传统CDN(内容分发网络)技术与网络安全防护功能的服务。传统的CDN通过在全球范围内分布服务器节点来加速网站内容的分发,提高访问速度和用户体验。…

备考计算机二级Python之Day4作业编程题

1、输入一个年份,输出是否为闰年。 #闰年条件:能被4整除但不能被100整除,或者能被400整除的年份都是闰年。 neval(input("请输入一个年份:")) if (n%40 and n%100!0) or (n%4000):print("该年份是闰年") els…

68 H3C SecPath F1000 (系统模块介绍-1)

68 H3C SecPath F1000 (系统模块介绍) 01-高可靠性 特性简介 高可靠性(High Availability),简称为HA,能够在通信线路或设备产生故障时提供备用方案,当其中一个网络节点发生故障时&#xff0c…

生信是什么?生物信息学的基础概念与应用领域-生信圆桌

介绍 生信,全称为生物信息学(Bioinformatics),是指将计算机科学、数学和统计学的方法应用于生物学数据的处理、分析和解释。随着基因组测序技术的发展和大规模生物数据的产生,生物信息学成为了生命科学研究中的一个核…

浅谈AI+工业视觉检测技术应用的优化

1 高质量替代人眼,助力智能制造 视觉是人类获取信息最主要的渠道,它使人们得以感知和理解周边的世界。通过视觉,人类可以感知外界物体的大小、明暗、颜色、动静,获得对机体生存具有重要意义的各种信息。人类的大脑皮层约有70%都在…

arthas源码刨析:arthas 命令粗谈(3)

文章目录 dashboardwatchretransform 前面介绍了 arthas 启动相关的代码并聊了聊怎么到一个 shellserver 的建立。 本篇我们来探讨一下几个使用频次非常高的命令是如何实现的。 dashboard 想看这个命令的主要原因是编程这些年来从来没有开发过 terminal 的这种比较花哨的界面&a…

最新出炉 -Web自动化测试之playwright:概述

概述 playwright是由微软开发的Web UI自动化测试工具, 支持Node.js、Python、C# 和 Java语言,本文将介绍playwright的特性以及它的简单使用。 playwright特性 playwright具有以下特点: 一、支持所有主流浏览器 支持所有主流浏览器&#x…

从开发到集成:视频美颜SDK与直播美颜API详解

在本文中,我们将详细探讨视频美颜SDK的开发过程及其与直播美颜API的集成方案,帮助开发者更好地理解和应用这些技术。 一、视频美颜SDK的开发概述 视频美颜SDK是一个用于实时视频处理的开发工具包,提供了包括磨皮、美白、瘦脸、眼睛放大等多…

各类软件历史版本的下载地址

postman,notpad等 https://www.filehorse.com/software-developer-tools/https://www.filehorse.com/software-developer-tools/

数业智能心大陆AI大模型,共情陪伴你的心理健康

大模型的出现,使得AI在语音识别、自然语言处理、计算机视觉等领域的性能得到了极大的提升,随着硬件设备的不断升级和优化,以及算法的不断改进,大模型的规模和性能也在不断提升,大模型的优势在于其强大的表示能力和泛化…

不愿回流上班,离职博主们不断寻找新的“栖息地”

文 | 螳螂观察 作者 | 如意 “替大家试过了,不上班真的很爽。” “985本硕,年薪40万裸辞了。” “不干了,谁家好人半夜12点还在司啊!” 标题熟悉吧?对,这拨人你一定看到了,说人生是旷野&am…

45+用户占比近30%,网文产业如何赋能IP长链?

网文市场加速发展,巨头抢占中老年用户 作者|吕娆炜 排版|张思琪 干货抢先看 1. 我国网文产业市场规模突破3000亿元,在用户方面,截至2023年底,我国网文用户数量达5.37亿,同比增长9%&#xff0c…

【FreeRTOS】信号量

0 前言 学习视频: 【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 00:42】 https://www.bilibili.com/video/BV1Jw411i7Fz/?p39&share_sourcecopy_web&…

源2.0-M32大模型发布4bit/8bit量化版! 运行显存仅需23GB,性能可媲美LLaMA3

近日,浪潮信息发布源2.0-M32大模型4bit和8bit量化版,性能比肩700亿参数的LLaMA3开源大模型。4bit量化版推理运行显存仅需23.27GB,处理每token所需算力约为1.9 GFLOPs,算力消耗仅为同等当量大模型LLaMA3-70B的1/80。而LLaMA3-70B运…

删除Eureka注册中心已经注册的服务

1.登录Eureka查看需要删除的服务。 2.使用postman或者apipost工具,请求方式DELETE, 接口地址输入:eureka的ip地址/eureka/apps/ Application / Status 例如: http://192.168.194.60:8761/eureka/apps/VUE-MANAGER-SERVICE/10.42.0.138:vue-manager…

酷家乐 同盾滑块分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我…