我正在编写一个使用Ptrace的程序并执行以下操作:
int sys_open(const char * filename,const int mode,const int mask)
所以eax = 5意味着它是一个开放的系统调用
我发现ebx拥有此Question文件位置的地址
但是我怎么知道文件名的长度所以我可以读取该位置的内容?
我遇到了以下同样问题的问题
Question 1
Question 2(这只是我的!)
但我仍然无法解决我的问题。 :(因为两个答案都不清楚。
当我在Question-1中尝试方法时,我仍然遇到分段错误
您可以查看我的代码here
所以现在我真的想知道strace如何如此美妙地提取这些值:(
答案 0 :(得分:4)
如您所知,sys_open()
没有收到文件名大小作为参数。但是,标准表示文字字符串必须以\0
字符结尾。这是个好消息,因为现在我们可以对字符串的字符进行简单的循环迭代,当我们找到\0
(NULL)字符时,我们就知道它已经到了它的末尾。
这是标准程序,strlen()
是如何做到的,以及strace如何做到这一点!
C 示例:
#include <stdio.h>
int main()
{
const char* filename = "/etc/somefile";
int fname_length = 0;
for (int i = 0; filename[i] != '\0'; i++)
{
fname_length++;
}
printf("Found %d chars in: %s\n", fname_length, filename);
return 0;
}
回到手头的任务,您必须访问filename
的地址并执行我刚才描述的过程。这是你必须要做的事情,没有别的办法。