路由器组成

  • CPU
  • RAM :
  • Flash ROM :
  • UART (通用异步收发传输器 Universal Asynchronous Receiver/Transmitter) 串口 / JTAG 调试口 : 用于调试接口

路由器组件识别

UART

最常见的为UART串口,可以通过UART串口来直接与机器交互,通过串口输出、输入信息,做动态调试

GND:接地,地线

TX:发送

RX:接收

VCC:接电源,使用杜邦线引出

转USB连接电脑调试

Flash Rom

用来存储文件系统、内核、U-boot(bootloader),路由器配置信息

识别和区分

  1. 芯片上有厂商的首字母缩写,在编程器软件(提取Flash Rom信息的软件)其中找到厂商对应的型号即可
  2. 没有芯片的标识信息,只有一些丝印数字(不规则),可以在TB中尝试寻找信息

固件的获取

固件(Firmware)一般存储于设备中的电可擦除只读存储器EEPROM(Electrically Erasable Programmable Rom)或Flash芯片中,一般可由用户通过特定的刷新程序进行升级的程序。

一般来说,担任着一个数码产品最基础、最底层工作的软件才可以称之为固件,比如计算机主板上的基本输入、输出系统BIOS(Basic Input/Output System),在以前其实更多的专业认识叫它固件。

# 固件提取方法
binwalk -Me 固件名

- 官网技术支持处下载固件升级包

- 本地OTA升级抓包

- 从路由器Flash Rom中获取 (编程器软件)

九种获取固件的方法

Busybox

busybox是一个集成了三百多个最常用Linux命令和工具的软件

最常用在Linux内核的嵌入式设备上,如路由器、摄像头

MIPS/ARM指令集

用于嵌入式设备、小型设备

MIPS固定4字节指令长度

流水线效应

MIPS采用了高度的流水线,其中一个最重要的效应就是分支延迟效应。在分支跳转语句后面的那条语句叫做分支延迟槽。实际上,在程序执行到分支语句时,当它刚把要跳转到的地址填充好(填充到代码计数器里),还没有完成本条指令时,分支语句后面的那个指令就已经执行了,其原因就是流水线效应 ---- 几条指令同时执行,只是处于不同的阶段

流水线效应:

  mov $a0, $s2

  jalr strrchr

  move $a0, $s0
  
  //在执行第2行跳转分支时,第3行的move指令已经执行完了。因此,在上面指令序列中,strrchr函数的参数来自第3行的$s0,而不是第1行的$s2。

MIPS汇编指令集基本语法介绍

add $a0, 1             ;$a0 = $a0 + 1
la $a0, 0x1000          ;(Load Address)读入一个地址到寄存器$a0中
lw $a0, 0x1000          ;(Load Word),"$a0=MEM[0x1000]",读入0x1000内存地址的word值到$a0寄存器中
sw $a0, 4($sp)          ;(Store Word), "$a0=MEM[$sp+4]", 将寄存器中的值存入$sp(栈顶寄存器)寄存器中的地址偏移4个字节的地址处
jalr $t9             ;(Jump and Link 跳转并链接)跳转到$t9寄存器指向的地址处,并将返回地址存储到$ra(Return Address)中
b 0x2000             ; 无条件跳转到0x2000地址处

更多参考:

https://www.cnblogs.com/blacksunny/p/7192416.html

http://www.mamicode.com/info-detail-1908827.html

常见专业名词:

  • CGI文件

Rech

程序架构信息,判断是64位还是32位,EXP编写时是p64还是p32

RELRO

Relocation Read-Onl(RELRO)此项技术主要针对GOT改写的攻击方式,它分成两种,Partial RELRO和FULL RELRO
Partial (部分)RELRO容易受到攻击,例如攻击者可以atoi.got为system.plt进而输入/bin/shx00获得shell,完全RELRO使整个GOT只读,从而无法被覆盖,但这样会大大增加程序的启动时间,因为程序在启动之前需要解析所有的符号。

Stack-canary

栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞是,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行,当启用栈保护后,函数开始执行的时候先会往栈里插入类似cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行,攻击者在覆盖返回地址的时候往往会将cookie信息给覆盖掉,导致栈保护检车失败而阻止shellcode的执行,在linux中我们将cookie信息称为canary。

NX/DEP

NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,如此一来,当攻击者在堆栈上部署自己的shellcode并触发时,只会直接造成程序的崩溃,但是可以利用rop这种方法绕过

PIE

PTE(Position-Independent Executable,位置无关可执行文件)技术与ASLR(Address Space Layout Randomization)技术类似,ASLR将程序运行时的堆栈以及共享库的加载地址随机化,而PIE及时则在编译时将程序编译为位置无关,即程序运行时各个段(如代码但等)加载的虚拟地址也是在装载时才确定,这就意味着。在PIE和ASLR同时开启的情况下,攻击者将对程序的内存布局一无所知,传统改写GOT表项也难以进行,因为攻击者不能获得程序的.got段的虚地址。若开始一般需在攻击时歇够地址信息

RPATH/RUNPATH

程序运行是的环境变量,运行时所需要的共享库文件优先从该目录寻找,可以fake lib造成攻击,实例:攻击案例

FORTIFY

这是一个由GCC实现的源码级别的保护机制,其功能是在编译的时候检查源码以避免潜在的缓冲区溢出等错误
简单地说,加了和这个保护之后,一些敏感函数如read,fgets,memcpy,printf等等可能导致漏洞出现的函数会替换成__read_chk,__fgets_chk等。
这些带了chk的函数 会检查读取/复制的字节长度是否超过缓冲区长度,通过检查诸如%n之类的字符串卫视是否位于可能被用户修改的可写地址,避免了格式化字符串跳过某些函数如直接(%7$x)等方式来避免漏洞出现,开启FORTIFT保护的程序会被checksec检出,此外,在反编译是直接查看got表也会发现chk函数的存在,这种检查是默认不开启的。

参考:

标签: 家用路由器

添加新评论