【reverse】逆向6 JCC
【reverse】逆向6 JCC
前言
我们之前学习的时候讲了,eip寄存器存储的是当前(即将执行的语句的) 指向地址
而我们之前提到的下断点(F2),就和我们编程中的下断点一样,执行到某句汇编指令然后停住
今天的课程的别名又叫作《修改eip》
1、JMP指令
JMP指令的作用类似于mov的作用,只不过mov不用用于eip寄存器,我们要通过jmp指令来操作eip寄存器
并且JMP指令只能作用于eip寄存器
如果我们跳转的位置距离当前位置小于128个字节,会加上short的关键字
如果大于128那么就不会写
JMP发生作用的时候,只会作用与eip寄存器
举个例子

这个时候,我们的eip存储的内存地址为

我们运行一下jmp指令,发现eip存储的内存地址为我们jmp的内存地址

2、CALL指令
call指令也会让eip跳转到想去的地址,但是call和jmp的区别就是,call跳转的时候,会将call到了ret时候下一个执行的汇编命令的地址存入堆栈中
举个例子
我们call(call到00401006)

call之前的eip和esp

call之前的堆栈

我们运行一下call指令(在00401006这里下断点)

运行完之后发现esp(栈顶)的地址-4,也就是堆栈存了一个4字节的数据,eip的地址跑到了我们call的地方
我们来看看堆栈存储的数据,存储了一个返回地址,这个地址是根据我们第一张图可以知道,是call语句之后的下一条语句

然后我们再再00401006上汇编一条retn语句

我们执行一下
发现我们的esp和eip也变了,esp的地址+4,说明pop了刚刚存储的返回地址,eip指向的就是刚刚的返回地址

我们看看堆栈的变化

堆栈当前的指针指向0019ff74,pop了上面的0019ff70
这就是call和retn的功能,retn的作用其实就相当于是pop eip,只不过不允许这么写
我们在用正向代码运行函数的时候,其实就是不断的存储返回地址到堆栈中,然后执行函数的功能,最后retn到原来的内存地址上
3、CMP指令
指令格式
cmp R/M,R/M/IMM
该指令是比较两个操作数,实际上,它相当于sub指令,但是相减的结构并不是保存到第一个操作数中
只是根据相减的结果来改变标志位的,当两个操作数相等的时候,ZF = 1
所以cmp的作用就是sub的作用而不该寄存器的值,仅仅是改变标志寄存器
cmp一般用于比较两个数是否相等
同时,我们可以观察SF位,如果SF = 1,那么说明第一个数据比第二个数据小,反之成立
当然cmp不仅仅可以比较两个通用寄存器,同时也可以比较寄存器和一块内存地址存储的数据(前提是 数据宽度一样)
cmp eax,ecx
cmp eax,dword ptr ds:[405000]
我们进行一个测试
首先给eax和ecx分别赋值0x1和0x2,然后给所有的标志寄存器置0

然后运行cmp汇编指令,标志寄存器结果如下

cf = 1因为0x1-0x2产生了借位
pf = 1因为得到的结果是ffff ffff,最低有效字节是ff,换成2进制,1111 1111,有偶数个1,所以置1
af = 1因为辅助位借位了
zf = 0因为相减结果是ffff ffff不为0
sf = 1因为符号位是1
of = 0 因为没有溢出
4、TEST值指令
指令格式:
TEST R/M,R/M/IMM
该指令在逻辑程度上和CMP指令类似,两个数值进行 与 操作,结果不保存,仅仅改变标志位
常见用法:
判断某个寄存器是否等于0
# 判断eax是否存值为0
test eax,eax
举个例子
我们把eax置0,把标志位寄存器全部置0

然后运行汇编

得到结果如下

cf = 0 因为与运算没有进位或借位
pf = 1 因为结果结果为0000 0000,最低有效字节是00,有0(偶数)个1,所以为1
af = 0 因为与运算没有进位或借位
zf = 1 因为结果为0
sf = 0 因为符号位就是0
of = 0 因为没有溢出
5、JCC
JCC说白了就是不同情况下的jmp,根据标志寄存器来跳转
先理解,然后背诵
JCC只与符号标志位有关,不影响堆栈、不影响寄存器
JE、JZ
je = jump if equal
jz = jump if zero
ZF = 1 跳转
结果为0则跳转(相等时跳转)
JNE、JNZ
jne = jump if not equal
jnz = jump if not zero
ZF = 0 跳转
结果不为0则跳转(不相等时跳转)
JS
js = jump if SF
SF = 1 跳转
结果为负数则跳转
JNS
JNS = jump if not SF
SF = 0 跳转
结果为正数则跳转
JP、JPE
JP = jump if PF
JPE = jump if even (偶数)
PF = 1 跳转
结果中最低有效字节中1的个数为偶数则跳转
JNP、JPO
JNP = jump if not PF
JPO = Jump if odd(奇数)
PF = 0 跳转
结果中最低有效字节中1的个数为奇数则跳转
JO
JO = jump if OF
OF = 1 跳转
有溢出就跳转
JNO
JNO = jump if not OF
OF = 0 跳转
没有溢出就跳转
JC、JB、JNAE
存jump if carry;jump if below;jump if not above equal
一般是与cmp一起用
mov ax,2
cmp ax,3 # 比较ax的值和3
jb next # 小于就转到next
大于则跳转(无符号数)
CF = 1跳转
JNC、JNB、JAE
jump if not carry;jump if not below;jump if above equal
大于等于则跳转(无符号数)
CF = 0 跳转
JBE、JNA
 jump if below equal;jump if not above
小于等于则跳转(无符号数)
CF = 1 or ZF =1
JNBE、JA
 jump if not below equal;jump if above
大于则跳转(无符号数)
CF = 0 and ZF = 0
JL、JNGE
 jump if less;jump if not greater equal jump
小于则跳转(有符号数)
SF != OF
JNL、JGE
 jump if not less;jump if greater equal
大于等于则跳转(有符号数)
SF = OF
JLE、JNG
 jump if less equal;jump if not greater
小于等于则跳转(有符号数)
ZF = 1 or SF != OF
JNLE、JG
 jump if not less equal;jump if greater
大于则跳转(有符号数)
ZF = 0 and SF = OF
6、JCC总结
| JCC指令 | 中文含义 | 英文原意 | 检查符号位 | 典型C应用 | 
|---|---|---|---|---|
JZ/JE | 
若为0则跳转;若相等则跳转 | jump if zero;jump if equal | ZF=1 | 
if (i == j);if (i == 0); | 
JNZ/JNE | 
若不为0则跳转;若不相等则跳转 | jump if not zero;jump if not equal | ZF=0 | 
if (i != j);if (i != 0); | 
JS | 
若为负则跳转 | jump if sign | SF=1 | 
if (i < 0); | 
JNS | 
若为正则跳转 | jump if not sign | SF=0 | 
if (i > 0); | 
JP/JPE | 
若1出现次数为偶数则跳转 | jump if Parity (Even) | PF=1 | 
(null) | 
JNP/JPO | 
若1出现次数为奇数则跳转 | jump if not parity (odd) | PF=0 | 
(null) | 
JO | 
若溢出则跳转 | jump if overflow | OF=1 | 
(null) | 
JNO | 
若无溢出则跳转 | jump if not overflow | OF=0 | 
(null) | 
JC/JB/JNAE | 
若进位则跳转;若低于则跳转;若不高于等于则跳转 | jump if carry;jump if below;jump if not above equal | CF=1 | 
if (i < j); | 
JNC/JNB/JAE | 
若无进位则跳转;若不低于则跳转;若高于等于则跳转; | jump if not carry;jump if not below;jump if above equal | CF=0 | 
if (i >= j); | 
JBE/JNA | 
若低于等于则跳转;若不高于则跳转 | jump if below equal;jump if not above | ZF=1或CF=1 | 
if (i <= j); | 
JNBE/JA | 
若不低于等于则跳转;若高于则跳转 | jump if not below equal;jump if above | ZF=0或CF=0 | 
if (i > j); | 
JL/JNGE | 
若小于则跳转;若不大于等于则跳转 | jump if less;jump if not greater equal jump | SF != OF | 
if (si < sj); | 
JNL/JGE | 
若不小于则跳转;若大于等于则跳转; | jump if not less;jump if greater equal | SF = OF | 
if (si >= sj); | 
JLE/JNG | 
若小于等于则跳转;若不大于则跳转 | jump if less equal;jump if not greater | ZF != OF 或 ZF=1 | 
if (si <= sj); | 
JNLE/JG | 
若不小于等于则跳转;若大于则跳转 | jump if not less equal;jump if greater | SF=0F 且 ZF=0 | 
if(si>sj) | 
【reverse】逆向6 JCC的更多相关文章
- historyReverser & array reverse
		
historyReverser & array reverse\ "use strict"; /** * * @author xgqfrms * @license MIT ...
 - html+css笔记
		
文档结构 1.html文档结构 ①文档类型声明 严格型(标准模式): <!DOCTYpE HTML> HTML5 XHTML 1.0:<!DOCTYpE html pUbL ...
 - Linux查找命令:grep,awk,sed
		
grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...
 - css动画  animation
		
今天用css做了一个简单的三角上下移动的一个小动画,说白了就是在改变该物体的height值.除了这个方法,还可以用js. 一.在用css写动画时,一定要记住兼容性问题.如何解决该兼容性?在前面加内核前 ...
 - 7.Java中的字符串
		
1.String的特性 特性一:不可变性 String s=new String("yangyun") s=s.toUpperCase(); 这里的s,s占用的空间是不一样的(地址 ...
 - css高级
		
1.复杂选择器 1.作用 匹配 页面的元素 ... ... 2.选择器分类 1.兄弟选择器 1.作用 通过 元素的位置关系匹配元素 位置关系:兄弟关系(平级元素) <div> <p ...
 - JavaScript基础---语言基础(4)
		
函数,对象和数组 学习要点: 1.函数声明 2.return返回值 3.arguments对象 4.Object类型 5.Array类型 6.对象中的方法 函数是定义一次但却可以调用或执行任意多次的一 ...
 - android anim 动画效果(转)
		
动画效果编程基础--AnimationAndroid 动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 ...
 - Android动画的深入分析
		
一.AnimationDrawable的使用 详见:Drawable类及XMLDrawable的使用 补充:通过Animation的setAnimationListener()可以给View动画添加监 ...
 
随机推荐
- svn服务器用户名密码更改后,如何更新本地用户名密码
			
在提交时,IDE会给出这样的提示,说明用户名密码已更改 在命令行输入 svn ls https:XXX(项目的地址),具体步骤如下图
 - ByteBuddy代码生成技术
			
简介 如官网所说Byte Buddy 是一个代码生成和操作库,用于在Java应用程序运行时创建和修改Java类,而无需编译器的帮助.除了Java类库附带的代码生成实用程序外,Byte Buddy还允许 ...
 - 【LeetCode】653. Two Sum IV - Input is a BST 解题报告(Python)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:BFS 方法二:DFS 日期 题目地址:ht ...
 - 【LeetCode】28. Implement strStr() 解题报告(Python)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 find函数 遍历+切片 日期 题目地址:https ...
 - 【LeetCode】676. Implement Magic Dictionary 解题报告(Python & C++)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 汉明间距 日期 题目地址:https://le ...
 - 【LeetCode】142. Linked List Cycle II 解题报告(Python & C++)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 set 日期 题目地址:https://le ...
 - 【LeetCode】154. Find Minimum in Rotated Sorted Array II 解题报告(Python)
			
[LeetCode]154. Find Minimum in Rotated Sorted Array II 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...
 - MySQL定时备份数据库方案
			
MySQL数据备份 1.备份全部数据库的数据和结构 mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql 2.备份全部数据库的结构(加 ...
 - linux中网络存储与考试系统搭建(实现多用户可以共享文件)
			
上期内容回顾 1.数据备份的方式有哪些 全量和增量 2.数据备份的命令有哪些 都有哪些优点缺点 cp : 本地复制,全量复制 scp : 远程复制,全量复制 rsync : 远程复制,增量复制 3.r ...
 - PS8625替代方案CS5211|CS5211可以替代兼容PS8625方案|DP转LVDS芯片方案
			
PS8625|Parade普瑞 PS8625|Parade普瑞 PS8625芯片|Parade普瑞 PS8625方案|Parade普瑞 PS8625芯片代理|DP转LVDS|PS8625替代方案CS5 ...