逆向入门(4)汇编篇-常用指令的学习
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
运算结果如下
这里其实是0011
与0001
的与运算,结果肯定为1
or 或运算
将ecx
设置为3
,和上一步操作的eax
进行或运算
or eax,ecx
运行结果如下
实际就是0001
和0011
进行或运算,结果为3
not 非运算
直接对上一步的eax
取非
not eax
运行结果如下
3
转为000 0000 0000 0000 0000 0000 0000 0011
二进制,取非就是1111 1111 1111 1111 1111 1111 1111 1100
即FFFFFFFC
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
这里的esi
和edi
两个寄存器用来存放需要调整数据的内存地址。
举个例子,这里我将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位)
的取值,当DF
为0
时,进行增加,当DF
为1
时,进行减少。
这里将EFL
第十位更改为1
后,值为00000606
再次进行测试
此时0012FFCC
的值为1A2B
,再次运行指令
movs dword ptr es:[edi],dword ptr ds:[esi]
可以看到值已经修改完成,同时再次观察esi
和edi
寄存器的值
发现已经减少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
中指定的次数重复执行字符串指令
比如可以重复使用stos
,movs
等命令。比如重复10
次stos
,当前ax
为4444
,edi
为0012FFEE
,运行以下代码
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)汇编篇-常用指令的学习相关推荐
- Vue学习(入门实例、常用指令)-学习笔记
文章目录 Vue学习(入门实例.常用指令)-学习笔记 实例 常用指令 v-on v-bind v-for v-html v-if event v-model 双向数据绑定实现 - defineProp ...
- Python语言入门这一篇就够了-学习笔记(十二万字)
Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...
- MIPS介绍与MIPS汇编的常用指令
描述 CTF做题时会遇见MIPS汇编的题目,而我们接触的是8086汇编,IDA是不能反汇编的需要自己了解一些MIPS方面的知识; 1. List 1 在不同的设备中,汇编语言对应着不同的机器语言指令集 ...
- 汇编8086CPU常用指令——详解
数据传送类指令 数据传送是计算机中最基本.最重要的一种操作,数据传送指令的功能是把数据从一个位置传送到另一个位置. 1. 通用数据传送指令 (1) MOV指令 指令格式:MOV dest , src ...
- linux開啟虛擬機命令,Linux系统入门之虚拟机与常用指令学习
在学习linux基础的时候,为了避免一个操作删了系统或者库什么的造成不必要的严重影响,我们在虚拟机中进行操作. 那什么是虚拟机呢?百度这么说的:在实体计算机上,通过软件模拟出的一台或者多台虚拟计算机叫 ...
- 【Android 逆向】x86 汇编 ( cmp 比较指令 | test 比较指令 )
文章目录 一.cmp 比较指令 二.test 比较指令 总结 一.cmp 比较指令 cmp 指令通过 减法运算 , 影响标志位 CPAZO ; cmp eax, ebx 上述指令执行时 , eax - ...
- c语言笔记照片_C语言入门这一篇就够了-学习笔记
按照之前的计划,这篇文章本该写C语言简介,包括一些历史背景,发展状况, 语言特点什么的,这些东西着实比较啰嗦. 吃饭用的筷子,到现在我都不知道它的由来,不知道它是在什么历史背景下诞生的 有些东西还是有 ...
- 0-c语言入门这一篇就够了-学习笔记(一万字)
内容来自慕课网,个人学习笔记.加上了mtianyan标签标记知识点. C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C ...
- linux入门与常用指令
前言 在入门linux的时候感觉大部分很糟糕的,尤其是java开发者来说,对于非运维人员可能刚开始会对linux有很大的抵触性,可能还是更多喜欢桌面操作.或者在之前的学习中本来web的一堆东西就已经够 ...
- 80×86汇编常用指令
80×86汇编常用指令 一.数据传送指令 1. 通用数据传送指令 简写 英文全称 执行操作 MOV move 传送 MOVSX move with sign-extend 带符号扩展传送 MOVZX ...
最新文章
- 早上突然看明白 shader和材质球的关系
- 深度学习中图片数据增强方法
- BeetleX框架详解-小结
- 有了容器为什么kubernetes还需要Pod?
- cf1562 C. Rings
- js 文件上传进度条
- json处理为字符串,主要函数,dumps和loads
- 如何将位图格式图片文件(.bmp)生成geotiff格式图片?
- Linux服务简单优化
- osgearth各版本源码下载
- python stacktrace_pystack--python stack trace--让python打印线程栈信息
- 海洋cms标签-海洋cms模板标签手册-海洋cms模板标签全套
- 《简单法则》读书笔记
- Java自学全套视频(jse,jee,ssh,android,oracle,linux,html,js,jQuery等)下载地址
- Emacs 生存指南
- 活动目录安装|活动目录教程
- 花荣《至尊狐狸》中国股市精英最优套利战术读书笔记
- PHP 大流量高并发解决方案
- Flutter 关于图片的保存以及权限申请及安卓配置
- 第一次参加项目的经历(参加活动,获取高级背包)
热门文章
- roadrunner中文文档(四)app服务器
- 重庆大学大数据与软件学院阿里云大数据实训总结报告
- html全部颜色代码大全,html代码大全(基础使用代码)(颜色代码完整版)
- 仿微信语音输入页面(讯飞语音)
- Flutter中,idevice_id和iproxy无法打开的问题(真机调试卡在启动页进不去)
- 逍遥魔兽手动打开mysql_逍遥魔兽gm命令使用
- 用了这么多年Redis,你知道Redis名字的由来吗?
- 【Java】Deprecated 注解
- 外贸小公司如何做谷歌SEO优化
- Linux下编译链接动态库符号问题