CTF linux 二进制文件中的 Fork 和 Waitpid 调用

逆向工程 linux 反调试
2021-07-10 21:34:27

我正在做我的第一个 linux 破解程序之一。

在第一个代码块中,它进入一些反调试例程,并在它派生的其中一个程序中,在它调用waitpid例程之后。我可以验证它并纯粹理解代码,但我无法理解创建者为什么要放置此代码以及它如何成为一种反调试技术。这些是有趣的块。

Fork 和 Waitpid 调用

1个回答

基本上,进程调用fork,在子端它会尝试将调试器附加到父进程:

ptrace(PTRACE_ATTACH, getppid(), 0, 0);

如果此系统调用失败,则可能意味着调试器已附加到父进程,这就是您的反调试器。为了通知父进程,开发人员依赖于退出代码。如果附加了调试器,则为 1,否则为 0。

在父端,它使用宏检索退出代码WEXITSTATUS在 C 中,这被定义为:

#define WEXITSTATUS(x)  (_W_INT(x) >> 8)

这在装配中给出:

sar     eax, 8
movzx   eax, al
test    eax, eax
jz      short no_debugger

这是执行PTRACE_TRACEME. :)