【问题标题】:Stacktrace for libc C function call on Android/LinuxAndroid/Linux 上 libc C 函数调用的 Stacktrace
【发布时间】:2017-10-29 05:04:13
【问题描述】:

通常堆栈跟踪(回溯)是从调用特殊堆栈跟踪生成函数的点生成的(例如此处的_Unwind_Backtrace:Android NDK: getting the backtrace)。是否可以生成还包含 libc 函数的堆栈跟踪?例如,我想在从我的程序调用“open”libc 调用时检查堆栈跟踪(不修改 libc 库)。我知道在 Java 中可以调用一些引发异常的方法,并从引发异常的点获取异常处理程序中的堆栈跟踪。我想在 C 中做类似的事情,但我认为这是不可能的,因为 C 中甚至没有例外。

【问题讨论】:

  • 建议用参数-ggdb 编译你的程序然后用参数-ggdb 链接你的程序然后运行gdb <your program name>。在任何时候(在单步执行程序时,如果您想要回溯,请输入“bt”。但是请注意,除非您的操作系统的源文件对gdb 可见,否则gdb 可以显示 VERY关于系统文件内容的小信息。

标签: android c linux stack-trace libc


【解决方案1】:

例如,我想在从我的程序调用“open”libc 调用时检查堆栈跟踪(不修改 libc 库)。

有几个用例需要考虑:

  1. 从您的程序直接调用open
  2. 间接调用(例如,您调用getgroups,打开/etc/nsswitch.conf
  3. open 的调用根本不是由您的程序触发的(例如,动态加载程序打开 libc.so

您的问题表明您只对案例 1 感兴趣,这很容易解决:编译要从中拦截 open 的代码和 -Dopen=open_with_stacktrace,并链接到单独的文件:

// Compile without -Dopen=...
#include <stdlib.>
ssize_t open_with_stacktrace(const char *fname, int flags, int mode)
{
  // Do whatever to record the stack trace.
  return open(fname, flags, mode);
}

对于情况 2,您可以通过LD_PRELOAD 使用function interposer

对于案例 3,您必须使用外部跟踪器,例如 GDB。

我真正想要的是实现安全功能......

你应该从那开始。一般来说,您无法在程序本身中实现任何有意义的安全性,您必须使用外部监视器。

您正在尝试检测是否有人插入了open。但是有人可以很容易地插入您的“检查器”功能,并使其始终返回“一切都很好”的结果。

您应该考虑改用sandboxing techniques 之一。

【讨论】:

  • 问题是我需要从程序本身的代码中获取它。我真正想要的是实现安全功能,该功能通过检查堆栈跟踪从程序中检测是否有人更改/插入了对共享库(如 libc)的调用。我对 1. 和 2. 案例都感兴趣(如果可能的话)。您对案例 1 的建议将不起作用,因为程序将无法检测 open_with_stacktrace 中的 open 调用是否真的被钩住了。
  • 是的,任何检查都可以绕过,但这并不意味着检查不应该存在(例如,存在对游戏和电影的保护,即使它们最终都会被黑客入侵,如果有足够的动机)。它仍然使逆向工程师的生活复杂化。我不认为沙盒技术对我有用,而且它也太复杂了,因为目前我只需要一个特定的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多