- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个包含 ptrace 的 Linux 应用程序,以观察另一个由 fork() 系统调用创建的进程。
严格来说:我想在 fork 进程(智利进程或“tracee”)中实现故障注入(inject)。
如下图所示:
跟踪器通过使用 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, ®s);
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, ®s);
printf("\n EIP @ 0x %#lx\n",regs.eip);
regs.eip += ???;
ptrace(PTRACE_SETREGS, child, NULL, ®s);
ptrace(PTRACE_CONT, child, NULL, NULL);
关于linux - 如何修改EIP的tracee forked procee?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38796282/
我的程序在 Windows Vista Ultimate 和 Windows 7 上运行完美,但在 Windows XP 上运行失败。 首先,我的应用程序创建一个系统文件进程,它调用 GetThrea
我正在尝试利用该程序中的缓冲区溢出我使用的是 32 位 kali_linux #include void win() { printf("code flow successfully changed
我想编写一个易受攻击的程序,以更好地理解 c# 中的 Stack Overflow(原因),也用于教育目的。基本上,我“只是”想要一个堆栈溢出,覆盖 EIP,所以我可以控制它并可以指向我自己的代码。我
嗨,我真的陷入了这个问题:这是我的代码,下面是我尝试溢出的代码: #include #define B 145 // 141 for ex overflow #define A 0 char sc[
在Spring Integration我需要按顺序将消息发送到子流 A(它将消息存储到数据库中),然后再发送到子流 B(它使用一些数据库查找)。整个 A 和 B 执行应该在一个事务的边界内执行。 最初
我正试图通过更改它的 EIP 来破解另一个程序。有两个程序在运行,一个是目标,它告诉函数“核心函数”(例如,接收密码字符串作为参数并返回 true 或 false 的函数)在内存中的位置。然后现在我知
eip 寄存器是 32 位,每条新指令都会递增。那么当它达到 32 位数字的最大值时会发生什么:4294967295。 最佳答案 通常,您不会让它发生。 %eip 不会无条件递增;它受流控制指令(如
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: use callback function to report stack backtrace 给定一个 void
我最近一直在编写一些内核模块。对于某些模块,每次插入或删除它们时,屏幕上都会显示巨大的内核跟踪。错误有点像 ERROR: Bad EIP value. 或 ModuleName is tainted
我有一个 Camel 路由,它从队列中取出一条消息,将它发送到一个 bean 进行处理,然后将消息排回另一个队列。 我正在尝试消除第二个队列中的“重复消息”。 Camel 是否有任何端点、处理器、EI
我正在尝试解决缓冲区溢出问题。我不明白这里的 eip 值是怎么回事。 这是 C 代码: void copy(char *arg) { char msg[256]; strcpy(msg,arg
这个问题看起来像是一个肮脏的 hack,你不应该这样做,但让我先解释一下。最终目标是像 C++ 中那样拥有方法局部静态。 void Func() { static methodLocalObje
我在 ubuntu 12.04 和 64 位机器上工作。我在读一本关于缓冲区溢出的好书,在玩一个例子时发现了一个奇怪的时刻。 我有这个非常简单的 C 代码: void getInput (void)
在 x86 架构中的函数调用期间,是否存在返回地址未压入堆栈的情况? 最佳答案 号CALL根据定义,将在跳转到目标地址之前将返回地址压入堆栈。那个返回地址是 EIP (或 RIP)+ sizeof(c
我有一个 CloudFormation 模板,它为 RStudio Server 启动了一个 EC2 实例。 AWSTemplateFormatVersion: 2010-09-09 Descript
在处理一些 x86 asm 时,我想知道错误导致 EIP 被设置为 00000000 或另一个不存在的内存位置的情况。是否可以使用 SEH 或类似的错误处理机制捕获这些情况并恢复执行? (假设堆栈、堆
对于计算机体系结构和处理器/内存级别发生的低级内容,我完全是新手。我首先要说的是。我对计算机所做的工作几乎一直处于高级编程水平。 C++、Java等话虽这么说,我目前正在读一本开始深入研究低级编程内容
我(也许过于简单)对 EJB3 的理解是,它是一种将 POJO 转变为符合 Java EE 的业务逻辑单元的方法。它是可重用的,可以“插入”到跨越多个项目的不同后端架构。这是朝着真正的组件驱动架构方向
我正在尝试开发运行时堆栈跟踪器。我有一个函数,只要被跟踪的程序出现段错误,它就会返回 EIP 地址。我怎样才能回到当前函数的 ebp(被观察程序崩溃的那个函数),以便我可以开始跟踪? 最佳答案 无法将
我正在使用 Apache Camel 2.15 并发现了一个有趣的行为。我将通过 REST API 调用接收到的数据放入作为直接端点的 Camel 路由中。该路由又使用拆分的 EIP 并调用另一个也是
我是一名优秀的程序员,十分优秀!