前言,基本也是《0day路由器漏洞挖掘》这本书的读书笔记
路由器web漏洞
XSS漏洞
针对路由器的web管理页面,例如:攻击者发现路由器管理页面包含一个反射型XSS,就可以构建一个利用这个XSS漏洞的URL,并且将其通过邮件或QQ发送给受害者,引诱受害者点击这个URL,从而访问路由器网页。受害者点击URL,恶意代码就会在浏览器中执行,它可以将路由器网页会话Cookie发送给攻击者攻击者在受害者不知情的情况下通过Cookie盗取更敏感的消息。
路由器后门漏洞
为了调试方便、信息获取方便或者是人为故意等情况留下的后门,该后门可以令几乎所有的保护措施全部失效。
路由器溢出漏洞
MIPS32架构堆栈
栈操作:MIPS32没有EBP,进入一个函数时需要将当前栈指针向下移动n个比特,这个大小为n比特的存储空间就是Stack Frame的存储区域,寄存器压栈和出栈都必须指定偏移量。
函数调用栈布局
叶子函数和非叶子函数,一个函数不在调用其它任何函数,那么当前的函数就是一个叶子函数,否则就是非叶子函数。
函数调用过程
函数调用参数传递
例:
main函数会将more_arg()函数的前四个参数传到a0~a3中,第五个参数保留在main函数栈顶预留的空间。但是看到main函数还是为前四个参数预留了空间:
缓冲区溢出利用的可行性
非叶子函数
has_stack函数调用了strcpy函数,因此,has_stack是非叶子函数,返回main()函数的地址会首先保存到寄存器$ra中,进入has_stack()函数以后,has_stack会把返回main()函数的返回地址保存在has_stack的堆栈中,在has_stack()函数返回main()函数继续执行时,将保存在堆栈中的返回main()函数的返回地址写入$ra并返回main()函数继续执行。
#include<stdio.h>
void has_stack(char *src){
char dst[20] = {0};
strcpy(dst,src);
}
void main(int argc,char *argv[]){
has_stack(argv[1]);
}
汇编代码:
叶子函数
源码
#include<stdio.h>
void no_stack(char *src,int count){
char dst[20] = {0};
int i=0;
for(i=0;i<count;i++){
dst[i] = src[i];
}
}
void main(int argc,char *argv[]){
int count = strlen(argv[1]);
no_stack(argv[1],count);
}
综上所述:非页函数可以通过溢出覆盖掉上层函数的返回地址,叶函数无法直接覆盖上层函数的返回地址,但可以覆盖掉上层函数的栈帧,从而覆盖掉上层函数的上层函数的返回地址。