• CSAPP BOMB LAB part2


    bomb lab part2

    phase3

    在这里插入图片描述
    将rsp+0xc存入rcx, 将rsp+0x8存入rdx, 地址0x4025cf存储格式,然后调用好sscanf函数
    在这里插入图片描述
    在这里插入图片描述
    当rsp+0x8的值大于0x7, 会跳转到400fad, 会boom!!! 所以rsp+0x8的值不大于0x7。

    在这里插入图片描述
    在这里插入图片描述
    0x8+rsp的值不进入ja的代码段,会执行400f71对应的指令,之后执行400f75对应的指令,
    在这里插入图片描述

    jmpq *0x402470(,%rax,8) ==> 0x402470 + 8(rax)

    在这里插入图片描述
    在这里插入图片描述
    设置rax为1, *0x402470(,%rax,8) ==> 0x402470 + 8 ,0x402478存储的值,400fb9,
    在这里插入图片描述
    400fb9 是 将0x137的值存储到eax, 比较第二个参数和eax的大小,等于跳转到400fc9

    在这里插入图片描述

    汇编语法

    switch 汇编版本

    switch 例子:
    在这里插入图片描述
    switch 使用 jump table
    在这里插入图片描述
    在这里插入图片描述

    cmpl 指令

    cmpl指令是x86汇编语言中的一个比较指令,用于比较两个操作数的值。cmpl指令的格式如下:

    cmpl source, destination
    
    • 1

    sourcedestination可以是寄存器、内存地址或立即数。指令执行后,会将sourcedestination进行比较,并根据比较结果设置标志寄存器中的相应标志位。

    cmpl指令的比较结果会影响以下标志位:

    • ZF(Zero Flag):如果两个操作数相等,则ZF标志位被设置为1,否则为0。
    • SF(Sign Flag):如果结果为负数,则SF标志位被设置为1,否则为0。
    • CF(Carry Flag):如果source小于destination,则CF标志位被设置为1,否则为0。
    • OF(Overflow Flag):如果有符号操作数溢出,则OF标志位被设置为1,否则为0。

    以下是一些示例,演示了cmpl指令的使用:

    movl $10, %eax    # 将10存储到eax寄存器
    cmpl $5, %eax     # 比较eax和5
    
    • 1
    • 2

    在这个例子中,我们首先将立即数10存储到eax寄存器中。然后,我们使用cmpl指令将eax和立即数5进行比较。比较结果会根据eax和5的大小关系设置相应的标志位。

    cmpl指令可以与条件跳转指令(如jejnejl等)结合使用,用于根据比较结果执行不同的代码路径。

    使用cmpl指令比较var1和var2的值。根据比较结果,我们使用条件跳转指令来执行不同的代码块。如果var1大于var2,则跳转到greater标签处执行相应的代码块;如果var1小于var2,则跳转到less标签处执行相应的代码块;如果var1等于var2,则跳转到equal标签处执行相应的代码块。

    请注意,cmpl指令只比较操作数的值,并不修改操作数的内容。如果需要根据比较结果进行其他操作,可以使用条件跳转指令或其他指令来实现。

    在这里插入图片描述

    jg指令

    jg指令的语法如下:

    jg label
    其中,label是一个标签,用于指定跳转的目标位置。

    jg指令根据条件码寄存器的值来进行跳转。如果ZF为0且SF等于OF,则跳转到label指定的位置。

    ja指令

    ja指令的语法如下:

    ja label
    
    • 1

    其中,label是一个标签,用于指定跳转的目标位置。

    ja指令根据条件码寄存器的值来进行跳转。如果ZF为0且CF为0,即无进位且不相等,则跳转到label指定的位置。

    下面是一个示例,展示了cmpl指令和ja指令的使用:

    section .data
        var1 dw 10
        var2 dw 20
    
    section .text
        global _start
    
    _start:
        mov ax, [var1]
        mov bx, [var2]
    
        cmpl ax, bx
        ja greater
    
        ; 如果var1 <= var2,则继续执行下面的指令
        ; ...
    
    greater:
        ; 如果var1 > var2,则跳转到greater标签处执行相应的代码块
        ; ...
    
        ; 继续执行下面的指令
        ; ...
    
    end:
        ; 结束程序
        mov eax, 1
        int 0x80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在上面的示例中,我们定义了两个变量var1var2,并将它们的值分别设置为10和20。

    然后,我们使用cmpl指令比较var1var2的值。如果var1大于var2,则跳转到greater标签处执行相应的代码块;如果var1小于等于var2,则继续执行下面的指令。

    最后,我们使用系统调用int 0x80来结束程序。

    这样,我们可以根据cmpl指令的比较结果和ja指令的条件跳转来执行不同的代码块。

    工具介绍

    参考链接

    https://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/lectures/05-machine-basics.pdf
    https://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/lectures/06-machine-control.pdf
    https://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/lectures/07-machine-procedures.pdf

  • 相关阅读:
    JAVA计算机毕业设计准妈妈孕期交流平台Mybatis+系统+数据库+调试部署
    【顺序表ArrayList】
    docker三剑客compose+machine+swarm小结
    算法|图论 1 广度深度
    企业服务器中了babyk勒索病毒怎么办,babyk勒索病毒解密数据集恢复
    Redis配置与优化
    C#学习系列之UDP同端口收发问题
    [激光原理与应用-33]:典型激光器 -5- 不同激光器的全面、综合比较
    Linux环境下不安装DM数据库,编译dmPython
    AI生成PPT:如何轻松制作专业的答辩PPT?
  • 原文地址:https://blog.csdn.net/weixin_43876597/article/details/134191364