查找 sigtrap 函数

逆向工程 linux 反调试
2021-06-19 16:44:39

我正在反转一个使用大量BREAK/ int 3(Linux) 的程序。我猜该代码包含以下内容:

void sigtrap_func(int sig) { (some stuff..) }

int main()
{
  signal(SIGTRAP, sigtrap_func);
  (some stuff)
  asm("int 3");
  (and so on)
  asm("int 3");

etc..

我全部换成SIGTRAPNOPS和程序行为不同于他们。所以,我确信在sigtrap函数内部做了一些事情

如何仅使用汇编程序找到此功能?

2个回答

这就是 strace 派上用场的地方。如果我使您的程序可编译并编译它:

$cat trap.c
#include <signal.h>
void sigtrap_func(int sig) { puts("trap"); }

int main()
{
  signal(SIGTRAP, sigtrap_func);
}
$ cc -o trap trap.c

然后用 运行它strace,我会得到程序执行的所有系统调用的列表:

$strace -i ./trap 
[      31076ad057] execve("./trap", ["./trap"], [/* 32 vars */]) = 0
... stuff omitted that loads dynamic libraries
[      3107632abe] rt_sigaction(SIGTRAP, {0x400504, [TRAP], SA_RESTORER|SA_RESTART, 0x31076329a0}, {SIG_DFL, [], 0}, 8) = 0
[      31076ad038] exit_group(0)        = ?

您会看到rt_sigaction(实现 的系统调用signal())在 处被调用0x3107632abe,并将处理程序函数设置为0x31076329a0现在是开始的时候了gdb,并在那里设置断点(尽管要小心 ASLR!)。

就像在您的示例程序中一样,信号处理程序是使用signal(或sigaction)函数安装的因此,您只需要找到对该函数的调用并查看传递给它的参数。该参数将是信号处理程序的地址。