CSAPP BOMB LAB part3
phase_4
bomb.s phase_4的代码:

格式:

40102e行,比较0x8+rsp的值和0xe, 需要让0x8+rsp小于0xe, 然后跳转到40103a,

func函数根据bomb.s 转化为c代码:

这个直接参考了知乎网友的翻译,

func4的返回值等于0, 跳转到40105d。
汇编语法
jne指令
jne指令是x86汇编语言中的一条条件跳转指令,用于在不相等的情况下进行跳转。
jne指令的语法如下:
jne label
其中,label是一个标签,用于指定跳转的目标位置。
jne指令根据条件码寄存器的值来进行跳转。如果ZF为0,则跳转到label指定的位置。条件码寄存器的ZF位表示零标志位,当上一条指令的结果为零时,ZF被设置为1,否则为0。
下面是一个示例,展示了jne指令的使用:
section .data
var1 dw 10
var2 dw 20
section .text
global _start
_start:
mov ax, [var1]
mov bx, [var2]
cmp ax, bx
jne not_equal
; 如果var1等于var2,则继续执行下面的指令
; ...
not_equal:
; 如果var1不等于var2,则跳转到not_equal标签处执行相应的代码块
; ...
; 继续执行下面的指令
; ...
end:
; 结束程序
mov eax, 1
int 0x80
在上面的示例中,我们定义了两个变量var1和var2,并将它们的值分别设置为10和20。
然后,我们使用cmp指令比较var1和var2的值。根据比较结果,jne指令会根据ZF位的值来决定是否跳转。如果var1不等于var2,即ZF为0,则跳转到not_equal标签处执行相应的代码块;如果var1等于var2,即ZF为1,则继续执行下面的指令。
最后,我们使用系统调用int 0x80来结束程序。
通过使用jne指令,我们可以根据比较结果来进行条件判断和跳转,从而实现不同的代码逻辑分支。
cmpl 指令
cmpl指令是x86汇编语言中的一条比较指令,用于比较两个操作数的值。
cmpl指令的语法如下:
cmpl source, destination
其中,source和destination是要比较的操作数。
cmpl指令会将source和destination进行比较,并根据比较结果设置条件码寄存器的值。根据比较结果,条件码寄存器的ZF(零标志位)和SF(符号标志位)位会被更新。
下面是一个示例,展示了cmpl指令的使用:
section .data
var1 dw 10
var2 dw 20
section .text
global _start
_start:
mov ax, [var1]
mov bx, [var2]
cmpl ax, bx
; 根据比较结果设置的条件码寄存器的值,执行不同的跳转指令
je equal
jg greater
jl less
; 继续执行下面的指令
; ...
equal:
; 如果var1等于var2,则跳转到equal标签处执行相应的代码块
; ...
; 继续执行下面的指令
; ...
greater:
; 如果var1大于var2,则跳转到greater标签处执行相应的代码块
; ...
; 继续执行下面的指令
; ...
less:
; 如果var1小于var2,则跳转到less标签处执行相应的代码块
; ...
; 继续执行下面的指令
; ...
end:
; 结束程序
mov eax, 1
int 0x80
在上面的示例中,我们定义了两个变量var1和var2,并将它们的值分别设置为10和20。
然后,我们使用mov指令将var1和var2的值分别加载到寄存器ax和bx中。
接下来,我们使用cmpl指令比较ax和bx的值。根据比较结果,条件码寄存器的ZF和SF位会被更新。
根据条件码寄存器的值,我们可以使用条件跳转指令(如je、jg、jl等)来根据比较结果执行不同的代码逻辑分支。
通过使用cmpl指令,我们可以比较两个操作数的值,并根据比较结果来进行条件判断和跳转。
jbe指令
jbe指令是x86汇编语言中的一条条件跳转指令,用于在无符号数小于或等于的情况下进行跳转。
jbe指令的语法如下:
jbe label
其中,label是一个标签,用于指定跳转的目标位置。
jbe指令根据条件码寄存器的值来进行跳转。如果CF为1或者ZF为1,则跳转到label指定的位置。条件码寄存器的CF位表示进位标志位,当无符号数比较时,如果发生了进位,则CF被设置为1。ZF位表示零标志位,当上一条指令的结果为零时,ZF被设置为1。
下面是一个示例,展示了jbe指令的使用:
section .data
var1 dw 10
var2 dw 20
section .text
global _start
_start:
mov ax, [var1]
mov bx, [var2]
cmp ax, bx
jbe less_or_equal
; 如果var1大于var2,则继续执行下面的指令
; ...
less_or_equal:
; 如果var1小于或等于var2,则跳转到less_or_equal标签处执行相应的代码块
; ...
; 继续执行下面的指令
; ...
end:
; 结束程序
mov eax, 1
int 0x80
在上面的示例中,我们定义了两个变量var1和var2,并将它们的值分别设置为10和20。
然后,我们使用cmp指令比较var1和var2的值。根据比较结果,jbe指令会根据CF和ZF位的值来决定是否跳转。如果var1小于或等于var2,即CF为1或者ZF为1,则跳转到less_or_equal标签处执行相应的代码块;如果var1大于var2,即CF为0且ZF为0,则继续执行下面的指令。
最后,我们使用系统调用int 0x80来结束程序。
通过使用jbe指令,我们可以根据无符号数的比较结果来进行条件判断和跳转,从而实现不同的代码逻辑分支。
cmpq 指令

jx 指令

shr指令
SHR 是汇编语言中的一个指令,用于将一个数值向右移动指定的位数。SHR 是 “Shift Right” 的缩写。它是一种逻辑右移指令,表示将操作数的二进制位向右移动,并用零填充左侧空出的位。
SHR 指令的语法和操作数取决于所使用的汇编语言和体系结构。下面是一个通用的示例:
SHR destination, count
destination:目标操作数,表示要进行右移操作的值。可以是寄存器、内存位置或立即数。count:右移的位数。可以是一个立即数或者由寄存器或内存位置提供的数值。
SHR 指令将目标操作数的二进制位向右移动指定的位数。移动后,右侧的位将被丢弃,左侧空出的位将用零填充。移动的位数由 count 指定。
以下是一个示例,展示了如何使用 SHR 指令将寄存器 AL 的值向右移动 1 位:
MOV AL, 0b11001100 ; AL = 0xCC
SHR AL, 1 ; 将 AL 的值向右移动 1 位
; 移动后,AL = 0x66
在上述示例中,AL 寄存器的初始值为 0xCC,即二进制 11001100。通过执行 SHR AL, 1 指令,将 AL 的值向右移动 1 位。移动后,AL 的值变为 0x66,即二进制 01100110。
SHR 指令在汇编语言中常用于对数据进行位操作,例如将无符号整数除以 2 的幂次方、提取二进制数的低位等。具体使用时,需要根据具体的需求和上下文进行相应的操作和处理。
sar指令
SAR 是汇编语言中的一个指令,用于将一个数值向右算术移动指定的位数。SAR 是 “Shift Arithmetic Right” 的缩写。它是一种算术右移指令,表示将操作数的二进制位向右移动,并根据符号位进行填充。
SAR 指令的语法和操作数取决于所使用的汇编语言和体系结构。下面是一个通用的示例:
SAR destination, count
destination:目标操作数,表示要进行右移操作的值。可以是寄存器、内存位置或立即数。count:右移的位数。可以是一个立即数或者由寄存器或内存位置提供的数值。
SAR 指令将目标操作数的二进制位向右移动指定的位数,并根据符号位进行填充。移动后,右侧的位将被丢弃,左侧空出的位将用符号位进行填充。
以下是一个示例,展示了如何使用 SAR 指令将寄存器 AL 的值向右移动 1 位:
MOV AL, 0b11001100 ; AL = 0xCC
SAR AL, 1 ; 将 AL 的值向右移动 1 位
; 移动后,AL = 0xE6
在上述示例中,AL 寄存器的初始值为 0xCC,即二进制 11001100。通过执行 SAR AL, 1 指令,将 AL 的值向右移动 1 位。移动后,AL 的值变为 0xE6,即二进制 11100110。
SAR 指令在汇编语言中常用于对带符号整数进行位操作,例如将带符号整数除以 2 的幂次方、进行有符号数的扩展等。具体使用时,需要根据具体的需求和上下文进行相应的操作和处理
test指令

参考链接
https://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/lectures/06-machine-control.pdf
https://zhuanlan.zhihu.com/p/106316877









![[DC29 Quals] Reverse-Tiamat -wp](https://img-blog.csdnimg.cn/img_convert/21215d00362062691be96e5981829362.png)









