strace
用来跟踪系统调用
-f
fork跟踪子进程
-s
输出string大小,默认32
-c
进行系统调用统计(system Time,花费在内核),退出时输出总结
-T
每次系统调用统计
-o
输出到文件,便于分析,因为这个输出全是到stderr
, 2>&1
不太好操控
-e
后面跟:[qualifier=][!][?]value1[,[?]value2]
此开关后参数就多了,我常用trace这个修饰(qualifier),还有abbrev, verbose, raw, signal, read, write, fault, or inject
!
就是取反,看情况是否需要转义。value
是依前置修饰的不同而不同,比如trace
后跟系统调用,write、read
后跟数字(文件描述符)
trace
指定系统调用,比如read connect stat
,可以使用正则/regex
,POSIX正则表达式,参见shell 第64条
或者指定一定范围的系统调用:无需多言
- %file 文件名作为参数的系统调用
- %network
- %desc 文件描述符相关的系统调用
- %memory
- %process
- %ipc
- %signal
- %stat %fstat %lstat
stat, fstat, lstat, fstatat - get file status
- %pure 无参系统调用
read 与 write
举例sudo strace -e read=3 -e trace=connect,read telnet baidu.com 7878
同时跟踪read
和connect
系统调用,同时还要输出文件描述符3
的内容
inject
才注意到个inject,居然可以注入返回值!
实用技巧
- 这个程序访问了哪些域名? 查出你的dns,strace 后
grep $dns
另一种方式是内核注入mod等 - 分析系统程序;比如万一它打开了个可执行程序、脚本了呢?strace后
grep 0644
答复2021-11-09 Cannt add PPA