0x0 開始
做題需要用到ROPgadget,去安裝下載下傳,然後麻煩越來越多,将成功過程記錄下來。
它就是用來查找你的二進制檔案中你想要的一些指令,友善你加以利用。
有了ROPgadget 你會發現one_gadget也是必須的。
one_gadget的安裝與使用
0x0.1介 紹
使用此工具,您可以在二進制檔案中搜尋Gadgets,以友善您對ROP的利用。
随着 NX 保護的開啟,以往直接向棧或者堆上直接注入代碼的方式難以繼續發揮效果。攻擊者們也提出來相應的方法來繞過保護,目前主要的是 ROP(Return Oriented Programming),其主要思想是在棧緩沖區溢出的基礎上,利用程式中已有的小片段 (gadgets) 來改變某些寄存器或者變量的值,進而控制程式的執行流程。所謂 gadgets 就是以 ret 結尾的指令序列,通過這些指令序列,我們可以修改某些位址的内容,友善控制程式的執行流程。
我們知道x86都是靠棧來傳遞參數的而x64換了它順序是rdi, rsi, rdx, rcx, r8, r9,(這裡6個寄存器可以被了解為Gadgets)如果多于6個參數才會用棧我們要先知道這個特性.
有的題,裡面既沒有現成的system也沒有/bin/sh字元串,也沒有提供libc.so給我們,那麼我們要做的就是想辦法洩露libc位址,拿到system函數和/bin/sh字元串;
我們就需要擷取rdi, rsi, rdx, rcx, r8, r9它們的位址,首先要擷取的是rdi的位址;
這就是 ROPgadget 的作用;
0x1 安裝
安裝指令
sudo apt-get install python-capstone
git clone https://github.com/JonathanSalwan/ROPgadget.git
cd ROPgadget
sudo python setup.py install
0x2 出錯處理
出錯。。。
解決方案
先進目錄
然後注意剛剛最後報錯那一段,at後面引号裡面那一段,他說缺那個目錄。
然後輸入
sudo cp -r scripts /home/wuangwuang/.local/lib/python2.7/site-packages/ROPGadget-6.3.dist-info
不要直接複制,使用者、python版本啥的都不一樣,那個 sudo cp -r scripts 然後再把剛說的引号裡面的複制下去,搞定。
0x3 使用
64位彙編傳參,當參數少于7個時, 參數從左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 > 當參數為7個以上時,
前 6 個與前面一樣, 但後面的依次從 “右向左” 放入棧中,即和32位彙編一樣。
一.
指令: ROPgadget --binary 檔案名 --only "pop|ret" | grep rdi
指令: ROPgadget --binary 檔案名 --only "pop|ret" | grep rsi
指令: ROPgadget --binary 檔案名 --only "pop|ret"
指令: ROPgadget --binary 檔案名 --only 'int' 查找有int 0x80的位址
二.
該工具除了可以用來查找 ret/rdi的位址,還可以用來查找一些字元串的位址
指令: ROPgadget --binary 檔案名 --sting '/bin/sh'
指令: ROPgadget --binary 檔案名 --sting '/sh'
指令: ROPgadget --binary 檔案名 --sting 'sh'
指令: ROPgadget --binary 檔案名 --sting 'cat flag'
指令: ROPgadget --binary 檔案名 --sting 'cat flag.txt'