我如何从汇编程序中的信号处理程序 return 到主线代码?
How do I return to mainline code from a signal handler in assembler?
我一直在 NASM 中为 Linux 编写程序。我希望能够从我为 SIGFPE 建立的信号处理程序 return 到正常的代码路径。精简示例代码是:
section .text
global _start
_start: ; --- Enter the program ---
mov ebx,8 ; Load the signal to handle (SIGFPE)
mov ecx,.handle ; Load the handler address
mov eax,48 ; Load the syscall number for signal
int 0x80 ; Establish the handler
mov ebx,0 ; Prepare a divisor for SIGFPE
idiv ebx ; Divide edx:eax by 0
mov ebx,0 ; Set exit status 0 (shouldn't get here)
jmp .exit ; Exit the program
.handle: ; --- Handle a divide exception ---
mov ebx,31 ; Set exit status 31 (instead of real handling)
.exit: ; --- Exit the program ---
mov eax,1 ; Load the syscall number for exit
int 0x80 ; Exit back to the system
幻数是为了代码的紧凑性。
在idiv指令之前,esp是0xffffcc00
。在信号处理程序的入口处,esp 是 0xffffc52c
。相当多的东西已经放在堆栈上了!那里有大量关于 __NR_sigreturn 的信息。我没有运气尝试使用它。处理程序中的 ret
指令只是让我回到 idiv 指令,这次没有处理程序。
关于我可以在 .handle
标签上做什么以安全返回主线有什么想法吗?
(我知道sigaction是可用的,但我想了解一下这种情况是怎么回事。)
一个简单的 ret
将 return 以重新尝试错误指令。当使用 sigaction
注册带有标志 SA_SIGINFO
的信号处理程序时,第三个参数是指向包含已保存状态的 ucontext_t
的指针,该状态可能会被更改。
我一直在 NASM 中为 Linux 编写程序。我希望能够从我为 SIGFPE 建立的信号处理程序 return 到正常的代码路径。精简示例代码是:
section .text
global _start
_start: ; --- Enter the program ---
mov ebx,8 ; Load the signal to handle (SIGFPE)
mov ecx,.handle ; Load the handler address
mov eax,48 ; Load the syscall number for signal
int 0x80 ; Establish the handler
mov ebx,0 ; Prepare a divisor for SIGFPE
idiv ebx ; Divide edx:eax by 0
mov ebx,0 ; Set exit status 0 (shouldn't get here)
jmp .exit ; Exit the program
.handle: ; --- Handle a divide exception ---
mov ebx,31 ; Set exit status 31 (instead of real handling)
.exit: ; --- Exit the program ---
mov eax,1 ; Load the syscall number for exit
int 0x80 ; Exit back to the system
幻数是为了代码的紧凑性。
在idiv指令之前,esp是0xffffcc00
。在信号处理程序的入口处,esp 是 0xffffc52c
。相当多的东西已经放在堆栈上了!那里有大量关于 __NR_sigreturn 的信息。我没有运气尝试使用它。处理程序中的 ret
指令只是让我回到 idiv 指令,这次没有处理程序。
关于我可以在 .handle
标签上做什么以安全返回主线有什么想法吗?
(我知道sigaction是可用的,但我想了解一下这种情况是怎么回事。)
一个简单的 ret
将 return 以重新尝试错误指令。当使用 sigaction
注册带有标志 SA_SIGINFO
的信号处理程序时,第三个参数是指向包含已保存状态的 ucontext_t
的指针,该状态可能会被更改。