bomb.s phase_4的代码:
格式:
40102e行,比较0x8+rsp的值和0xe, 需要让0x8+rsp小于0xe, 然后跳转到40103a,
func函数根据bomb.s 转化为c代码:
这个直接参考了知乎网友的翻译,
func4的返回值等于0, 跳转到40105d。
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
指令是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
指令是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
指令,我们可以根据无符号数的比较结果来进行条件判断和跳转,从而实现不同的代码逻辑分支。
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
是 “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 的幂次方、进行有符号数的扩展等。具体使用时,需要根据具体的需求和上下文进行相应的操作和处理
https://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/lectures/06-machine-control.pdf
https://zhuanlan.zhihu.com/p/106316877