如何从汇编程序中的信号处理程序返回主线代码?

时间:2015-09-03 16:24:31

标签: assembly handler sigfpe

我一直在为NASM编写程序用于Linux。我希望能够从我为SIGFPE建立的信号处理程序返回到正常的代码路径。精简的示例代码是:

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是可用的,但我想了解在这种情况下发生了什么。)

1 个答案:

答案 0 :(得分:1)

将返回一个简单的ret,以便重新尝试错误指令。当使用sigaction向标志SA_SIGINFO注册信号处理程序时,第三个参数是指向包含已保存状态的ucontext_t的指针,该状态可能会被更改。