路由器漏洞挖掘方法

MIPS32架构堆栈:

  1. 和x86 架构一样,都是由高地址向低地址增长,无EBP。
  2. 进入函数调用时,把栈指针(sp)向下移动n比特,这个大小为n比特的存储空间为此函数的stack Frame。
  3. 此后栈指针不移动,只有在函数返回时,加上这个偏移量恢复现场。
  4. 由于不能随便移动栈指针,所以寄存器压栈和出栈使用偏移
  5. A调用B,会在A 的栈顶预留一部分空间保存b的调用参数,称为参数空间。
  6. 参数传递,前4个参数通过a0-a4传递,超出的会放入参数空间。
  7. 返回地址:把返回地址直接存入$ra寄存器。
  8. 函数执行的命令的取指从$PC中取

    从某个地址到’jr $ra‘ 指令之间的二进制序列称为gadget

函数调用过程:

  

函数调用参数:

  

  说明:在调用函数b前,参数使用a0-a3外加参数空间的参数,当B调用并分配了栈空间,b会把a0-a3的值存储到A的参数空间

函数调用栈数据情况:

    说明:非叶子函数has_stack调用时,会把返回main 的地址放到自己的栈底部,如图:0x0040042c,

       数据从低到高覆盖,有可能覆盖返回main的地址,造成缓冲区溢出。 

危险函数:

  1,sprintf

    下面是 sprintf() 函数的声明。

    int sprintf(char *str, const char *format, ...)

    参数

  • str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  • format -- 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier,具体讲解如下:

#include <stdio.h>
#include <math.h>

int main()
{
   char str[80];

   sprintf(str, "Pi 的值 = %f", M_PI);
   puts(str);

   return(0);
}

输出:
Pi 的值 = 3.141593

sprintf使用

strchr使用

  char *strchr(const char *s, int c) 
  功能: 查找字符串s中首次出现c字符的位置

  说明: 返回首次出现c的位置的指针,返回的地址是被查找的字符串指针开始的第一个与c相同字符的指针,若s中不存在c则返回NULL。。。。

  返回值: 成功返回要查找的字符第一次出现的位置,否则返回NULL。。。。

strrchr使用

  char *strrchr(const char *s, int c)

  功能: 查找一个字符c在一个字符串s中最后一次出现的位置(也就是从s的右侧开始查找字符c首次出现的位置),并返回从字符串中的字符c所在的位置开始直到字符串s结束的所有字符。 若没有找到字符c,则返回NULL。

strstr函数使用

char *strstr(const char *haystack, const char *needle);
haystack        -->被查找的目标字符串"父串"
needle          -->要查找的字符串对象"子串"

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char *res = strstr("xxxhost: www.baidu.com", "host");
    if(res == NULL) printf("res1 is NULL!\n");
    else printf("%s\n", res);    // print:-->‘host: www.baidu.com‘
    res = strstr("xxxhost: www.baidu.com", "cookie");
    if(res == NULL) printf("res2 is NULL!\n");
    else printf("%s\n", res);    // print:-->‘res2 is NULL!‘
    return 0;
}

注:strstr函数中参数严格"区分大小写"

strstr 使用示例

strcasestr函数 

strcasestr函数的功能、使用方法与strstr基本一致。
strcasestr函数在"子串"与"父串"进行比较的时候,"不区分大小写"

#define _GNU_SOURCE             // 宏定义必须有,否则编译会有Warning警告信息
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char *res = strstr("xxxhost: www.baidu.com", "Host");
    if(res == NULL) printf("res1 is NULL!\n");
    else printf("%s\n", res);     // print:-->‘host: www.baidu.com‘
    return 0;
}

strcasestr 使用示例

memset使用

  将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,

  块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作

  用 法: void *memset(void *s, char ch, unsigned n);

#include <string.h>

  #include <stdio.h>

  #include <memory.h>

  int main(void)

  {

  char buffer[] = "Hello world/n";

  printf("Buffer before memset: %s/n", buffer);

  memset(buffer, ‘*‘, strlen(buffer) );// //数组直接首地址传进去。 主要是对数组指针的修改!!因为可以被修改而const char int等这些不能被修改 和malloc 配套使用

  printf("Buffer after memset: %s/n", buffer);

  return 0;

  }

  输出结果:

  Buffer before memset: Hello world

  Buffer after memset: ***********

memset 使用示例

memcpy

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字符到存储区 str1

#include <stdio.h>
#include <string.h>

int main ()
{
   const char src[50] = "http://www.w3cschool.cc";
   char dest[50];

   printf("Before memcpy dest = %s\n", dest);
   memcpy(dest, src, strlen(src)+1);
   printf("After memcpy dest = %s\n", dest);

   return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:

Before memcpy dest =
After memcpy dest = http://www.w3cschool.cc

memcpy 使用示例

fgets函数使用

原型  char *  fgets(char * s, int n,FILE *stream);

参数:

s: 字符型指针,指向存储读入数据的缓冲区的地址。

n: 从流中读入n-1个字符

stream : 指向读取的流。

返回值:

1. 当n<=0 时返回NULL,即空指针。

2. 当n=1 时,返回空串"".

3. 如果读入成功,则返回缓冲区的地址。

4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.

漏洞挖掘方法

代码审计:

  1. 使用IDA对目标进行反汇编
  2. 收索可能造成安全漏洞的危险函数
  3. 跟踪危险函数如何获取和处理用户提供的数据过程,判断是否存在安全漏洞

危险函数分类:

1,部分用户提供数据来源的相关函数

  • 命令行参数:argv操作
  • 环境变量:getenv()
  • 输入数据文件:read() fscanf()getc() fgetc() fgets() fscanf()
  • 键盘输入/stdin: read,  scanf   getchar   gets
  • 网络数据:read  recv  recvfrom

2,部分数据操作的相关危险函数

  • 字符串复制:strcpy(char *dest,char *src)       strncpy
  • 命令执行:system  execve
  • 字符串格式化:strcat
  • 格式化字符串:sprintf   snprintf

定位上诉危险函数,根据参数个数,类型跟踪个参数,分析缓冲区大小,判断是否存在漏洞

  • 对于1,采用正向数据流跟踪,从输入点开始跟踪
  • 对于2,采用逆向数据流跟踪,反向跟踪参数数据流向,找出缓冲区大小

自动化二进制文件审计工具

Bugscam:x86平台下,

R-bugscam: RISC指令审计工具,误报多,还需人工进一步分析

原文地址:https://www.cnblogs.com/CoBrAMG/p/9221199.html

时间: 2024-11-05 06:09:16

路由器漏洞挖掘方法的相关文章

漏洞挖掘方法之静态扫描+经典栈溢出实例

标 题: 漏洞挖掘方法之静态扫描+经典栈溢出实例 时 间: 2014-02-11,01:52:50 这是笔者公开发表的关于漏洞挖掘的第二篇文章,与发第一篇的时间差不多间隔了整整一年,在这一年里虽然工作细碎,但我还是抽出了大量的时间关注安全,因为当初的既定目标就是走安全的路.这一年了也做了不少关于安全方面的事情,比如参加各大*SRC的漏洞提交什么的,曾今有一段时间也是走火入魔了一样,但是后来我停下来了,因为我觉得那种事情偏离我最初对"漏洞"挖掘的定义,看了那些提交的所谓"漏洞&

D-Link系列路由器漏洞挖掘入门

D-Link系列路由器漏洞挖掘入门 前言 前几天去上海参加了geekpwn,看着大神们一个个破解成功各种硬件,我只能在下面喊 6666,特别羡慕那些大神们.所以回来就决定好好研究一下路由器,争取跟上大神们的步伐.看网上公开的D-Link系列的漏洞也不少,那就从D-Link路由器漏洞开始学习. 准备工作 既然要挖路由器漏洞,首先要搞到路由器的固件. D-Link路由器固件下载地址: ftp://ftp2.dlink.com/PRODUCTS/ 下载完固件发现是个压缩包,解压之后里面还是有一个bin

路由器漏洞挖掘之 DIR-815 栈溢出漏洞分析

这次笔者来复现一个比较经典的栈溢出漏洞:D-link dir-815 栈溢出.其实这个路由器的栈溢出漏洞的利用方式和之前 DVRF 靶机平台的栈溢出例子大同小异,只是需要注意下一些小的地方. 前言 这个栈溢出的原因是由于 cookie 的值过长导致的栈溢出.服务端取得客户端请求的 HTTP 头中 Cookie 字段中 uid 的值,格式化到栈上导致溢出. 漏洞分析 大体流程 首先还是先将 cgibin 加载到 IDA 中,定位到 sobj_get_string 函数. 在 sobj_get_st

路由器漏洞挖掘环境搭建

详细的路由器漏洞分析环境搭建教程 http://chuansong.me/n/864762852648 嵌入式Linux固件模拟与安全分析系统Firmadyne交流 http://chuansong.me/n/1009525252762 优秀博文: 路由器固件安全分析技术(一) https://www.vulbox.com/knowledge/detail/?id=35      一起学习从零基础从搭建环境开始入门路由器固件安全分析的技术 路由器固件安全分析技术(二) https://www.v

路由器漏洞挖掘使用的脚本

计算偏移多少的python脚本: # a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' # B = 'abcdefghijklmnopqrstuvwxyz' # c = '0123456789' from string import ascii_lowercase as ls from string import ascii_uppercase as UP import time import sys import os import binascii a = ''.join(l

路由器漏洞挖掘之 DIR-850/645 命令执行漏洞复现

前言 这次来分析两个比较经典的路由器命令执行漏洞,DIR-850 和 DIR-645 的 RCE,漏洞成因都是由于参数拼接不当造成的. 漏洞分析 根据前一篇文章中的任意文件读取漏洞,在读取到 DEVICE.ACCOUNT 配置文件中的敏感信息之后,我们就可以进一步利用,达到命令执行的目的,进而 getshell. php 源代码 代码如下: 这里的 server 变量可控,导致在拼接时,我们可以闭合前面的命令参数,执行任意命令. 通过前一步的任意文件读取得到 admin 的密码之后,登录上去抓包

【读书笔记】Android平台的漏洞挖掘和分析

最近比较关注移动端的安全,以后也打算向安卓平台的安全发展.这篇博文主要是记录一些研究Android安全的读书笔记. Fuzzing技术的核心是样本生成技术 测试Android平台的组件间通信功能使用的方法是,首先通过逆向分析或是动态监控获得Intent的数据格式,再去根据格式生成样本.生成样本后发送给待测试组件. 至今为止,Fuzzing依然是最有效的.最多产的漏洞挖掘方法.其他的那些高大上的方法反倒不如Fuzzing. 目前为止,在Android平台上的Fuzzing工具仅有Peach作为一个

揭秘家用路由器0day漏洞挖掘技术——互动出版网

这篇是计算机类的优质预售推荐>>>><揭秘家用路由器0day漏洞挖掘技术> 全球第一本关于家用路由器底层安全分析的书籍! 编辑推荐 全球第一本硬件安全分析书籍,填补了硬件安全领域的空白:带领大家进入HT团队都还未涉及的领域!作者十年磨一剑之心血力作! <揭秘家用路由器0day漏洞挖掘技术>针对当下网络安全设备问题层出不穷.而系统化的安全分析资料越来越难寻的现状,从家用路由器入手,全方位的讲解了路由器漏洞分析.漏洞挖掘.路由器固件提取.硬件调试等方面的相关知识

锐捷路由器漏洞分析

0x00 前言 今早看到关于锐捷路由器漏洞CNVD-2018-06947 被披露POC,对于POC进行复现后,继续挖掘路由器漏洞. 0x01 复现 通过测试发现POC只能执行VERSION,也就是查看版本.复现的截图如下: 这个命令执行只能查看版本的感觉不太过瘾,只好尝试去挖掘漏洞. 0x02 漏洞挖掘 在NBR1300G-E存在COOKIE会话固定漏洞,利用这个漏洞结合命令执行接口,就是newcli.php 这个文件.最后导致命令执行. 经过测试发现,只能直接与路由器命令执行交互,能够执行路由