0x01 常用汇编指令

mov就比较熟悉了,前面练习使用的都是这个指令,支持以下用法

mov r,imm    立即数到寄存器
mov r,m 内存到寄存器
mov r,r 寄存器到寄存器
mov m,r 寄存器到内存
mov m,imm 立即数到内存r是寄存器,m是内存,imm是立即数

这个就不再演示了

add 加法

先将eax值设置为1,然后给eax寄存器的值增加4

add eax,4

运行结果如下

sub 减法

基于上一部操作,给eax寄存器的值减少2

sub eax,2

运算结果如下

and 与运算

ecx设置为1,和上一步操作的的eax进行与运算

and eax,ecx

运算结果如下

这里其实是00110001的与运算,结果肯定为1

or 或运算

ecx设置为3,和上一步操作的eax进行或运算

or eax,ecx

运行结果如下

实际就是00010011进行或运算,结果为3

not 非运算

直接对上一步的eax取非

not eax

运行结果如下

3转为000 0000 0000 0000 0000 0000 0000 0011二进制,取非就是1111 1111 1111 1111 1111 1111 1111 1100FFFFFFFC

movs 移动数据

mov指令不能完成内存到内存的操作,但是movs指令可以。由于内存需要指令数据宽度,所以一共有下面3种写法

movs byte ptr es:[edi],byte ptr ds:[esi]                     简写:movsb
movs word ptr es:[edi],word ptr ds:[esi]                        简写:movsw
movs dword ptr es:[edi],dword ptr ds:[esi]                      简写:movsd

这里的esiedi两个寄存器用来存放需要调整数据的内存地址。

举个例子,这里我将0012FFC8的值改为1,然后将这个值移动到0012FFF0

mov edi,0012FFF0
mov esi,0012FFC8
movs dword ptr es:[edi],dword ptr ds:[esi]

运行指令结果如下

0012fff0值已成功修改,这里除了内存的值移动修改外,还有一个需要注意的点,就是寄存器的值。

可以发现这两个寄存器的值和之前设置的都不一样了,全部都增加了4,这个增加4或者2或者1取决于数据宽度,是增加还是减少取决于EFL寄存器中DF(第10位)的取值,当DF0时,进行增加,当DF1时,进行减少。

这里将EFL第十位更改为1后,值为00000606再次进行测试

此时0012FFCC的值为1A2B,再次运行指令

movs dword ptr es:[edi],dword ptr ds:[esi]


可以看到值已经修改完成,同时再次观察esiedi寄存器的值

发现已经减少4,完成实验。

stos,将al/ax/eax的值存储到[edi]指定的内存单元

在学习了一上一个指令后,看完解释,应该可以理解此命令等同于下面两条指令

    mov [edi], eaxadd edi, 4       ;或者 sub edi, 4

同样也是存到内存中,所以和数据宽度也有关系

stos byte ptr es:[edi]           简写为stosb,对应的就是al寄存器
stos word ptr es:[edi]          简写为stosw,对应的就是ax寄存器
stos dword ptr es:[edi]         简写为stosd,对应的就是eax寄存器

目前DF位为1,则存储后会减少,这里使用ax做测试,先将eax设置为0,此时[edi]0012fff0,然后运行以下指令

mov ax,1a2b
stos word ptr es:[edi]

运行后结果如下

运行结果如期,同时观察edi寄存器

确实也是在之前的寄存器的值上减少了2,因为用的是word,所以只减少2

rep,按计数寄存器ecx中指定的次数重复执行字符串指令

比如可以重复使用stosmovs等命令。比如重复10stos,当前ax4444edi0012FFEE,运行以下代码

mov ecx,0xa
rep stos word ptr es:[edi]

运行结果如下

同时的edi也减少了10*2


0x02 堆栈常用指令

堆栈是什么?

其实我现在还没太理解清楚,还挺模糊的,按教程老师讲的话就是,程序运行时操作系统为程序分配好的内存,供程序使用。

可以通过FS位查看到堆栈的信息,

在内存窗口中输入dd 7ffde000

可以看到栈底是0012d000,栈顶是00130000,堆栈是从大往小用的。

ESP寄存器

esp栈指针寄存器,存放当前的栈用到哪了。

push指令

用于向栈中压入数据的同时修改(减少)esp寄存器,可以支持以下命令

push r
push m
pusm imm

运行命令push 1111

可以看到,直接基于栈指针之上的内存地址写入了1111,同时将原本ESP的值0012ffc4改为了0012ffc0,减少了4

pop指令

将栈当前数据存入到寄存器或者内存中,同时ESP的值增加,感觉就和push是相反的。

pop ebp

运行指令后,结果如下

ebp中已存入1111,同时也将esp的值增加至0012ffc4


0x03 修改eip的指令

eip寄存器存放着是cpu下一次会执行的指令,是不可以通过mov指令来进行修改的。

jmp指令

jmp命令相当于 mov eip,1 ,专用于修改eip寄存器。可以支持两种方式

jmp r
jmp imm

立即数要写成内存地址的格式,并且此内存地址需要使用,当然也可以使用寄存器。

mov eax,0040ef57
jmp eax

按第一个f8

可以看到,多出了个红色箭头指向了下一次要执行命令的地方,再按第二个f8

eip已经成功修改。

call指令

call指令功能和jmp基本一样,在此基础上,还在堆栈中存储call指令的下一行地址

CALL 0040EF35

使用f7进行调试

可以看到eip成功修改,同时esp指针也减少了4,并且将call指令的下一行地址进行存储。

ret指令

相当于下列两条指令

jmp [esp]
add esp,4


可以看到将栈顶的值存入了eip中,同时将esp的值增加4指向下一个值。

逆向入门(4)汇编篇-常用指令的学习相关推荐

  1. Vue学习(入门实例、常用指令)-学习笔记

    文章目录 Vue学习(入门实例.常用指令)-学习笔记 实例 常用指令 v-on v-bind v-for v-html v-if event v-model 双向数据绑定实现 - defineProp ...

  2. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  3. MIPS介绍与MIPS汇编的常用指令

    描述 CTF做题时会遇见MIPS汇编的题目,而我们接触的是8086汇编,IDA是不能反汇编的需要自己了解一些MIPS方面的知识; 1. List 1 在不同的设备中,汇编语言对应着不同的机器语言指令集 ...

  4. 汇编8086CPU常用指令——详解

    数据传送类指令 数据传送是计算机中最基本.最重要的一种操作,数据传送指令的功能是把数据从一个位置传送到另一个位置. 1. 通用数据传送指令 (1) MOV指令 指令格式:MOV dest , src ...

  5. linux開啟虛擬機命令,Linux系统入门之虚拟机与常用指令学习

    在学习linux基础的时候,为了避免一个操作删了系统或者库什么的造成不必要的严重影响,我们在虚拟机中进行操作. 那什么是虚拟机呢?百度这么说的:在实体计算机上,通过软件模拟出的一台或者多台虚拟计算机叫 ...

  6. 【Android 逆向】x86 汇编 ( cmp 比较指令 | test 比较指令 )

    文章目录 一.cmp 比较指令 二.test 比较指令 总结 一.cmp 比较指令 cmp 指令通过 减法运算 , 影响标志位 CPAZO ; cmp eax, ebx 上述指令执行时 , eax - ...

  7. c语言笔记照片_C语言入门这一篇就够了-学习笔记

    按照之前的计划,这篇文章本该写C语言简介,包括一些历史背景,发展状况, 语言特点什么的,这些东西着实比较啰嗦. 吃饭用的筷子,到现在我都不知道它的由来,不知道它是在什么历史背景下诞生的 有些东西还是有 ...

  8. 0-c语言入门这一篇就够了-学习笔记(一万字)

    内容来自慕课网,个人学习笔记.加上了mtianyan标签标记知识点. C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C ...

  9. linux入门与常用指令

    前言 在入门linux的时候感觉大部分很糟糕的,尤其是java开发者来说,对于非运维人员可能刚开始会对linux有很大的抵触性,可能还是更多喜欢桌面操作.或者在之前的学习中本来web的一堆东西就已经够 ...

  10. 80×86汇编常用指令

    80×86汇编常用指令 一.数据传送指令 1. 通用数据传送指令 简写 英文全称 执行操作 MOV move 传送 MOVSX move with sign-extend 带符号扩展传送 MOVZX ...

最新文章

  1. 早上突然看明白 shader和材质球的关系
  2. 深度学习中图片数据增强方法
  3. BeetleX框架详解-小结
  4. 有了容器为什么kubernetes还需要Pod?
  5. cf1562 C. Rings
  6. js 文件上传进度条
  7. json处理为字符串,主要函数,dumps和loads
  8. 如何将位图格式图片文件(.bmp)生成geotiff格式图片?
  9. Linux服务简单优化
  10. osgearth各版本源码下载
  11. python stacktrace_pystack--python stack trace--让python打印线程栈信息
  12. 海洋cms标签-海洋cms模板标签手册-海洋cms模板标签全套
  13. 《简单法则》读书笔记
  14. Java自学全套视频(jse,jee,ssh,android,oracle,linux,html,js,jQuery等)下载地址
  15. Emacs 生存指南
  16. 活动目录安装|活动目录教程
  17. 花荣《至尊狐狸》中国股市精英最优套利战术读书笔记
  18. PHP 大流量高并发解决方案
  19. Flutter 关于图片的保存以及权限申请及安卓配置
  20. 第一次参加项目的经历(参加活动,获取高级背包)

热门文章

  1. roadrunner中文文档(四)app服务器
  2. 重庆大学大数据与软件学院阿里云大数据实训总结报告
  3. html全部颜色代码大全,html代码大全(基础使用代码)(颜色代码完整版)
  4. 仿微信语音输入页面(讯飞语音)
  5. Flutter中,idevice_id和iproxy无法打开的问题(真机调试卡在启动页进不去)
  6. 逍遥魔兽手动打开mysql_逍遥魔兽gm命令使用
  7. 用了这么多年Redis,你知道Redis名字的由来吗?
  8. 【Java】Deprecated 注解
  9. 外贸小公司如何做谷歌SEO优化
  10. Linux下编译链接动态库符号问题