【问题标题】:How to detect if a function called fopen or not?如何检测是否调用了 fopen 函数?
【发布时间】:2015-07-30 05:01:06
【问题描述】:

我正在尝试编写一个pam后门扫描程序,它可能会调用pam_sm_authenticate中的fopen函数(普通文件不会在此函数中调用fopen)来存储用户名和密码,但是我不能使用外部命令,例如“nm , readelf" 或类似的东西,所以唯一的方法似乎是扫描 pam_sm_authenticate 函数并找到所有调用指令并计算地址以检查它是否正在调用 fopen,但这太麻烦了,我对 ELF 文件不太熟悉(我什至不知道如何找到 pam_sm_authenticate 的偏移量,我正在使用 dlopen 和 dlsym 来获取地址..),所以我想知道是否有更好或更简单的方法来检测它?谢谢。

【问题讨论】:

    标签: elf


    【解决方案1】:

    TL;DR:构建一个强大的“pam 后门扫描器”在理论上是不可能的,所以你现在应该放弃并考虑其他方法来解决你的问题。

    您的问题非常令人困惑,但我认为您要问的是:“我可以通过编程方式确定pam_sm_authenticate 是否调用fopen”。

    这是一个错误的问题,有几个原因:

    • 如果pam_sm_authenticate调用foo,而foo调用fopen,那么你仍然有问题,所以你真的应该扫描pam_sm_authenticate 它调用的每个函数(递归),
    • fopen 与写入文件的唯一方法:您也可以使用opensystem(如system("echo $secret > /tmp/backdoor") 或直接sys_open 系统调用,或许多其他黑客。
    • 最后,pam_sm_authenticate 可以在运行时使用just-in-time compilation 技术构建任意代码(包括调用fopen 的代码),并通过检查其代码来回答是否可以解决halting problem(即不可能)。

    【讨论】:

    • 您的程序也可以dlsym() 函数或通过遍历 ELF 符号表等直接在进程中查找它们。
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多