我有两个函数在内核,函数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
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等)所以我不确定导致崩溃的是什么
答案 0 :(得分:1)
function_b
或function_a
中的任何内容似乎都没有在调用function_b
之前清理推入堆栈的单词:
push dword 4
call function_b
此外,function_b
会删除edx
,用于存储function_a
的返回地址。
我不确定为什么函数具有将返回地址弹出到edx
的模式,以便可以在返回之前将其推回 - 为什么不将返回地址完全保留在堆栈上?如果您不想这样做,那么您需要在调用edx
之前保存function_b
(可能通过将其推入堆栈)并在之后恢复它。