使用ptrace解析返回和调用
我正在为我的学校项目用C编写一个ftrace程序,我使用ptrace()syscall解析指令。 我计算调用操作码(0x9a、0xe8、0xff,当0xff后面的字节的位(5,4,3)对应于调用)和ret操作码(0xc3、0xc2、0xca、0xcb)。 以下是我跟踪的程序:使用ptrace解析返回和调用,c,assembly,ptrace,C,Assembly,Ptrace,我正在为我的学校项目用C编写一个ftrace程序,我使用ptrace()syscall解析指令。 我计算调用操作码(0x9a、0xe8、0xff,当0xff后面的字节的位(5,4,3)对应于调用)和ret操作码(0xc3、0xc2、0xca、0xcb)。 以下是我跟踪的程序: #include <stdlib.h> #include <stdio.h> int chevre(char *lel) { printf("Chevre\n"); free(le
#include <stdlib.h>
#include <stdio.h>
int chevre(char *lel)
{
printf("Chevre\n");
free(lel);
return (420);
}
int main()
{
char *lel;
lel = malloc(42);
chevre(lel);
return (0);
}
#包括
#包括
内部切弗(字符*lel)
{
printf(“Chevre\n”);
免费(lel);
返回(420);
}
int main()
{
char*lel;
lel=malloc(42);
切夫尔(lel);
返回(0);
}
我的问题是:为什么只有751次回程才能接到777个电话?当我只得到几个函数时(我成功地找到了解析ELF文件可执行文件和.plt部分的函数),为什么会有这么多调用
谢谢你的帮助
编辑:
问题在于过滤0xff操作码:我试图读取地址RIP-8处的字节,这是第一个参数的一部分,因为堆栈变小,指令信息位于地址RIP+8处。
读取我告诉我读取的操作码是有效的。函数的
printf
级别相对较高,将调用其他较低级别的函数,该函数反过来执行多个系统调用。然后,您必须考虑您所编写的代码与某些启动代码相链接,main
函数是您的代码开始运行的地方,。但是程序不是从哪里开始的,有很多代码,有那么多的调用,必须在main
函数之前和之后进行。@JoachimPileborg对我来说听起来像是一个答案:)//还有,+1代表山羊。我在调用n°678时得到了u libc_start_main,所以我猜在那之前是libc加载之类的。但电话号码和ret号码之间的差异是我的错误还是正常的?(编辑:如果我是对的,printf函数是一个宏,真正的函数是puts)printf
不是一个宏,但是编译器可以替换一个常量printf
,该常量以一个换行符结束,并带有puts
。