在termux上运行pwndbg

在termux上运行pwndbg

RocketDev

在开发过程中,调试器是绕不开的一环,如果使用gdb的话,pwndbg是必不可少的伴侣。 平时大家主要在 PC 上使用 pwndbg,但偶尔只带了手机时,也需要在手机上做一些探索。 借助termux,可以实现在手机上编译并调试,不过只有原版的gdb未免过于简陋,有没有办法将 pwndbg搬到手机上呢?有的,兄弟,有的。

获取官方二进制包

打开pwndbg的releases页, 里面已经有针对arm64的包了,可以使用curl等工具下载后解压。然而, 直接解压后并不能直接运行:

无法启动?

如果仔细看的话,会发现这个pwndbg是一个脚本,实际上会用ld去执行gdb。

bin/pwndbg
1
2
3
4
5
6
7
8
9
#!/bin/sh
dir="$(cd -- "$(dirname "$(dirname "$(realpath "$0")")")" >/dev/null 2>&1 ; pwd -P)"
export TERMINFO_DIRS=/etc/terminfo:/lib/terminfo:/usr/share/terminfo:/run/current-system/sw/share/terminfo:$dir/share/terminfo
export PYTHONNOUSERSITE=1
export PYTHONHOME="$dir"
export PYTHONPATH=""
export PATH="$dir/bin/:$PATH"

exec "$dir/lib/ld-linux-aarch64.so.1" "$dir/exe/gdb" --quiet --early-init-eval-command="set auto-load safe-path /" --command=$dir/exe/gdbinit.py "$@"

继续检查lib路径,其中都是glibc一类的打包时的库,如果链接libc.solibc.so.6的话, 就会显示缺少了符号。对啊,lib中就没有libc.so这个文件,它一般是安卓程序的依赖。 检查LD_PRELOAD,发现确实提前加载了一个libtermux-exec-ld-preload.so。 那就把LD_PRELOAD unset掉试试?这样就不会引入安卓的依赖了。然而,又出错了:

什么?这次直接报 invalid syscall 了?难道是有seccomp?我这么猜测,并用seccomp-tools 扫描了各种进程的seccomp filter(有root权限),结果都没有发现。这究竟是怎么回事?

我去求助pwndbg群友(discord),既不能设置LD_PRELOAD,又不能unset之,该如何是好? @cypis 检查了audit日志,并最终发现pwndbg调用了set_robust_list系统调用, 并被seccomp杀了。他发现,proot处理这些安卓上不能用的syscall, 因此使用proot启动就可以了。

感谢 @cypis 帮我找到问题所在,并找到解决方案!

写一个wrapper

基于以上考虑,只需要在unset LD_PRELOAD后,使用proot运行就可以了

$PREFIX/bin/pwndbg
1
2
3
#!/bin/sh
unset LD_PRELOAD
exec proot $PREFIX/../home/pwndbg/bin/pwndbg "$@"

然后在命令行里直接调用就可以启动了。

题外话

为了查看程序的沙箱,我尝试把ceccomp 移植到termux上,一开始有问题,后面一一解决了,现在只要LD_FLAGS加一个-largp就可以了。

一般来说检查程序已经应用的沙箱是需要CAP_SYS_ADMIN特权的,结果普通用户也可以正常检查, 我以为是给普通用户返回空结果了呢,结果root用户也检查不出来,最后看安卓内核源码发现, 根本没机会返回,内核直接拒绝了...

common/include/linux/seccomp.h
1
2
3
4
5
static inline long seccomp_get_filter(struct task_struct *task,
unsigned long n, void __user *data)
{
return -EINVAL;
}

具体是怎么知道的呢?可以检查手机的内核选项

1
2
sudo zgrep CONFIG_CHECKPOINT_RESTORE /proc/config.gz
# CONFIG_CHECKPOINT_RESTORE is not set

因此这个选项并没有被启用,也就无法调用这个接口了。

参考

  1. Releases - pwndbg/pwndbg
  2. proot/src/tracee/seccomp.c at master
  3. dbgbgtf1/Ceccomp: A tool to resolve seccomp
  4. seccomp.h: Android Code Search
  • 标题: 在termux上运行pwndbg
  • 作者: RocketDev
  • 创建于 : 2025-08-09 15:44:00
  • 更新于 : 2025-08-14 22:54:00
  • 链接: https://rocketma.dev/2025/08/09/pwndbg_on_termux/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论