Elf 如何检测函数是否调用fopen?

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

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

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

您的问题非常令人困惑,但我认为您要问的是:“我是否可以通过编程确定
pam\u sm\u authenticate
调用
fopen

出于以下几个原因,这是一个错误的问题:

  • 如果
    pam\u sm\u authenticate
    调用
    foo
    ,并且
    foo
    调用
    fopen
    ,那么您仍然存在问题,因此您确实应该扫描
    pam\u sm\u authenticate
    及其调用的每个函数(递归)
  • fopen
    远非编写文件的唯一方式:您还可以使用
    open
    ,或
    system
    (如
    系统(“echo$secret>/tmp/backdoor”)
    ,或直接
    sysopen
    syscall,或大量其他黑客攻击
  • 最后,
    pam\u sm\u authenticate
    可以使用技术在运行时构建任意代码(包括代码调用
    fopen
    ),通过检查其代码来回答它是否这样做等同于解决问题(即不可能)
TL;DR:从理论上讲,构建一个强大的“pam后门扫描仪”是不可能的,所以你现在应该放弃,考虑其他解决问题的方法

您的问题非常令人困惑,但我认为您要问的是:“我是否可以通过编程确定
pam\u sm\u authenticate
调用
fopen

出于以下几个原因,这是一个错误的问题:

  • 如果
    pam\u sm\u authenticate
    调用
    foo
    ,并且
    foo
    调用
    fopen
    ,那么您仍然存在问题,因此您确实应该扫描
    pam\u sm\u authenticate
    及其调用的每个函数(递归)
  • fopen
    远非编写文件的唯一方式:您还可以使用
    open
    ,或
    system
    (如
    系统(“echo$secret>/tmp/backdoor”)
    ,或直接
    sysopen
    syscall,或大量其他黑客攻击
  • 最后,
    pam\u sm\u authenticate
    可以使用技术在运行时构建任意代码(包括代码调用
    fopen
    ),通过检查其代码来回答它是否这样做等同于解决问题(即不可能)

您的程序也可以
dlsym()
函数,或者在过程中通过迭代ELF符号表等直接查找它们。您的程序也可以
dlsym()
函数,或者通过迭代ELF符号表等直接在过程中查找它们。