路由器漏洞复现分析第三弹:DVRF INTRO题目分析
这个项目的目的是来帮助人们学习X86_64之外其他架构环境,同时还帮助人们探索路由器固件里面的奥秘。
本文通过练习DVRF 中INTRO 部分的题目来学习下MIPS 结构下的各种内存攻击。
DVRF:路由器漏洞练习靶机用binwalk解压DVRFbin后,题目位于如下目录中
调试环境配置参考本系列中的前面两篇文章:
第一个题目stack_bof_01
printf("Welcome to the first BoF exercise!\r\n\r\n");
strcpy(buf, argv[1]);
printf("You entered %s \r\n", buf);
printf("Try Again\r\n");
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 '\x50\x09\x40'`"
可以看到当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\r\n", heap_of);
free(heap_of);
int size = strlen(argv[1]);
heap_of2 = malloc(size);
printf("Heap Address 2 of %d bytes: %p \r\n", size, heap_of2);
printf("Copying contents of argv[1] to Heap Address 2\r\n\r\n");
这个项目的目的是来帮助人们学习X86_64之外其他架构环境,同时还帮助人们探索路由器固件里面的奥秘。
本文通过练习DVRF 中INTRO 部分的题目来学习下MIPS 结构下的各种内存攻击。
DVRF:路由器漏洞练习靶机用binwalk解压DVRFbin后,题目位于如下目录中
调试环境配置参考本系列中的前面两篇文章:
第一个题目stack_bof_01
printf("Welcome to the first BoF exercise!\r\n\r\n");
strcpy(buf, argv[1]); www.wnhack.com
printf("You entered %s \r\n", buf);
printf("Try Again\r\n");
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 '\x50\x09\x40'`"
可以看到当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\r\n", heap_of);
free(heap_of);
int size = strlen(argv[1]);
heap_of2 = malloc(size);
printf("Heap Address 2 of %d bytes: %p \r\n", size, heap_of2);
printf("Copying contents of argv[1] to Heap Address 2\r\n\r\n");
www.wnhack.com
copyright 无奈人生