1. 程式人生 > >【pwnable.tw】 seethefile

【pwnable.tw】 seethefile

get 文件中 fclose 打印 .cn 建議 空間 變量 可控

一開始特別懵的一道題。

main函數中一共4個功能,openfile、readfile、writefile、closefile。

技術分享

其中,在最後退出時有一個明顯的溢出,是scanf("%s",&name);

name位於bss段上,name下面有一個fp用於存儲文件指針,可以被覆蓋。

技術分享

再看其他函數:

openfile.只有一個簡單的輸入並打開,保存文件指針在bss段上的fp變量中:

技術分享

readfile,從fp所指的文件中每次讀取0x18F字節字節到magicbuf中,這個變量也在bss段上。

writefile無法讀取含有flag、FLAG、}的字符串,是一個打印函數

技術分享

由於無法覆蓋棧上內容,僅能覆蓋bss段上空間,因此想法是覆蓋fp指針,通過偽造fp指針進一步利用,這種利用方法在如下文章中已經給出:

http://www.evil0x.com/posts/13764.html

另外一個重要的點在於libc的泄露。

由於linux獨特的文件形式存儲,文件的內存信息存儲與/proc/pid/maps中,這裏pid使用self來代替,如下圖:

技術分享

因此libc可以通過該方式泄露。

偽造file指針的過程,可以通過上面的鏈接中大致了解,最終的步驟是構造file對象的內容,由於最終要執行fclose(fp),這一函數,而fclose中用戶可控的函數指針執行位置在fclose如下位置,

技術分享

因此必須要使fclose執行到該位置,其決定性作用的是前2個字節,可以通過動態調試來獲得,將fclose(fp),轉化為system(fp),而fp的前兩個字節有太重要的作用,建議不要動。

可以用‘||/bin/sh‘的方法執行獲得shell。

至於前兩個字節的調試,需要通過動態調試fclose的方法一步一步來找。

捷徑的方法是用鏈接中給到用stderr內容來最初構建。

另外,題目中的輸入方法是可以輸入\x00的,算是個福利吧。

這題是目前做過調試最惡心的一道題沒有之一。

【pwnable.tw】 seethefile