问题标签 [ptrace]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
370 浏览

c - 忽略系统调用

我知道您可以使用ptrace来捕获系统调用。但我想做的是忽略系统调用。ptrace是否有可能捕获系统调用,查看其编号,如果该编号是必须忽略的系统调用的编号,则ptrace会阻止系统调用继续进行或让系统调用立即返回。

关键是我们应该通过使用ptrace让应用程序忽略特定的系统调用。

0 投票
1 回答
1037 浏览

c++ - PTRACE_SYSCALL 和 orig_eax

如果子进程执行读取和写入之外的其他系统调用(甚至过滤这些调用,但这是另一回事),我想杀死一个子进程,但默认情况下会执行一些系统调用。

我已经编译了一个空的测试子程序(立即退出),并且我还有一个父进程,它分叉、启用 ptracing 并执行子程序。父进程使用 PTRACE_SYSCALL 并且每次都检查 orig_eax。我的测试程序报告说孩子被停止了 49 次(我假设这意味着 48 / 2 + 1 系统调用)。

我想知道系统调用序列是否始终相同(初始化)和/或有可能知道我何时可以开始以及何时停止我父母的 kill-on-syscall?

0 投票
2 回答
2768 浏览

c - C - 获取使用 popen 打开的进程的 PID

我有一个用 C 语言编写的程序,它使用 popen 打开另一个程序。我想获得该程序的 pid 或某种处理程序,以便在一定时间限制后杀死它,或者如果它超过了一些 ram 和 stdout 限制。我认为这必须用ptrace来完成,它需要PID,我不知道如何获取。

0 投票
1 回答
571 浏览

c - 计算linux中特定进程使用的内存量

我正在编写一个程序来跟踪子进程调用的每个系统调用并确定它的确切内存使用情况(不包括共享内存)。

这是我的计划。

让父进程跟踪子进程,

如果子进程进行系统调用,父进程将收到 SIGTRAP,

然后使用 ptrace(PTRACE_PEEKUSER, child_pid, 4*ORIG_EAX, NULL) 获取系统调用 ID。

当 id 等于 SYS_brk、SYS_sbrk、SYS_mmap2、SYS_mmap、SYS_mremap、SYS_munmap 时,

我能够获取调用参数并计算内存使用量。

但这让我很困扰

  1. 我不确定如何计算。

  2. SYS_mmap2 有超过 6 个参数,我该如何获取呢?

0 投票
2 回答
1318 浏览

c - 使用 ptrace 获取机器指令

我编写了一个简单的程序来获取使用 ptrace 的进程指令。你可以在这里找到代码

http://pastebin.com/yHbkc0Je

我在 Ubuntu 64 位下编译并运行它。

我得到的是这样的:

当我使用gdb时,我只能看到EIP下的那些指令:400dab......我找不到那些在7f下......所以我猜它是错误的......

谁能解释我的代码为什么错误以及如何只打印正确的 EIP 和说明?

0 投票
2 回答
1124 浏览

c - 如何防止进程产生更多子进程

我正在为我的大学局域网上进行类似 ACM-ICPC 的比赛做一名在线评委。为此,我要求法官可能足够安全,以防止恶意程序在我的服务器上执行。(这样的程序的一个例子是)

让我们调用这个程序的可执行文件testcode

这个程序会导致我运行法官的服务器冻结。显然我不希望这种情况发生。所以为了防止我尝试使用 ptrace。我想出了以下代码:(让我们调用这个代码监视器的可执行文件)

此代码在阻止可能导致问题的系统调用方面效果很好。但是当要监视的代码包含循环中的 fork 调用(如测试代码)时,机器会因为颠簸而冻结。我可以弄清楚的原因是原始进程被杀死根据监控代码,它的孩子幸存下来并继续携带叉形炸弹。如何修复监控代码,使其可以成功部署?

PS:可移植性不是问题。我正在寻找一个Linux特定的答案。

编辑:在调用 exec 之前,我使用 setrlimit 将子进程的最大数量设置为 0。到目前为止,这似乎是一个很好的解决方案。尽管如果监视器代码中仍然存在漏洞,很高兴听到社区的消息。

0 投票
2 回答
2326 浏览

c++ - GDB strace 显示它试图在无效地址处进行 ptrace

我在gdb调试期间执行ni命令时遇到了这样的错误:

警告:
无法插入断点 0。
访问内存地址 0x3ac706a 时出错:输入/输出错误。

/lib/libc.so.6 中的 siglongjmp () 中的 0xf6fa4771

为了调查 gdb 遇到的问题,我 strace gdb 并获得这样的输出:

rt_sigprocmask(SIG_BLOCK,NULL,[RT_1],8)= 0
ptrace(PTRACE_PEEKTEXT,651,0xcc4fdf60,[0x1cc4fe470])= 0
ptrace(PTRACE_PEEKTEXT,651,0xcc4fe480,[0x3ac706a4506fa1d])= 0
rt_sigproc1(SIG ], 8) = 0
...<br> ...
rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0
ptrace(PTRACE_GETREGS, 27781, 0, 0x7fff8990e8b0 ) = 0
ptrace(PTRACE_PEEKTEXT, 27781, 0x3ac7068, [0x28b]) = -1 EIO (输入/输出错误)
ptrace(PTRACE_PEEKTEXT, 27781, 0x3ac7068, [0x28b]) = -1 EIO (输入/输出错误)

这意味着 gdb 首先 ptrace 在内存地址0xcc4fe480并获取值0x3ac706a4506fa1d(实际上是一个 8 字节值0x03ac706a4506fa1d)。稍后它从该值的前 4 个字节中获取对齐的地址0x3ac7068,这是一个无效地址并导致 gdb 无法 ptrace。

/proc/[pid]/maps 的内容:

cbce2000-cc353000 R-XP 00000000 08:03 295479 xxx.so
cc353000-cc3f0000 - [R - P 00670000 08:03 295479 xxx.so
cc3f0000-cc3f6000 RW-P 0070d000 08:03 295479 xxx.so
cc3f6000-cc3fe000 RW-P cc3f6000 00:00 0
cc3fe000-cc3ff000 --- p cc3fe000 00:00 0
cc3ff000-cc4ff000 rwxp cc3ff000 00:00 0
cc4ff000-cc500000 --- p cc4ff000 00:00 0

cc500000-cc600000 rwxp cc500000 00:00 0
cc62d000-cc673000ř -xp 00000000 08:03 295545 yyy.so
cc673000-cc674000 ---p 00046000 08:03 295545 yyy.so
cc674000-cc675000 r--p 00046000 08:03 295545 yyy。
cc675000-cc676000 rw-p 00047000 08:03 295545 yyy.so

它表明地址0xcc4fe480来自上面的粗体部分。本节与任何 .so 或 bin 文件无关。

这个问题其实和另一个问题http://stackoverflow.com/questions/9564417/gdb-cant-insert-internal-breakpoint有关,这个问题还没有解决。我在调查上一期时发现了这些问题。

我在这里有 3 个问题:
1. 在这里查看 ptrace 的 strace 输出:
ptrace(PTRACE_PEEKTEXT, 651, 0xcc4fe480, [0x3ac706a4506fa1d]) = 0
为什么最后一个参数用方括号注释?这是否意味着它代表返回值?手册页说 ptrace 应该返回为 PTRACE_PEEKTEXT 读取的单词,但它看起来 strace 输出没有遵循,所以我怀疑它在最后一个参数中显示了返回值。
2. 两个.so 之间有一个节(who 用粗体字),但不与任何inode 关联。这样的部分代表什么?
3. Gdb 从该部分读取一个字并将该字用作地址,但实际上这是一个无效地址。这种错误的可能原因是什么?

谢谢!

0 投票
2 回答
3486 浏览

c - 跟踪系统调用

我有以下代码:

我得到了奇怪的结果,如下所示:

通常,当使用stracesshd 会话进行跟踪时,我总是在写入 shell 时获得对 read 和 write 系统调用的调用。但是有了那个函数,我没有得到那个(我猜是假的)系统调用,只有(如你所见):1、0,等等......

有谁能够帮我?谢谢。

0 投票
1 回答
2312 浏览

c - 使用 ptrace 进行系统调用跟踪

我编写了一个程序来列出由命令(例如 /bin/ls)执行的所有系统调用。现在我要做的是找到所有可能传递给它的系统调用参数、环境变量、命令行参数

示例:如果我打开一个文件。系统调用 sys_access 会打开文件吗?但是如何获得这些值呢?
想要对系统调用执行此操作,例如打开、读取、写入、关闭。

根据我的研究,这些必须在寄存器中(ebx - edx)如果是这样,这些寄存器值意味着什么?我得到了这个链接
但我真的不能从那里得到什么。此外,对此的任何进一步参考都会很有帮助。

0 投票
2 回答
438 浏览

c - 使用 Ptrace 找出参数对系统调用的确切含义

我已经发布了以下问题,得到了解决方案并继续前进,
我正在使用 ptrace 查找传递给系统调用的所有参数。
该程序正在获取我在 ebx、ecx、edx 中的值。现在,对于一个开放的系统调用,我知道了

系统调用 5:ebx:bf9748af ecx:00008000 edx:00000000 /打开
系统调用 5:ebx:80485b3 ecx:00000242 edx:000001b6 /打开

我使用了 strace,它神奇地转换了上面的内容,如下所示:

打开(“test.txt”,O_RDONLY|O_LARGEFILE)=3
打开(“test.txt”,O_RDWR|O_CREAT|O_TRUNC,0666)=3

我该如何手动执行此操作?有什么地方可以找到 O_LARGEFILE 的值吗?
我搜索了很多并遇到了这个但它没有一切。还尝试阅读 strace 代码,但没有遇到此转换的代码。
如果有人可以帮助我,那将对我非常有帮助。另外,如果您知道这是在 strace 中写的,我想看看它。提前致谢。