CTF linux 二进制文件中的 Fork 和 Waitpid 调用
逆向工程
linux
反调试
2021-07-10 21:34:27
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. :)
