调试 SIGSEGV 信号处理函数
debug SIGSEGV signal handler function
我编写了关于注册信号处理程序的小汇编代码。
.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 2, %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 [=10=] # 1st param : oact
pushl $my_sigaction # 2nd param : act
pushl $SIGSEGV # 3rd param : sig
call sigaction
addl , %esp
jmp 0x11223344 # Segmantation fault
当我执行编译后的二进制文件时,myhandler
运行良好。
但是...当我尝试调试它时,gdb 在 SIGSEGV[=39= 之后停止了]信号出现。
所以我无法使用 gdb..
到达 myhandler
问题。
如何调试在 SIGSEGV 信号后运行的 myhandler
函数?
PS 1. 我检查了 here,但设置 follow-process-mode 对我的情况没有帮助。 ;(
PS 2. 我检查了 here,但是在断言 handle SIGSEGV nostop
之后,gdb 无限发出 "Program received signal SIGSEGV, Segmentation fault" 消息SIGSEGV 发生...
我自己解决了这个问题。
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 信号上设置 pass
和 nostop
有效!
发生 SIGSEGV 后,我仍然可以在 gdb 上调试二进制文件。
我编写了关于注册信号处理程序的小汇编代码。
.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 2, %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 [=10=] # 1st param : oact
pushl $my_sigaction # 2nd param : act
pushl $SIGSEGV # 3rd param : sig
call sigaction
addl , %esp
jmp 0x11223344 # Segmantation fault
当我执行编译后的二进制文件时,myhandler
运行良好。
但是...当我尝试调试它时,gdb 在 SIGSEGV[=39= 之后停止了]信号出现。
所以我无法使用 gdb..
myhandler
问题。
如何调试在 SIGSEGV 信号后运行的 myhandler
函数?
PS 1. 我检查了 here,但设置 follow-process-mode 对我的情况没有帮助。 ;(
PS 2. 我检查了 here,但是在断言 handle SIGSEGV nostop
之后,gdb 无限发出 "Program received signal SIGSEGV, Segmentation fault" 消息SIGSEGV 发生...
我自己解决了这个问题。
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 信号上设置 pass
和 nostop
有效!
发生 SIGSEGV 后,我仍然可以在 gdb 上调试二进制文件。