【reverse】逆向6 JCC

2024-02-13 00:30
文章标签 逆向 reverse jcc

本文主要是介绍【reverse】逆向6 JCC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【reverse】逆向6 JCC

前言

我们之前学习的时候讲了,eip寄存器存储的是当前(即将执行的语句的) 指向地址

而我们之前提到的下断点(F2),就和我们编程中的下断点一样,执行到某句汇编指令然后停住

今天的课程的别名又叫作《修改eip

1、JMP指令

JMP指令的作用类似于mov的作用,只不过mov不用用于eip寄存器,我们要通过jmp指令来操作eip寄存器

并且JMP指令只能作用于eip寄存器

如果我们跳转的位置距离当前位置小于128个字节,会加上short的关键字

如果大于128那么就不会写

JMP发生作用的时候,只会作用与eip寄存器

举个例子

image-20210801082908569

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

image-20210801082931365

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

image-20210801082957763

2、CALL指令

call指令也会让eip跳转到想去的地址,但是call和jmp的区别就是,call跳转的时候,会将call到了ret时候下一个执行的汇编命令的地址存入堆栈中

举个例子

我们call(call到00401006)

image-20210801083854326

call之前的eip和esp

image-20210801083215872

call之前的堆栈

image-20210801083529392

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

image-20210801083934053

运行完之后发现esp(栈顶)的地址-4,也就是堆栈存了一个4字节的数据,eip的地址跑到了我们call的地方

我们来看看堆栈存储的数据,存储了一个返回地址,这个地址是根据我们第一张图可以知道,是call语句之后的下一条语句

image-20210801084140476

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

image-20210801084310726

我们执行一下

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

image-20210801084403205

我们看看堆栈的变化

image-20210801084541254

堆栈当前的指针指向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

image-20210801113659308

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

image-20210801113824623

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

image-20210801114256660

然后运行汇编

image-20210801114325005

得到结果如下

image-20210801114523203

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 equalZF=1if (i == j);if (i == 0);
JNZ/JNE若不为0则跳转;若不相等则跳转jump if not zero;jump if not equalZF=0if (i != j);if (i != 0);
JS若为负则跳转jump if signSF=1if (i < 0);
JNS若为正则跳转jump if not signSF=0if (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 overflowOF=1(null)
JNO若无溢出则跳转jump if not overflowOF=0(null)
JC/JB/JNAE若进位则跳转;若低于则跳转;若不高于等于则跳转jump if carry;jump if below;jump if not above equalCF=1if (i < j);
JNC/JNB/JAE若无进位则跳转;若不低于则跳转;若高于等于则跳转;jump if not carry;jump if not below;jump if above equalCF=0if (i >= j);
JBE/JNA若低于等于则跳转;若不高于则跳转jump if below equal;jump if not aboveZF=1或CF=1if (i <= j);
JNBE/JA若不低于等于则跳转;若高于则跳转jump if not below equal;jump if aboveZF=0或CF=0if (i > j);
JL/JNGE若小于则跳转;若不大于等于则跳转jump if less;jump if not greater equal jumpSF != OFif (si < sj);
JNL/JGE若不小于则跳转;若大于等于则跳转;jump if not less;jump if greater equalSF = OFif (si >= sj);
JLE/JNG若小于等于则跳转;若不大于则跳转jump if less equal;jump if not greaterZF != OF 或 ZF=1if (si <= sj);
JNLE/JG若不小于等于则跳转;若大于则跳转jump if not less equal;jump if greaterSF=0F 且 ZF=0if(si>sj)

这篇关于【reverse】逆向6 JCC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704006

相关文章

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

转:android ro.debuggable属性调试修改(mprop逆向)

android ro属性调试修改(mprop逆向)      大家都知道如果需要调试android 的程序,以下两个条件满足一个就行。第一是apk的配置文件内的AndroidManifest.xml的 android:debuggable=”true”,第二就是/default.prop中ro.debuggable=1。两种方式第一种通常是解包添加属性再打包,随着加壳软件以及apk校验等,容易出

某里227逆向分析

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除! 前言 这次会简单的讲解阿里227版本滑块参数n的逆向分析流程以及简单的补环境,如果有疑问可以在评论区交流讨论,我看到会及时回复的,另外,有需要可联系我。 一

leetcode#541. Reverse String II

题目 Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of

【MyBatis学习14】MyBatis的逆向工程生成代码

1. 什么是逆向工程 mybatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。 2. 使用逆向工程 使用mybatis的逆向工程,需要导入逆向

js逆向--cai招网

js逆向--cai招网 一、寻找加密入口1、抓包2、关键字搜索寻找加密入口 二、调试js三、python代码实现 一、寻找加密入口 1、抓包 目标数据来源网址为:https://search.bidcenter.com.cn/search?keywords=%E5%85%AC%E5%85%B1%E4%BD%8F%E5%AE%85,打开开发者工具进行抓包。 目标响应数据被加密。

NRF51822 小黄车智能锁 逆向工程

笔者在夜跑时发现有人将拆下的小黄车智能锁丢弃在花园角落,于是萌生了拆解的想法。 拆开外壳后发现MCU 是NRF51822 ,并且预留了Jlink 调试接口,更萌生了逆向这个电路板的想法 下面是 各个智能锁厂家提供的方案: 摩拜单车:STM32F1+GSM+GPS 使用芯片 STM32F401 + NRF51802(BLE)+TD1030 泰斗定位芯片+BQ25895(充电管理)+C3Hx(

某城user_dun,js逆向分析

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除! 前言 这次会简单的讲解某城ly headers中参数userdun的逆向分析流程以及简单的补环境,如果有疑问可以在评论区交流讨论,我看到会及时回复的,另外,有

【js逆向专题】9.SM国密系列

本教程仅供学习交流使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,请各位自觉遵守相关法律法规。 目录 一.算法简介1.1 算法分类1.1.1 `SM2` 椭圆曲线公钥加密算法1.1.2` SM4 `分组加密算法 二.算法实现1. JavaScript实现1. `SM2`2. `sm3`3. `sm4` 2`python`实现1. `sm2`2.`sm3`3. `s

Mybatis 逆向生成工具mybatis-generator-core-1.3.2.jar的使用

mybatis-generator-core-1.3.2.jar用来生成我们的项目代码,今天分享一下,这个工具,神器之处,在于不仅仅生成dao,mapper还有service层,web层都可以根据数据库反射生成出来。上图 如图,使用mybatis,无非就用××××EntitySqlProvider或××××EntityMapper.xml两种形式书写sql语句,生成方法本文均提供 展开图