问题标签 [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.
c - 如何使用 ptrace 获取 char*
我目前正在开发一种工具,我必须在其中跟踪程序以了解他的系统调用。目前,我能够获取系统调用的数字参数,但无法正确获取字符串的地址。
这是我进行的方式:
使用那段代码,我可以获得字符串的开头(3 或 4 个第一个字符),但结尾已损坏,我不知道为什么。
你有什么解决办法吗?谢谢你。
c - ptrace_detach、SIGINT 和跟踪/断点陷阱(核心转储)
我正在尝试在程序运行时跟踪它:with ptrace(PTRACE_ATTACH, ...)
, ptrace(PTRACE_SINGLESTEP, ...)
, 等等。
一切似乎都很好,但是当我用 退出我的跟踪程序时CTRL-C,我想将它(用PTRACE_DETACH
)从被跟踪程序中分离出来,当我执行这个操作时,被跟踪程序崩溃并出现错误Trace/BPT trap (core dumped)
。
我的问题是:如何在不使跟踪程序崩溃的情况下正确分离?
这是捕获SIGINT
信号的函数:
编辑:
这是其他一些代码:
这是我循环的一部分,我在其中进行跟踪的第一部分
ios - PT_CONTINUE 在 iOS 上返回“不支持操作”
我希望编写一个在 iOS 越狱时使用 ptrace 的小型调试器。
现在我可以成功附加另一个进程,但是'PTRACE(PT_CONTINUE,m_tid,(caddr_t)1,数据)'总是返回'不支持操作',错误编号为45。
我只是无法使用 PT_CONTINUE 在 iOS 上恢复进程?附加后是否有等效的方法来恢复该过程?
linux - 在 Linux 中创建远程线程
我在 Windows 中使用CreateRemoteThread,想知道在 Linux 中是否有可能。在Linux中可以做到这一点吗?
c - 使用 SINGLESTEP 通过 ptrace 获取返回值
我正在 Linux 64 位下开发一个小调试器,但在寻找系统调用的返回值时遇到了麻烦,
我正在测试 RIP 值,我的意思是我做一个 PEEK_USERDATA 和 ptrace 给我操作码以返回没有 RIP 地址,直接这样(其中 0x050f 是 SYSCALL 的操作码):
然后获取系统调用名称参数等
问题是我如何获得这些系统调用的返回值,我知道 ptrace 提供 PTRACE_SYSCALL 来警告我们进入/离开内核模式,但我想直接检查 RIP 值,所以我使用 SINGLESTEP,我检查了如果我的 rip 匹配 SYSLEAVE 和 SYSEXIT 操作码,但它永远不会。我可以检查返回值的唯一方法实际上是检查我的 orig_rax 但我不会以这种方式获得 exit_group retval。
我知道 Linux ABI 希望将返回值存储在 RAX 中,但我不知道如何见证返回用户空间。
谢谢。
c - 为什么 strace 遵循不同的执行流程?
我指的是以下文章学习符号链接攻击:
现在,当程序休眠时,我rm
将 arg[1](使用另一个终端)作为文件名,然后为同一个文件创建一个符号链接。当我按照文章中所说的那样执行时,我正在写入链接指向的文件。
然后我使用 strace 传递了相同的参数,它给了我“无法打开”,这意味着我无权访问作为 arg[1] 传递的文件。但是当我正常执行时情况并非如此 strace 是如何检测到这个的?任何帮助都是非常有价值的。
我正在使用 ptrace 编写自己的应用程序来检测此类攻击。我尝试使用 inode 编号来检测这一点,但我的应用程序仍在引用我正在传递的文件的 inode 编号。
elf - 从 C 读取 Linux 上的 ELF 字符串表
我想编写一个读取二进制字符串表的程序。二进制文件在 ELF 中运行在 REDHAT linux 32 上。我做了以下 -
- 阅读精灵标题
- 阅读所有部分
下面是我的程序的输出。
我知道 Elf32_Shdr 中的 sh_name 基本上是字符串表的索引,它实际上包含一个以 NULL 结尾的字符串。我想显示这个以空字符结尾的字符串。我在这里有一个问题-
- 在上面的输出中,我们可以看到有多个 sh_type = 3 (SHT_STRTAB) 的 Section Headers 条目。所以我不明白如何将索引(Elf32_Shdr 中的 sh_name)映射到哪个部分?
在为具有 sh_type = 3 的部分打印 Elf32_Shdr 时,我得到以下输出 -
c - 如何跟踪系统调用的进程?
我正在尝试编写一个程序来跟踪系统调用。我很难完成这项工作。我尝试调用 fork() 来创建自身的实例(代码),然后监视生成的子进程。
目标是让父进程返回子进程进行的每个系统调用的索引并将其输出到屏幕。不知何故,它没有按计划工作。
这是代码:
此代码基于此代码:
这个的输出是:
这是 exec 系统调用的索引。
根据 wait() 的手册页:
我理解的方式是,每次用户程序调用系统调用时,内核将首先检查进程是否在执行系统调用例程之前被跟踪,并用信号暂停该进程并将控制权返回给父进程. 那不是已经改变了状态吗?
c - (ORIG_EAX*4) 在 ptrace 调用中
我在这里浏览了一篇文章,并尝试了我在下面复制的代码片段:-
我对传递给 ptrace 调用ORIG_EAX
的确切内容和原因有疑问。4*ORIG_EAX
我最初假设ORIG_EAX
,EBX
等ECX
将是存储寄存器值的特定结构的偏移量。
所以我决定在等待之后通过使用打印 ORIG_EAX 的值printf("origeax = %ld\n", ORIG_EAX);
。值为11
。所以,我之前关于偏移量的假设是错误的。
我知道wait
当孩子发生状态变化(在这种情况下,发出系统调用)时调用被终止,并且 ORIG_EAX 将包含系统调用号。
但是,为什么将 ORIG_EAX * 4 传递给 ptrace 调用?
c - 寄存器上的 ptrace 观察点
我正在编写一个带有一些调试功能的 C 程序。我需要在 ptraced 进程的寄存器访问上设置断点。最好的方法是什么?