
在termux上运行pwndbg

在开发过程中,调试器是绕不开的一环,如果使用gdb的话,pwndbg是必不可少的伴侣。 平时大家主要在 PC 上使用 pwndbg,但偶尔只带了手机时,也需要在手机上做一些探索。 借助termux,可以实现在手机上编译并调试,不过只有原版的gdb未免过于简陋,有没有办法将 pwndbg搬到手机上呢?有的,兄弟,有的。
获取官方二进制包
打开pwndbg的releases页, 里面已经有针对arm64的包了,可以使用curl等工具下载后解压。然而, 直接解压后并不能直接运行:

无法启动?
如果仔细看的话,会发现这个pwndbg
是一个脚本,实际上会用ld去执行gdb。
1 |
|
继续检查lib路径,其中都是glibc一类的打包时的库,如果链接libc.so
到libc.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
运行就可以了
1 |
|
然后在命令行里直接调用就可以启动了。

题外话
为了查看程序的沙箱,我尝试把ceccomp
移植到termux上,一开始有问题,后面一一解决了,现在只要LD_FLAGS
加一个-largp
就可以了。
一般来说检查程序已经应用的沙箱是需要CAP_SYS_ADMIN
特权的,结果普通用户也可以正常检查,
我以为是给普通用户返回空结果了呢,结果root用户也检查不出来,最后看安卓内核源码发现,
根本没机会返回,内核直接拒绝了...
1 | static inline long seccomp_get_filter(struct task_struct *task, |
具体是怎么知道的呢?可以检查手机的内核选项
1 | sudo zgrep CONFIG_CHECKPOINT_RESTORE /proc/config.gz |
因此这个选项并没有被启用,也就无法调用这个接口了。
参考
- 标题: 在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 进行许可。