如何用Systemtap探测mq_notify()调用的所有函数?
跟踪mq_notify调用链的实现方法
方法一:使用Systemtap
Systemtap是内核级跟踪工具,适合快速批量探针函数:
- 编写跟踪脚本(比如
mq_trace.stp):
# 探针mq_notify入口,打印进程信息与调用栈 probe kernel.function("mq_notify") { printf("Enter mq_notify | PID: %d | Process: %s\n", pid(), execname()) print_backtrace() } # 探针mq_notify调用的所有子函数(匹配mqueue.c下的内核函数) probe kernel.function("*@ipc/mqueue.c") { if (caller() == kernel.function("mq_notify").addr) { printf("mq_notify calls: %s\n", probefunc()) } } # 探针mq_notify返回,打印返回值 probe kernel.function("mq_notify").return { printf("Exit mq_notify | Return value: %d\n", $return) }
- 运行脚本并触发漏洞利用:
在终端执行sudo stap mq_trace.stp,同时在另一个终端运行你的漏洞利用程序,即可实时看到调用流。
方法二:使用内核自带ftrace(无需额外工具)
ftrace是内核内置的跟踪框架,轻量且无需安装:
- 挂载debugfs(若未挂载):
sudo mount -t debugfs none /sys/kernel/debug
- 配置ftrace跟踪规则:
cd /sys/kernel/debug/tracing echo function > current_tracer # 启用函数跟踪 echo mq_notify > set_graph_function # 仅跟踪mq_notify的调用链 echo 1 > options/func_stack_trace # 开启调用栈打印
- 启动并停止跟踪:
echo 1 > tracing_on # 开始跟踪,此时运行漏洞利用程序 echo 0 > tracing_on # 完成后停止跟踪 cat trace # 查看完整调用链日志
方法三:使用GDB单步调试(适合精细跟踪)
如果需要逐行分析代码流,GDB是更灵活的选择:
- 启动GDB并加载漏洞利用程序:
gdb ./your_exploit_binary
- 设置断点并跟踪:
b mq_notify # 在mq_notify函数入口下断点 r # 运行程序,触发断点后停止 bt # 查看当前调用栈 si # 单步进入子函数,逐行跟踪调用路径 finish # 执行完当前函数,返回上一层调用
内容的提问来源于stack exchange,提问作者Cyb3rCr0wCC
相关产品推荐
相关产品推荐

