【问题标题】:Why is my mprotect function called with 5 arguments?为什么用 5 个参数调用我的 mprotect 函数?
【发布时间】:2010-12-10 15:06:30
【问题描述】:

根据Linux man page for mprotect,该函数有3个参数:

int mprotect(const void *addr, size_t len, int prot);

但是在我正在分析的程序上运行 ltrace 时,我看到 mprotect 是这样调用的:

mprotect(0x8049000, 4096, 3, 1, 0xb7e057ac)      = 0

第 4 个和第 5 个参数是干什么用的?

我使用的是 ltrace 0.5 版。和内核 2.6.24-24-generic

【问题讨论】:

  • 第五个怎么样?
  • 抱歉,在扫描参数时我错过了第四个 ;)
  • 哪个版本的 strace。哪个版本的 linux 内核?
  • 对不起,现在看到你说的是 ltrace。
  • ltrace 只是将这些项目从调用堆栈中取出。真正的问题是为什么他们一开始就被推到那里去。

标签: c security mprotect ltrace


【解决方案1】:

5 是 ltrace 如果在配置文件中找不到函数描述时将打印的参数数量。 (我认为默认是 /etc/ltrace.conf)。

在我的系统上,我可以看到相同的行为,但在那里找不到 mprotect,只有 SYS_mprotect。

如果你想再看一下 ltrace 源码,感兴趣的地方是 output.c,“func = name2func(function_name);”之后的条件- 打印 5 个参数 如果找不到函数名称的元信息(在这种情况下,name2func 中的线性查找返回 NULL)。

所以,手册是正确的,它是“错误”的 ltrace(引用“错误”是因为从技术上讲代码可以正常工作,尽管配置中的 defs 可能应该被修复)

【讨论】:

  • 这些天似乎是ret->num_params = 4; in build_default_prototype。不过,感谢您的评论,它帮助我了解了 ltrace 如何从未知函数中确定 # args 。我希望这会是一些神奇的算法。
猜你喜欢
  • 2015-08-04
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 2010-11-28
相关资源
最近更新 更多