【发布时间】:2014-04-01 05:49:02
【问题描述】:
我正在尝试使用 ptrace 在运行时更改另一个程序变量,在我的例子中是一个虚拟 shell。
int main(void)
{
char buf[MAXLINE];
fgets(buf, MAXLINE, stdin);
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0;
execlp("sh", "sh", "-c", buf, (char *)0);
printf("couldn't execute: %s", buf);
exit(127);
}
在我的注入器应用程序中,我使用 PTRACE_ATTACH 并监听 sys_read 系统调用;然后 PTRACE_GETREGS 尝试获取应该包含“buf”数组地址的寄存器。
ptrace(PTRACE_SYSCALL, pid, 0, 0);
wait(&status);
ptrace(PTRACE_GETREGS, pid, 0, ®s);
syscall_n = regs.orig_rax;
if (syscall_n == SYS_read){
switch(syscall_status){
case STARTED:
printf("Waiting user input... ");
syscall_status = WAITING;
break;
case WAITING:
printf("\t[ OK ]\n");
syscall_status = RETURNED;
break;
default:
break;
}
}
虽然我可以在调用 fgets 时捕获正确的打开系统调用,但我不知道应该使用哪个寄存器来获取字符串数组的地址。或者有没有更好的获取方式。
所以我以后可以使用 PEEKDATA 和 POKEDATA 来注入修改后的字符串。
顺便说一句,我已阅读“使用 ptrace 第 I 部分”文章,但我不明白如何使其适应我的目的。
【问题讨论】:
标签: arrays linux 64-bit ptrace