shellcode的生成方法指導書上已經寫得很詳細了,在作實驗時我直接用的是老師上課用的shellcode:
linux
將環境設置爲:堆棧可執行、地址隨機化關閉
shell
選擇anything+retaddr+nops+shellcode
的結構構造攻擊buf,先猜想返回地址所在位置,而且找到shellcode
所在地址
服務器
在終端注入這段攻擊buf:
函數
先不輸入「回車」,在後面的調試過程當中須要繼續運行的時候再回車,此時再打開另一個終端,用gdb來調試20145215pwn1
這個進程,先找到該進程的進程ID,再打開gdb,用attach
指令對該進程進行調試:
ui
對foo
函數進行反彙編:
3d
在ret
處設置斷點,接着繼續運行到斷點處,顯示當前esp的值並依照此位置顯示接下來的內存地址內容,來分析咱們以前猜想的返回地址位置是否正確以及shellcode
的地址,然而我一開始一直沒有找到,如同見鬼,再修改無數次後在勉強找到調試
shellcode
代碼,由此咱們能夠推斷出shellcode
地址爲:0xffffd3d4
繼續運行,如紅色方塊中所示,能夠確認返回地址是被咱們以前輸入的\x01\x02\x03\x04
所覆蓋的:
code
將返回地址修改成0xffffd3d4
,從新注入,蒼天啊,終於成功了
blog
進入32位linux環境,將地址隨機化關閉,而且把/bin/sh
指向zsh
:
進程
將漏洞程序保存在/tmp
目錄下:
編譯該代碼,使用–fno-stack-protector
來關閉阻止緩衝區溢出的棧保護機制,並設置給該程序的全部者以suid權限,能夠像root用戶同樣操做:
讀取環境變量的程序:
/tmp
目錄下: getenvaddr
程序得到BIN_SH
地址,利用gdb得到system
和exit
地址:
將上述所找到的三個內存地址填寫在20145211exploit.c
中:
刪除剛纔調試編譯的20145211exploit
程序和badfile
文件,從新編譯修改後的20145215exploit.c,gcc -m32 -o 20145211exploit 20145211exploit.c
先運行攻擊程序20145211exploit
,再運行漏洞程序20145211retlib
,攻擊成功,得到了root權限,ls一波: