gpt4 book ai didi

linux - 如何修改EIP的tracee forked procee?

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:18 26 4
gpt4 key购买 nike

我正在开发一个包含 ptrace 的 Linux 应用程序,以观察另一个由 fork() 系统调用创建的进程。

严格来说:我想在 fork 进程(智利进程或“tracee”)中实现故障注入(inject)。

如下图所示:

enter image description here

enter image description here

跟踪器通过使用 PTRACE_GETREGS 请求从被跟踪者获取 regs (struct_user_regs) 结构。之后,tracer 修改tracee 的EIP 值(当内核切换到tracee 时,命令执行将违反所谓的控制流错误CFE)。然后 PTRAC E_CONT 请求将发送给 tracee 以继续执行。

不幸的是,在修改了 EPI 的 tracee 之后,tracee 由于(段错误)而没有继续执行。如何给被跟踪的EIP另外一个合适的值?

这是代码

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include<sys/user.h>
#include<sys/reg.h>
#include<stdlib.h>
#include<stdio.h>
#include <asm/ptrace-abi.h>

int main()

{

pid_t child;
int status;
int sum=0;
struct user_regs_struct regs;


child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);

printf("hello world 1\n");
printf("hello world 2\n");
raise (SIGINT); // just to move control to the tracer
printf("hello world 3\n");
printf("hello world 4\n");
printf("hello world 5\n");

exit(EXIT_SUCCESS);
}
else {

wait(NULL);
ptrace(PTRACE_GETREGS, child,NULL, &regs);
printf("\n EIP @ 0x %#lx\n",regs.eip);
//get the tracee EIP
long int new_eip=ptrace(PTRACE_PEEKTEXT, child,regs.eip,NULL);
//chabge EIP and poke it again
new_eip += ???; // make change that let to jump to another tracee instruction address (say to print hello world 5)
ptrace(PTRACE_POKETEXT, child,regs.eip,new_eip);
ptrace(PTRACE_CONT, child, NULL, NULL);

}

return 0;
}

有什么想法吗?感谢您的所有帮助。

最佳答案

您不是在修改 EIP,而是在 EIP 的指令值中添加一些内容,并且可能导致错误的地址引用。要更改 EIP,请使用 PTRACE_SETREGS

      wait(NULL);
ptrace(PTRACE_GETREGS, child,NULL, &regs);
printf("\n EIP @ 0x %#lx\n",regs.eip);
regs.eip += ???;
ptrace(PTRACE_SETREGS, child, NULL, &regs);
ptrace(PTRACE_CONT, child, NULL, NULL);

关于linux - 如何修改EIP的tracee forked procee?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38796282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com