微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

绕过ptrace反调试技巧

如何解决绕过ptrace反调试技巧

在调试 32 位 Linux 可执行文件时,我在绕过对 ptrace 的调用时遇到了一些问题。
我有这个二进制文件ELF 32-bit LSB executable,Intel 80386,version 1 (SYSV),dynamically linked,interpreter /lib/ld-linux.so.2,for GNU/Linux 2.6.26,BuildID[sha1]=b1579d4c55e90110491da76331c9a158b77a5729,stripped

我一直在尝试调试它。所以由于它是一个剥离的二进制文件,我使用 gdb 找到了入口点。

gef➤  info file
Entry point: 0x804849c
.
.
.
other stuff

到达入口点后,我打印出以下说明:

   gef➤  x/15i 0x804849c
   0x804849c:   xor    ebp,ebp
   0x804849e:   pop    esi
   0x804849f:   mov    ecx,esp
   0x80484a1:   and    esp,0xfffffff0
   0x80484a4:   push   eax
   0x80484a5:   push   esp
   0x80484a6:   push   edx
   0x80484a7:   push   0x8048580
   0x80484ac:   push   0x8048590
   0x80484b1:   push   ecx
   0x80484b2:   push   esi
   0x80484b3:   push   0x8048480
   0x80484b8:   call   0x8048350 <__libc_start_main@plt>
   0x80484bd:   hlt    
   0x80484be:   nop

我知道 0x8048480 是主函数的地址。现在我在 main (0x8048480) 上放置了一个断点,然后运行程序,但我无法进入断点,程序退出显示代码 01。因此我决定运行 strace ./binary 命令,并且 ptrace 调用禁止我进行调试进一步:

ptrace(PTRACE_TRACEME) = -1 EPERM (Operation not permitted)

为了绕过这个,我尝试使用 LD_PRELOAD 环境变量。
因此我创建了一个简单的 .c 文件

long ptrace(int request,int pid,void *addr,void *data) {
    return 0;
}  

并使用以下命令将其编译为共享库:

gcc -fPIC -shared -m32 ptrace.c -o ptrace.so

这里是命令文件ptrace.so输出

ELF 32-bit LSB shared object,BuildID[sha1]=a9de523da44299f76ad94373a07c9c5f6f3c76db,not stripped

接下来我首先使用 export LD_PRELOAD=./ptrace.so 命令在 shell 中设置环境变量 LD_PRELOAD,然后在 gdb set environment LD_PRELOAD=./ptrace.so 中设置

但这是输出

 ERROR: ld.so: object './ptrace.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.

如何绕过 ptrace 调用

谢谢。

解决方法

为了绕过这个,我尝试使用 LD_PRELOAD 环境变量。

如果应用程序使用反调试技巧,它极有可能直接执行 ptrace 系统调用,而不是通过 libc 包装器。在这种情况下,LD_PRELOAD 将不起作用。

这个命令:

gcc -shared ptrace.c -o ptrace.so

在 64 位系统上构建 64 位二进制文​​件。你想要:

gcc -fPIC -shared -m32 ptrace.c -o ptrace.so

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。