我想了解一个程序。该程序实现了一种反调试技术。

据我到目前为止的了解,父亲ptrace是一个分叉的过程。 >
some code
Int 3
some code
Int 3
some code
Int 3


等等

我认为父亲实现了一种调试器,因为有了strace -i,我看到了很多:

[77b7457c] waitpid(2468, [{WIFSTOPPED(s) && WSTOPSIG(s) == SIGTRAP}], __WALL) = 2468
[77b7457c] --- SIGCHLD (Child exited) @ 0 (0) ---
[77baf52c] ptrace(PTRACE_GETREGS, 2468, 0, 0x7fb68be4) = 0
[77baf52c] ptrace(PTRACE_SETREGS, 2468, 0, 0x7fb68be4) = 0
[77baf52c] ptrace(PTRACE_CONT, 2468, 0, SIG_0) = 0


它使我想起了该文档http://www.alexonlinux.com/how-debugger-works,在其中我们发现了相同的想法:子进程,发送TRAP,由父亲通过ptrace捕获调用,将寄存器设置为正确的值,然后继续。

我现在的问题:如何调试此“调试器”?


如果我绕过ptrace,孩子将得到它的SIGTRAP并停止。
如果我离开ptrace,我将无法使用gdb
如果我绕过ptrace, ptrace并在set follow-fork-mode child上使用gdb,我无法跟踪TRAP在父进程中被捕获的方式和位置,因为gdb处理了它。如果我发送signal SIGTRAP,则父亲会检测到它(怎么办?这是我想了解的一件事)并终止。调试该程序吗?

#1 楼

您可以中断ptrace,绕开它,将其返回值设置为成功调用的状态,使用两个GDB实例:一个用于子级,一个用于父级。

#2 楼

该二进制文件受称为“宝石”的技术的保护。

父亲通过调试调用(在Linux下为ptrace,在Windows下为DebugActiveProcess)获取并设置其寄存器来驱动孩子。这是一种有效的反调试方法。

这是挑战的一部分,您可以在本文中找到很多详细信息:http://doar-e.github.io/blog/2014/10/11/taiming-a-野生的山nom石保护的mips二进制文件具有符号执行功能,没有这种破解/