shell 獲取小結¶
overview¶
我們獲取到的 shell 一般有兩種形式
- 直接可交互的 shell
- 將 shell 綁定到指定 ip 的指定端口
下面總結幾種常見的獲取 shell 的方式。
shellcode¶
在利用 shellcode 獲取 shell 時,基本要求就是我們能夠將 shellcode 佈置在可寫可執行的內存區域中。因此,在沒有可寫可執行的內存區域的時候,我們需要利用mprotect
等函數設置相關內存的權限。
此外,有時候可能 shellcode 中的字符必須滿足某些要求,比如可打印字符,字母,數字等等。
system¶
我們這裏一般是執行 system("/bin/sh"),system('sh') 等函數。
這裏我們主要需要找到一些地址,可以參考獲取地址的小節。
- system 的地址
- "/bin/sh", “sh” 地址
- binary 裏面是否字符串
- 考慮個人讀取對應字符串
- libc 中其實是有 /bin/sh 的
在 system 獲取 shell 時,一個非常好的優點在於我們只需要佈置一個參數就可以了,缺點就是我們在佈置參數時,可能因爲破壞了環境變量而無法執行。
execve¶
執行 execve("/bin/sh",NULL,NULL)。
在利用 execve
獲取 shell 時,前幾條同 system 一致。但它具有一個優點就是幾乎不受環境變量的影響。但是缺點在於我們需要佈置三個參數。
此外,glibc 中我們還可以使用 one_gadget 來獲取 shell。
syscall¶
系統調用號 __NR_execve
在 IA-32 中爲 11,x86-64 爲 59。
它的優點在於幾乎不受環境變量的影響。然而我們需要找到 syscall
之類的系統調用命令。