调用函数后的内核三重故障



我有两个函数在内核中运行,函数a和函数B。函数a清除屏幕并将控制传递给函数B(目前什么都不做)。当控制返回功能A时,发生三重故障。(这是x86 Intel语法)


函数

function_a:
pop edx
push ebp
mov ebp, esp
sub esp, 8
push dword 0
pop eax
mov [ebp-4], eax
jmp .il_15
.il_7:
push dword 753664
mov eax, [ebp-4]
push eax
pop eax
pop ebx
add eax, ebx
push eax
push dword 0
pop eax
pop ebx
mov [ebx],al
mov eax, [ebp-4]
push eax
push dword 1
pop eax
pop ebx
add eax, ebx
push eax
pop eax
mov [ebp-4], eax
.il_15:
mov eax, [ebp-4]
push eax
push dword 4000
pop eax
pop ebx
cmp ebx, eax
jl .il_7
push dword 4
call function_b
jmp .methodend
.methodend:
add esp, 8
pop ebp
push edx
ret

函数B

function_b:
pop edx
push ebp
mov ebp, esp
sub esp, 4
jmp .methodend ;This is just an empty function
.methodend:
add esp, 4
pop ebp
push edx
ret

我很确定我已经为每个函数正确设置了堆栈(pop返回值,push ebp等),所以我不确定是什么导致崩溃

function_bfunction_a中似乎没有清除在调用function_b:

之前压入堆栈的字。
push dword 4
call function_b

也,function_b垃圾edx,这是用来存储从function_a返回地址。

我不知道为什么函数有弹出返回地址到edx的模式,以便它可以在返回之前被推回-为什么不干脆把返回地址留在堆栈上?如果您不想这样做,那么您需要在调用function_b之前保存edx(可能通过将其压入堆栈),然后恢复它。

最新更新