(gdb) x/16x : 使用x命令(examine的簡寫)來查看內存地址中的值。
* x命令的語法:x/
* n表示單元個數,f表示顯示的進制,u表示每一個單元的大小。
system :是一個函數,用於運行其它外部程序
git
先將環境設置爲:堆棧可執行、地址隨機化關閉
shell
以 anything+retaddr+nops+shellcode 的結構來構造,先估計返回地址所在位置,而且找到 shellcode 所在地址
sass
要驗證返回地址所在位置以及找到 shellcode 地址,須要使用GDB調試
* 先運行 20145325pwn1 可執行文件
bash
(先不輸入「回車」,在後面的調試過程當中須要繼續運行的時候再回車,到時候就會顯示如圖的字符部分)服務器
* 再找到正在執行的 20145325pwn1 的進程號
* 進入GDB,聯繫上該進程號
* 在 ret 處設置斷點,接着運行到斷點處,顯示當前esp的值並依照此位置顯示接下來的內存地址內容,並由此分析出返回地址位置的正確性以及shellcode的地址
(紅色方框爲返回地址處,紅色橢圓爲 shellcode 代碼,由此推算出 shellcode 地址爲 「\x31\xd3\xff\xff」)網絡
* 繼續運行,再次檢測是否跳到覆蓋的返回地址所表示的地方
(如紅框所示,已經能夠確認返回地址是被 \x10\x20\x30\x40 所覆蓋的)ide
將做爲輸入的 input_shellcode 處的 「\x10\x20\x30\x40」 換爲上面所找到的 shellcode 地址 「\x31\xd3\xff\xff」
函數
執行 20145325pwn1 ,成功注入 shellcode
學習
進入linux32的環境,將地址隨機化關閉,同時使用ln
命令,讓 /bin/sh 指向另外一個shell程序(這裏是zsh)(由於原 /bin/bash 有保護措施,即便能調用一個shell,也不能在這個shell中保持root權限)
編寫retlib文件並進行編譯(注意要使堆棧處於不可執行狀態),同時將其設爲 Set-UID 程序
編寫攻擊代碼
使用編譯好的 讀取環境變量 程序,獲得/bin/sh的地址
編譯攻擊程序,並經過調試該程序獲得 system 與 exit 的地址
再將攻擊程序中的buf換爲剛剛得到的3個地址
從新編譯攻擊程序
先運行攻擊程序,再運行SET-UID程序,觀察是否成功得到root權限
成功
居然成功了
又成功了?