摆脱跳板,使用bpftrace任意时刻暂停程序等待gdb附加

以前

以前调试的时候,经常会用到一系列进程启动,需要附加到某一个进程,这个进程可能被其他程序唤起的,又很快就结束了,也不能直接执行这个程序复现情况,必须要在当时的现场中运行。

比如这样的办法做一个跳板:

#!/bin/env python3
import os
import sys
import time


with open("/dev/pts/13", "w") as f:
    f.write("%d" % os.getpid())
time.sleep(10)


os.execve("/usr/libexec/gdb", sys.argv, os.environ)

上面的步骤中,/dev/pts/13是另一个终端,要把gdb的pid发送到另一个终端中,方便另一个终端中使用gdb附加到这个出错的gdb中。
然后sleep(10)为了留出时间附加,在接下来execve将会将这个跳板替换为真正的gdb程序

接下来,替换这个脚本到/bin/gdb,/bin/gdb本身也只是一个软连接,指向的是/usr/libexec/gdb,另一个终端等待收到gdb的pid进行附加

这种办法还是麻烦了一丢丢,有没有更强的办法呢???

现在

假如,我要附加ls命令!

第一步,找到合适的附加位置和过滤条件

另一个窗口等下执行ls

# ls

看到comm就是ls,就用这个当过滤条件吧。

# bpftrace -e 'tracepoint:syscalls:sys_exit_execve  {printf("%s\n", comm);}'
Attaching 1 probe...
ls

ls命令被执行时,在execve系统调用返回时,整个进程空间替换完成,execve准备由加载器装载动态库还没有执行到main,正是时候。

# bpftrace -e 'tracepoint:syscalls:sys_exit_execve  / comm == "ls" / {signal(20); printf("%d %s\n", pid, comm); exit();}' --unsafe
Attaching 1 probe...
2210 l

接下来,还是附加到sys_exit_execve,过滤条件comm == "ls",然后发送信号20,即SIGTSTP,和终端中敲ctrl + z一样,暂停进程,则会在execve hock时同步执行,保证hock的时效性,接下来的printfexit是异步,由bpftrace返回到用户态时执行,打印下pid方便等下gdb附加,exit退出bpftrace

# gdb -p 2210
(gdb) bt
#0  0x00007fd3d6b6ac00 in _start () from /lib64/ld-linux-x86-64.so.2
#1  0x0000000000000002 in ?? ()
#2  0x00007fff6c579d07 in ?? ()
#3  0x00007fff6c579d0a in ?? ()
#4  0x0000000000000000 in ?? ()
(gdb) info proc mappings 
process 2210
Mapped address spaces:

          Start Addr           End Addr       Size     Offset objfile
      0x55e415e00000     0x55e415e20000    0x20000        0x0 /usr/bin/ls
      0x55e41601f000     0x55e416022000     0x3000    0x1f000 /usr/bin/ls
      0x55e416022000     0x55e416023000     0x1000        0x0 
      0x7fd3d6b51000     0x7fd3d6b7f000    0x2e000        0x0 /usr/lib64/ld-2.28.so
      0x7fd3d6d79000     0x7fd3d6d7d000     0x4000        0x0 [vvar]
      0x7fd3d6d7d000     0x7fd3d6d7f000     0x2000        0x0 [vdso]
      0x7fd3d6d7f000     0x7fd3d6d82000     0x3000    0x2e000 /usr/lib64/ld-2.28.so
      0x7fff6c559000     0x7fff6c57b000    0x22000        0x0 [stack]
  0xffffffffff600000 0xffffffffff601000     0x1000        0x0 [vsyscall]

这个时候附加,效果嘎嘎好,就连libc这种都没装载,和上面跳板方式效果几乎一样。

而且,可以不仅仅用在execve,还可以任意自定义hock时刻,比如读写文件时、权能变化时,这种方式bpftrace用起来都非常方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值