前言
關於rop
rop的全稱為return-oriented programming(返回導向程式設計),這是一種高階的記憶體攻擊技術可以用來繞過現代作業系統的各種通用防禦(比如記憶體不可執行和**簽名等)
rop是一種攻擊技術,其中攻擊者使用堆疊的控制來在現有程式**中的子程式中的返回指令之前,立即間接地執行精心挑選的指令或機器指令組。
本系列rop實戰題目的背景
來自ropemporium
旨在通過解決一系列挑戰來一步步高階學習rop利用技術。
操作
這一關是split
先使用file命令看一下
可以看到nx enabled,即開啟了nx,也就是棧不可執行
先載入r2分析
看到了三個可能是比較重要的函式
main:開始分析的地方
pwnme,usefulfunction:提示的這麼明顯了
先反彙編main
所以我們順著分析pwnme
同樣反彙編
從上圖可以看到有乙個32位元組的緩衝區,可以通過fgets接收96位元組的輸入從而溢位,也是和上一題ret2win一樣溢位rip嗎?
我們先使用gdb分析
然後往input中寫入隨機的100位元組的序列
將input作為輸入執行
然後pattern_search
我們回到r2反彙編usefulfunction
我們可以看到它呼叫將執行/ bin / ls的system()函式。
這個函式的位址是0x00400807,所以我們需要40個位元組的隨機資料和這個位址。
簡單的使用python生成exp寫入input
然後在gdb中測試
可以看到成功執行了/bin/ls
不過我們的目標是列印flag,而不是ls,所以繼續研究下去
回到r2中使用izz列出字串
這個字串的位址是0x0001060
現在我們嘗試溢位棧,直接執行到system()
不過我們要找到乙個辦法,直接將這個位址傳入rdi暫存器(x86-64傳參時依次通過rdi,rsi,,,傳參,rdi是第乙個)
這時候我們就需要rop gadget了,簡單地說,它們就是寫以ret指令結尾的指令序列
找到了很多gadget,那麼哪個符合要求呢
我們前面提到必須將值傳入rdi,所以要找到pop rdi
所以符合要求的是位址是0x400883
我們傳遞這個gadget位址(0x400883)後,它會把棧中下乙個值傳到rdi暫存器中,所以下乙個位址應該是能夠列印flag的字串的位址(0x601060),最後是system()函式的位址(0x400810)
使用python簡單地將exp輸出到input
在gdb中測試,可以看到成功列印出flag
from pwn import *
io = process("./split")
elf = elf("./split")
system_addr = elf.symbols['system']
pop_rdi_ret = 0x0000000000400883
cat_flag_addr = 0x601060
io.recvuntil(">")
payload = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbb"
payload += p64(pop_rdi_ret)+p64(cat_flag_addr)+p64(system_addr)
io.sendline(payload)
io.interactive()
執行如圖
注
ROPEmporium通關全解(四)
前言 1.關於rop rop的全稱為return oriented programming 返回導向程式設計 這是一種高階的記憶體攻擊技術可以用來繞過現代作業系統的各種通用防禦 比如記憶體不可執行和 簽名等 rop是一種攻擊技術,其中攻擊者使用堆疊的控制來在現有程式 中的子程式中的返回指令之前,立即...
PD3 0詳解 電源規則,全解!!!全解!!!
大師匈今天談一下pd3.0的電源規則,pd3.0標準標定的規則。usb協會聲稱,為了世界和平世界環境,讓大家用上統一標準的充電器,不用再為每乙個用電裝置都配乙個專門的充電器,這些充電器各種各樣的都有,所以有時候大師匈也很煩!那麼為了維護世界和平,usb協議呢就制訂了這個pd快充協議,還有它的規則,只...
Berkeley DB使用全解
在開發桌面級應用程式時,常常需要用到可持續儲存技術,做為儲存程式在退出之前所使用的資料,如變數,物件,視窗位置,大小.一般我們會使用office access這類桌面型檔案資料庫,或者是使用登錄檔.但是它們都有一些不盡人意的缺陷.比如 1.mdb檔案無法在沒有安裝office的系統上訪問,直少得需要...