avatar

我可是会飞的啊

找对象ing

  • 首页
  • ctfs
  • 关于
  • 文件库
  • 留言板
  • 标签
  • 归档
  • 【网课推荐】(红队&二进制)
首页 《xchg rax,rax》片段分析0x05--区间条件跳转

《xchg rax,rax》片段分析0x05--区间条件跳转

Posted 2022年 01月 6日 Updated 2023年 03月 1日
By selph
5~7 min read

前言

本次是该系列的的第0x05篇


实验环境:

  • Windows10 + VS2022 + masm

0x05

代码片段链接:xorpd | xchg rax,rax 0x05

sub      rax,5
cmp      rax,4

代码分析

cmp指令

cmp指令实际上进行比较的方式是通过减法运算进行,对标志位的影响等同于sub指令

sub指令对标志位的影响

如果相减结果为正数,则CF=0,ZF=0

如果相减结果为负数,则CF=1,ZF=0

如果相减结果为零数,则CF=0,ZF=1

代码片段分析

这个片段在逆向的时候我也见过,C语言的switch case 跳转功能就有类似的操作,当case情况依次是4,5,6,7,8,9时,机器码会把条件变量减去4,然后根据是否为0,进行跳转,然后逐步减一进行比较跳转:

	switch (argv)
00007FF62C281076 83 E9 04             sub         ecx,4  
00007FF62C281079 74 72                je          main+7Dh (07FF62C2810EDh)  
00007FF62C28107B 83 E9 01             sub         ecx,1  
00007FF62C28107E 74 55                je          main+65h (07FF62C2810D5h)  
00007FF62C281080 83 E9 01             sub         ecx,1  
00007FF62C281083 74 38                je          main+4Dh (07FF62C2810BDh)  
00007FF62C281085 83 E9 01             sub         ecx,1  
00007FF62C281088 74 1B                je          main+35h (07FF62C2810A5h)  
00007FF62C28108A 83 F9 01             cmp         ecx,1  
00007FF62C28108D 75 63                jne         main+82h (07FF62C2810F2h)  
	case 8:addition += 5; break;
00007FF62C28108F 8D 51 04             lea         edx,[rcx+4]  
	default:
		break;

这里代码片段的含义是产生一个数减去另一个数(5)大于或小于一个值(4)的两种情况,通过ZF标志位来区分,从而进行判断跳转

测试判断:

当rax = 8 ,ZF=0,CF=1
当rax = 9 ,ZF=1,CF=0
当rax = 10,ZF=0,CF=0

可以使用根据ZF和CF标志位进行跳转的指令进行条件转移,可在这里查阅条件跳转指令:Jcc — Jump if Condition Is Met (felixcloutier.com)

比如jbe就满足要求,当CF=1或ZF=1时跳转,也就是小于等于时跳转,在本例下就是4-9之间的数值会进行跳转

测试代码:

.code
main proc
    lea rax, [18]

    sub      rax,5
    cmp      rax,4

	ret
main ENDP
END

参考资料

Jcc — Jump if Condition Is Met (felixcloutier.com)

SUB — Subtract (felixcloutier.com)

(vs2010、vs2013、vs2015、vs2017查看OF、ZF、SF标志位_CJ_xiaoni的博客-CSDN博客

编程开发, 读书笔记
《xchg rax,rax》
This post is licensed under CC BY 4.0 by the author.
Share

Further Reading

Apr 12, 2022

《xchg rax,rax》片段分析0x23--模3运算

《xchg rax,rax》片段分析0x23--模3运算

Apr 11, 2022

C++ Iterator 迭代器

迭代器(Iterator)是一种抽象设计理念,通过迭代器可以在不了解容器内部原理的情况下遍历容器。

Apr 10, 2022

C++折叠表达式

C++17折叠表达式的用法

OLDER

《xchg rax,rax》片段分析0x04--大小写转换

NEWER

《xchg rax,rax》片段分析0x06--连续取反加一

Recently Updated

  • 【置顶】本博客的使用指南&更新计划(2023.3更新)
  • [技能兴鲁2023 决赛 职工组]re-ezalgorithm
  • [Pico CTF 2022]pwn-basic-file-exploit
  • [Pico CTF 2021]pwn-Unsubscriptions Are Free
  • [Pico CTF 2021]pwn-Here's a Libc

Trending Tags

pwn 符号执行 HEVD学习 .NET逆向 病毒分析 CTF 软件安全 《Windows内核编程》 dll注入 树莓派

Contents

©2023 我可是会飞的啊. Some rights reserved.

Using the Halo theme Chirpy