ASM中的控制转移指令

admin 2024年12月5日16:51:10评论9 views字数 3468阅读11分33秒阅读模式
0x01 无条件控制转移指令
jmp 指令会立即改变程序的控制流,将指令指针(RIP 寄存器)设置为 jmp 指令的操作数所指定的目标地址。这意味着程序将从这个新地址开始继续执行,而不会执行 jmp 指令后面的任何代码。类似于高级语言的 goto 语句。
基本语法:
1. 直接跳转到内存地址
jmp label
这里的 label 是一个标签,表示目标代码的位置。
2. 间接跳转到寄存器或内存中的地址
jmp rax        ; 跳转到rax寄存器中的地址jmp [rbx]      ; 跳转到rbx寄存器指向的地址
3.短跳转(相对偏移)
jmp short near_label
短跳转使用8位相对偏移量,适用于跳转范围在 -128 到 +127 字节之间的场合。
4.近跳转(相对偏移)
jmp near far_label
近跳转使用 32 位相对偏移量,适用于跳转范围更大的场合。
5.远跳转(绝对地址)
jmp far dword ptr [rip + offset]
远跳转使用绝对地址,通常用于跨段跳转,但在现代操作系统中较少使用。
0x02 条件跳转指令
条件跳转指令对 FLAGS 寄存器中的进位、符号、溢出、零和奇偶校验标志位进行测试,已确认是否存在需要执行的语句分支。
基本操作是:测试一个标志位,以检查该标志位的状态是设置(1)还是清除(0),如果测试成功,跳转到目标标签,否则程序继续执行条件跳转指令的吓一跳指令。
条件码标志位的条件跳转指令
指令
说明
jc label
有进位(进位标志位 Carry Flag为1),则跳转
jnc label
无进位(进位标志位 Carry Flag为0),则跳转
jo label
有溢出(溢出标志位 Overflow Flag为1),则跳转
jno label
无溢出(溢出标志位 Overflow Flag为0),则跳转
js label
有符号(符号标志位 Sign Flag为1),则跳转
jns label
无符号(符号标志位 Sign Flag为0),则跳转
jz label
为0(零标志位 Zero Flag 为0),则跳转
jnz label
不为0(零标志位 Zero Flag 为0),则跳转
0x03 比较指令和相应的条件跳转
cmp 比较指令是根据减法的结果设置标志位。与 sub 指令不同的是,cmp 指令不会将减去的结果存储回第一个(目标)操作数,它仅更新标志寄存器以反映操作的结果。
基本语法:
cmp destination, source
  • destination: 目标操作数,通常是寄存器或内存地址
  • source: 源操作数,可以是寄存器、内存地址或立即数
在 cmp 指令之后使用的条件跳转指令
指令
标志位
说明
je label
ZF==1
左右操作数相等,则跳转
jne label
ZF==0
左右操作数不相等,则跳转
ja label
CF==0 && ZF==0
无符号左操作数>无符号右操作数,则跳转
jae label
CF==0
无符号左操作数>=无符号右操作数,则跳转
jb label
CF==1
无符号左操作数<无符号右操作数,则跳转
jbe label
CF==1 || ZF==1
无符号左操作数<=无符号右操作数,则跳转
jg label
SF==OF && ZF==0
有符号左操作数>有符号右操作数,则跳转
jge label
SF==OF
有符号左操作数>=有符号右操作数,则跳转
jl label
SF!=OF
有符号左操作数<有符号右操作数,则跳转
jle label
ZF==1 || SF!=OF
有符号左操作数<=有符号右操作数,则跳转
0x04 条件跳转的同义词
条件跳转指令的同义词指令
指令
等价指令
描述
ja
jnbe
高于则跳转;不低于或等于则跳转
jae
jnb, jnc
高于或等于则跳转;不低于则跳转;不进位则跳转
jb
jc, jnae
低于则跳转;进位则跳转;不高于或等于则跳转
jbe
jna
低于或等于则跳转;不高于则跳转
jc
jb, jnae
进位则跳转;低于则跳转;不高于或等于则跳转
je
jz
等于则跳转;为零则跳转
jg
jnle
大于则跳转;不小于或等于则跳转
jge
jnl
大于或等于则跳转;不小于则跳转
jl
jnge
小于则跳转;不大于或等于则跳转
jle
jng
小于或等于则跳转;不大于则跳转
jna
jbe
不高于则跳转;低于或等于则跳转
jnae
jb, jc
不高于或等于则跳转;低于则跳转;进位则跳转
jnb
jae, jnc
不低于则跳转;高于或等于则跳转;不进位则跳转
jnbe
ja
不低于或等于则跳转;高于则跳转
jnc
jnb, jae
不进位则跳转;不低于则跳转;高于或等于则跳转
jne
jnz
不等于则跳转;不为零则跳转
jng
jle
不大于则跳转;大于或等于则跳转
jnge
jl
不大于或等于则跳转;小于则跳转
jnl
jge
不小于则跳转;大于或等于则跳转
jnle
jg
不小于或等于则跳转;大于则跳转
jnz
jne
不为零则跳转;不等于则跳转
jz
je
为零则跳转;相等则跳转
cmp 指令仅为整数比较设置标志位,不会比较浮点数值,也不会根据浮点数比较情况设置标志位。
0x05 有符号数和无符号数
无符号数
无符号数是只用数值位来表示正数的整数。它不包含任何符号位(即没有正负之分),因此所有的位都用来表示数值大小。比较时,主要关注的是 ZF 和 CF 标志位。
有符号数
有符号数使用补码表示法来表示正数和负数。最高有效位用作符号位:0 表示正数,1 表示负数。比较时,主要关注的是 SF 和 OF 标志位。
补码表示法
补码表示法是一种计算负数的方式,使得加法和减法操作可以统一处理。以下是将一个有符号整数转换为其补码表示的过程:
  1. 正数: 直接写出其二进制表示
  2. 负数
  • 写出其绝对值的二进制表示
  • 对每一位取反(即 0 变为 1,1变为 0)
  • 在结果上加 1

例如 1000_0101:

  1. 无符号数:十进制为 133
  2. 有符号数:
  • 最高位是 1,表示这是一个负数。
  • 对每一位取反得到 0111_1010
  • 加 1 得到 0111_1011,十进制为 123
  • 1000_0101 的有符号数表示为 -123
0x06 比较跳转示例
    option casemap:none    .datas_num1 sqword -3s_num2 sqword -5u_num1 qword 3u_num2 qword 5    .constsigned_msg byte  's_num1 > s_num2', 10, 0unsigned_msg byte 'u_num1 > u_num2',10, 0else_msg byte 'Neither condition met',10, 0    .codeexterndef printf:procexterndef ExitProcess:proc    public asmFuncasmFunc proc    ; 有符号数比较    mov rax, s_num1    cmp rax, s_num2    ; jg 大于则跳转    jg print_signed_greater  ; 如果 s_num1 > num2,跳转到 print_signed_greater    jmp check_unsigned       ; 否则检查无符号比较    ; 无符号数比较    check_unsigned:        mov rax, u_num1        cmp rax, u_num2        ;ja 高于则跳转        ja print_unsigned_greater  ; 如果 u_num1 > u_num2,跳转到 print_unsigned_greater        jmp print_else             ; 否则跳转到 print_else    print_signed_greater:        lea rcx, signed_msg         call print_message        jmp exit    print_unsigned_greater:        lea rcx, unsigned_msg        call print_message        jmp exit    print_else:        lea rcx, else_msg        call print_message        jmp exit    print_message PROCsubrsp, 56callprintfaddrsp, 56retprint_messageENDPexit:xorrcx, rcx            ; 设置退出码为 0        call ExitProcess        ; 调用 ExitProcessasmFunc endp    end
ASM中的控制转移指令
ASM中的控制转移指令
ASM中的控制转移指令
附:符号值对应表
符号值对应表
溢出标志OF(Over flow flag)
OV(1)
NV(0)
方向标志DF(Direction flag)
DN(1)
UP(0)
中断标志IF(Interrupt flag)
EI(1)
DI(0)
符号标志SF(Sign flag)
NG(1)
PL(0)
零标志ZF(Zero flag) 
ZR(1)
NZ(0)
辅助标志AF(Auxiliary carry flag)
AC(1)
NA(0)
奇偶标志PF(Parity flag)
PE(1)
PO(0)
进位标志CF(Carry flag)
CY(1)
NC(0)

原文始发于微信公众号(走在网安路上的哥布林):ASM中的控制转移指令

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月5日16:51:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ASM中的控制转移指令https://cn-sec.com/archives/3471515.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息