【问题标题】:Making a system call using ptrace but without poking the text使用 ptrace 进行系统调用但不戳文本
【发布时间】:2013-12-21 14:22:01
【问题描述】:

从跟踪器进行系统调用以使系统调用像被跟踪者调用一样执行的最佳方法是什么?我宁愿这样做而不写到被跟踪者的文本页面。

如果跟踪进程是动态可执行文件,则动态链接器保证具有系统调用指令。跟踪器可以找到它并将指令指针设置为它。静态可执行文件实际上会在文本中的某处包含指令。

如果最好的方法是将系统调用指令写入文本,PTRACE_POKETEXT会自动将目标页面更改为可写吗?如果没有,我们就有鸡和蛋的问题。如果是,跟踪器是否负责将页面改回只读状态?

【问题讨论】:

    标签: linux ptrace


    【解决方案1】:

    您的想法实际上适用于许多系统调用。您需要了解确切的调用约定——您必须使用 ptrace() 来加载带有参数 (*) 的跟踪对象的寄存器。找到一条系统调用指令(**),即从用户模式下降到内核模式的指令,并在之后设置断点。现在将指令指针寄存器设置为系统调用指令的地址,并告诉跟踪进程执行 - 当它从系统调用返回时,执行将击中您的断点,跟踪进程可以获得控制权并可以检查返回值并执行什么是合适的。要进行清理,您需要删除断点并将寄存器设置回其原始值,包括指令指针。

    (*) 某些系统调用的参数太多,无法放入寄存器,想到 mmap(),请确保并处理这些情况。

    (**) 如果可以反汇编libc.so,在反汇编中找到一些系统调用(open、read、write、socket、mmap等)看看。每个都有一个系统调用指令。

    【讨论】:

    • mmap() 有六个参数。系统调用约定允许在寄存器中使用这个数字。是否有任何系统调用的参数超过六个?
    猜你喜欢
    • 2012-04-03
    • 2012-08-14
    • 2011-07-26
    • 2012-10-23
    • 2017-01-03
    • 2011-06-09
    • 1970-01-01
    • 2012-11-05
    • 2020-11-30
    相关资源
    最近更新 更多