安全黑客
当前位置:安全黑客文章资讯安全资讯安全新闻
日期:2019-01-20 23:25:00  来源:本站整理

路由器漏洞挖掘之栈溢出入门(一)[安全新闻]

赞助商链接



  本文“路由器漏洞挖掘之栈溢出入门(一)[安全新闻]”是由安全黑客为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

MIPS 指令集主要使用在一些嵌入式的 IOT 设备中,比如路由器,摄像头。要对这些设备进行二进制的漏洞挖掘就需要有对 MIPS 有一定的熟悉。MIPS 指令集的栈溢出与 x86 指令集的有所不同,所以漏洞的利用方式也不太相同,但是溢出的思路是一样的:覆盖返回地址、劫持程序控制流、构造 ROP chain 、写 shellcode 等等。本文介绍一下最基本的 MIPS 指令集下的栈溢出的利用方法。
 
x86 和 MIPS 指令集的差异
1.MIPS 指令系统大量使用寄存器,包括返回地址也是存放在 ra 寄存器中2.没有堆栈直接操作的指令,也就是没有 push 和 pop 指令3.所有指令都是 32 位编码,也就是说所有的数据和指令都是 4 字节对齐。
由于 MIPS 固定指令长度,所以造成其编译后的二进制文件和内存占用空间比 x86 的要大MIPS 指令集使用 uclibc C 标准库,x86 使用 libc 的 C 标准库
基本的指令用法和两者的差异可以参考这里:https://blog.csdn.net/gujing001/article/details/8476685
 
MIPS 的动态调试
在 qemu 上开启一个调试端口(-g 指定端口号),在 IDA 上使用 Remote GDB debugger,填上端口号和主机名即可
./qemu-mipsel -g 23946 xxxx

具体的步骤可以看这里https://www.jianshu.com/p/9841b412af37
也可以使用 gdb 进行调试,但是 gdb 需要使用专门支持 mips 指令集的 gdb 版本
 
叶子函数和非叶子函数
叶子函数和非叶子函数是两个非常重要的概念,两者的一些特性照成了对栈溢出利用方式的差异。
在某个函数中,如果这个函数不调用其他函数,那么就这个称为叶子函数。反则这个函数就是非叶子函数
举个例子
main 函数为叶子函数,函数中没有调用其他函数
int main(){
    int i;
    int sum = 0;
    for(i=0;i5;i++){
        sum = sum +i;
    }
}
main 函数为非叶子函数,函数调用了其他函数(printf)
int main(){
    int i;
    int sum = 0;
    for(i=0;i5;i++){
        sum = sum +i;
        printf("sum = %d",sum);
    }
}
叶子函数的返回地址是直接放在 ra 寄存器中,而非叶子函数需要调用另外的函数,这里的差异就照成了非叶子函数需要把当前的返回地址暂时存放在栈上
1.非叶子函数,有 sw $ra,xxx 的操作,在函数退出时,会将存放在栈上的原来存放 ra 寄存器的值重新赋值到 ra 寄存器中

2.叶子函数,没有 sw $ra,xxx 的操作



 
简单的栈溢出
用一个代码has_stack 函数存在栈溢出,该函数是非叶子函数,可以溢出到存放返回地址栈空间,劫持程序流
这里可以直接溢出到调用 vuln 函数,也就是最基本的 rop :ret2text(返回到程序已有的代码空间中,这里返回到 vuln 函数的空间中)
#include
void vuln(){
        system("/bin/sh");
}
void has_stack(char *src){
        char dst[20] = {0};
        strcpy(dst,src);
        printf("copy success!n");
}
void main(int argc,char *argv[]){
        has_stack(argv[1]);
}
动态分析
在 has_stack 函数调用 strcpy 时,下断点

开启服务器的远程调试:
nick@nick-machine:~/iot/program$ ./qemu-mipsel -g 23946 StackOverflow2 aaaaaaaaaaaaaaaaaa
在 IDA 连接上 gdb调试后,F9 运行到断点处,单步两次。这里 strcpy 函数的两个参数 a0、a1,函数的作用是将 a1 地址处的数据复制到 a0 地址处

没有对 a1 的地址的数据长度做限制,所以存在栈溢出。
F8 单步步过以后,看到输入的数据已经存放到栈上了,也可以很清楚的看到返回地址的位置。

[1] [2] [3]  下一页


  以上是“路由器漏洞挖掘之栈溢出入门(一)[安全新闻]”的内容,如果你对以上该文章内容感兴趣,你可以看看安全黑客为您推荐以下文章:
  • 路由器漏洞挖掘之栈溢出入门(一)
  • 路由器漏洞频发,mirai新变种来袭
  • 路由器漏洞频发,Mirai 新变种来袭
  • 路由器漏洞:黑客展示若何攻陷百万台
  • 路由器漏洞:黑客展示若何攻陷百万台
  • 本文地址: 与您的QQ/BBS好友分享!

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    免责条款 - 广告合作 - 下载声明 - 欢迎投稿 - 友情连接 - 网站地图 -
    Copyright © 2012-2013 www.110hack.com. All Rights Reserved .