路由器漏洞復現分析第三彈: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 原創獎勵計劃,未經許可禁止轉載。
TAG:黑客與極客 |