调试SIGSEGV信号处理程序功能

时间:2018-11-05 11:15:44

标签: debugging assembly exception-handling x86 disassembly

我做了一些有关注册信号处理程序的小汇编代码。

.section .data
.set SIGSEGV, 11
.set SA_SIGINFO, 4

.section .bss   
.lcomm my_sigaction, 140 # size of sigaction struction is 140

.section .text
.global main

myhandler:
    nop
    push %eax
    pop %eax

main:
    # Registring signal handler for SIGSEGV
    movl $myhandler, my_sigaction           # fill sa_handler field 
    movl $132, %edi                         # fill sa_flags field
    movl $SA_SIGINFO, my_sigaction(,%edi,1) # SA_SIGINFO  designate that whenever signal appears, run the signal handling function.

    # Call sigaction(int, const struct sigaction *, struct sigaction *)
    pushl $0                                # 1st param : oact
    pushl $my_sigaction                     # 2nd param : act
    pushl $SIGSEGV                          # 3rd param : sig
    call sigaction
    addl $12, %esp

    jmp 0x11223344                         # Segmantation fault    

当我执行编译后的二进制文件时,myhandler工作得很好。

但是...当我尝试调试它时, gdb SIGSEGV 信号出现后才停止。
因此,我无法通过 gdb 到达myhandler。.

问题。
如何调试在SIGSEGV信号之后运行的myhandler函数?

PS 1。 我检查了here,但是在我的情况下设置Follow-process-mode并没有帮助。 ;(
PS 2。 我检查了here,但是断言handle SIGSEGV nostop之后,gdb无限地发出“程序接收信号SIGSEGV,分段错误”发生SIGSEGV时出现消息...

1 个答案:

答案 0 :(得分:3)

我自己解决了这个问题。

pwndbg> b myhandler
pwndbg> handle SIGSEGV pass
Signal        Stop  Print   Pass to program Description
SIGSEGV       Yes   Yes Yes     Segmentation fault
pwndbg> handle SIGSEGV nostop
Signal        Stop  Print   Pass to program Description
SIGSEGV       No    Yes Yes     Segmentation fault
pwndbg> r
Breakpoint myhandler

在SIGSEGV信号上设置passnostop有用!
发生SIGSEGV之后,我仍然可以在gdb上调试二进制文件。