【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的更多相关文章

  1. historyReverser & array reverse

    historyReverser & array reverse\ "use strict"; /** * * @author xgqfrms * @license MIT ...

  2. html+css笔记

    文档结构 1.html文档结构 ①文档类型声明 严格型(标准模式):    <!DOCTYpE HTML>   HTML5 XHTML 1.0:<!DOCTYpE html pUbL ...

  3. Linux查找命令:grep,awk,sed

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  4. css动画 animation

    今天用css做了一个简单的三角上下移动的一个小动画,说白了就是在改变该物体的height值.除了这个方法,还可以用js. 一.在用css写动画时,一定要记住兼容性问题.如何解决该兼容性?在前面加内核前 ...

  5. 7.Java中的字符串

    1.String的特性 特性一:不可变性 String s=new String("yangyun") s=s.toUpperCase(); 这里的s,s占用的空间是不一样的(地址 ...

  6. css高级

    1.复杂选择器 1.作用 匹配 页面的元素 ... ... 2.选择器分类 1.兄弟选择器 1.作用 通过 元素的位置关系匹配元素 位置关系:兄弟关系(平级元素) <div> <p ...

  7. JavaScript基础---语言基础(4)

    函数,对象和数组 学习要点: 1.函数声明 2.return返回值 3.arguments对象 4.Object类型 5.Array类型 6.对象中的方法 函数是定义一次但却可以调用或执行任意多次的一 ...

  8. android anim 动画效果(转)

    动画效果编程基础--AnimationAndroid      动画类型      Android的animation由四种类型组成      XML中    alpha    渐变透明度动画效果   ...

  9. Android动画的深入分析

    一.AnimationDrawable的使用 详见:Drawable类及XMLDrawable的使用 补充:通过Animation的setAnimationListener()可以给View动画添加监 ...

随机推荐

  1. 小迪安全 Web安全 基础入门 第七天 - 资产泄漏、CMS识别、Git监控、SVN、DS_Store、备份

    一.CMS指纹识别源码获取方式 1.网站特有文件.如/templets/default/style/dedecms.css-dedecms. 2.网站独有文件的MD5.如favicon.ico但是该文 ...

  2. LuoguP2378 因式分解II 题解

    Content 输入一个多项式 \(x^2+ax+b\)(不保证 \(a,b\neq0\)),请对这个多项式进行因式分解(形式为 \((x-x_1)(x-x_2)\),其中 \(x_1>x_2\ ...

  3. my.ini配置文件内容

    # For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.6/en/server-con ...

  4. 【LeetCode】638. Shopping Offers 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 回溯法 日期 题目地址:https://le ...

  5. 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)

    [剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...

  6. Codeforces 1076G Array Game 题解

    目录 题目大意 做法 代码 不想写昨天晚上cf的比赛题目所以来写题解摸摸鱼 题目大意 有一个在长度为\(k\)的正整数序列\(b\)上进行的游戏,一开始一个棋子放在位置\(1\),假如当前棋子的位置为 ...

  7. 解决ubuntu突然无法联网问题

    一.问题描述 今天使用笔记本远程办公的时候,突然电脑无法联网了,使用chrome浏览器访问网页出现如下错误 This site can't be reachedwww.baidu.com's serv ...

  8. gojs 如何实现虚线(蚂蚁线)动画?

    在绘制 dag 图时,通过节点和来箭头的连线来表示节点彼此之间的关系.而节点常常又带有状态,为了更好的表示节点之间的流程关系,loading 状态的节点,与后续节点之间,需要用 动画着的虚线 表示,表 ...

  9. JVM垃圾收集器专题

    垃圾收集器:利用垃圾收集算法,实现垃圾回收的实践落地. 1 HotSpot垃圾回收器 HotSpot垃圾回收器有多个,可以配合使用. 1.1 垃圾回收的一些术语 术语: Stop the world ...

  10. Eclipse设置代码格式化使用空格代替TAB

    Java格式设置 打开Window-Preferences,找到Java-Code Style-Formatter,点击图片中的New.. 给配置起一个名字后,修改配置,找到 Indentation, ...