Archive for the ‘逆向工程’ Category.

固件的逆向解包及破解方法

前言

路由器的固件通常存储在FLASH中,对其固件的分析可以获取其中的各种信息,比如得到root用户的登陆权限,查看系统的日志,系统分区及系统的各类配置文件等。

对此固件的分析意义重大,这里主要说明一下通常对固件分析的技术上的方式和使用技巧。
固件分析所需要的环境:

1、常见路由器的SPI FLASH编程器;

2、最好是用Winows 笔记本来登陆到ubuntu系统的台式机上的方式 ;

3、Windows 下的Putty、winhex、WinSCP软件工具;

4、TTL线、网线、万用表及烙铁,热风枪等工具和线材;

分析步骤:

1、拆开对应的路由器设备的外壳;

2、查看路由器内部的的接口标识;

3、用万用表找到对应的地线GND标号;

4、通常为了调试或升级的方便,都会保留TTL引脚;

查看是否存在有TTL线的引脚或触点;

5、用准备好的TTL线连接路由器的TTL引脚或触点;

6、windows下用putty中的串口项打开对应的TTL线连接的串口;

7、查看是否有路由器启动的日志信息,如果有,请仔细分析;

8、等路由信息启动完毕后,看看是否有终端跳出来,是否有登陆窗口跳出;

9、如果有登陆窗口,但是无法输入,或者无法猜测出对应的用户名密码;

10、用热风枪或烙铁取下路由器上的存储FLASH芯片;

11、在Windows下用编程器提前存储在FLASH芯片的全部固件;

12、用WinSCP工具将提取出的固件上传到ubuntu系统中;

13、在ubuntu系统中安装对应的固件分析工具(firmware-mod-kit、binwalk、lzma、squashfs-tools等);

14、用这些分析工具进行分析,分析出来后,解压对应的数据包,提前对应的关键性数据进行分析;

到此步骤已经全部写出来了。
实例如下:

具体的在ubuntu系统中的操作流程如下:

这里以一款不知道哪家的路由器为例子,此家的路由器分AC和86型的AP采购进来,之前对此厂家的信息一无所知。
1、首先分析设备:

AC:

拆开此款AC,能够看到一个MT7621A的主控芯片及对应的256M的BGA的DDR和华邦的32M FLASH存储。

并看到一个4pin的间隙为2.0的TTL线的位置。

AP:

拆开此款的86型AP设备,应一个主控为MT7620N的主控芯片,16M的Ztel的DDR和华邦的4M FLASH存储。

此款的TTL线在板子的背面,而且屏蔽了kernel的启动信息,所以这里就没有此系统的启动过程。
2、查看启动信息:

下面的是AC设备接上TTL线能够看到对应的启动信息,具体如下:
===================================================================
MT7621 stage1 code Mar 12 2015 14:43:30 (ASIC)
CPU=500000000 HZ BUS=166666666 HZ
==================================================================
Change MPLL source from XTAL to CR…
do MEMPLL setting..
MEMPLL Config : 0x41100000
3PLL mode + External loopback
=== XTAL-40Mhz === DDR-400Mhz ===
PLL3 FB_DL: 0xd, 1/0 = 542/482 35000000
PLL4 FB_DL: 0xe, 1/0 = 586/438 39000000
PLL2 FB_DL: 0x15, 1/0 = 579/445 55000000
do DDR setting..[01F40000]
Apply DDR3 Setting…(use customer AC)
0 8 16 24 32 40 48 56 64 72 80 88 96 104 11 2 120
————————————————————————– ——
0000:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0001:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0002:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0003:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0004:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0005:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0006:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0007:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0008:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0009:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
000A:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
000B:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
000C:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
000D:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
000E:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
000F:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
0010:| 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0011:| 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
0012:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0013:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0014:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0015:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0016:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0017:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0018:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0019:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
001A:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
001B:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
001C:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
001D:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
001E:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
001F:| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
DRAMC_DQSCTL1[0e0]=14000000
DRAMC_DQSGCTL[124]=80000000
rank 0 coarse = 16
rank 0 fine = 64
B:| 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
opt_dle value:10
DRAMC_DDR2CTL[07c]=C287222D
DRAMC_PADCTL4[0e4]=000022B3
DRAMC_DQIDLY1[210]=0B0A090A
DRAMC_DQIDLY2[214]=07090909
DRAMC_DQIDLY3[218]=0B080A06
DRAMC_DQIDLY4[21c]=0A070B07
DRAMC_R0DELDLY[018]=00004040
==================================================================
RX DQS perbit delay software calibration
==================================================================
1.0-15 bit dq delay value
==================================================================
bit| 0 1 2 3 4 5 6 7 8 9
————————————–
0 | 10 9 10 11 9 9 9 7 6 10
10 | 8 11 7 11 7 10
————————————–

==================================================================
2.dqs window
x=pass dqs delay value (min~max)center
y=0-7bit DQ of every group
input delay:DQS0 =64 DQS1 = 64
==================================================================
bit DQS0 bit DQS1
0 (1~127)64 8 (1~127)64
1 (1~127)64 9 (2~127)64
2 (1~127)64 10 (1~127)64
3 (1~127)64 11 (1~127)64
4 (2~127)64 12 (1~127)64
5 (1~127)64 13 (1~127)64
6 (1~127)64 14 (1~127)64
7 (1~127)64 15 (1~127)64
==================================================================
3.dq delay value last
==================================================================
bit| 0 1 2 3 4 5 6 7 8 9
————————————–
0 | 10 9 10 11 9 9 9 7 6 10
10 | 8 11 7 11 7 10
==================================================================
==================================================================
TX perbyte calibration
==================================================================
DQS loop = 15, cmp_err_1 = ffff0000
dqs_perbyte_dly.last_dqsdly_pass[0]=15, finish count=1
dqs_perbyte_dly.last_dqsdly_pass[1]=15, finish count=2
DQ loop=15, cmp_err_1 = ffff0000
dqs_perbyte_dly.last_dqdly_pass[0]=15, finish count=1
dqs_perbyte_dly.last_dqdly_pass[1]=15, finish count=2
byte:0, (DQS,DQ)=(8,8)
byte:1, (DQS,DQ)=(8,8)
DRAMC_DQODLY1[200]=88888888
DRAMC_DQODLY2[204]=88888888
20,data:88
[EMI] DRAMC calibration passed

===================================================================
MT7621 stage1 code done
CPU=500000000 HZ BUS=166666666 HZ
===================================================================

U-Boot 1.1.3 (Jun 27 2016 – 10:37:27)

Board: Ralink APSoC DRAM: 256 MB
relocate_code Pointer at: 8ffb8000

Config XHCI 40M PLL
flash manufacture id: ef, device id 40 18
find flash: W25Q128BV
*** Warning – bad CRC, using default environment

============================================
Ralink UBoot Version: 4.3.0.0
——————————————–
ASIC MT7621A DualCore (MAC to MT7530 Mode)
DRAM_CONF_FROM: Auto-Detection
DRAM_TYPE: DDR3
DRAM bus: 16 bit
Xtal Mode=3 OCP Ratio=1/3
Flash component: SPI Flash
Date:Jun 27 2016 Time:10:37:27
============================================
icache: sets:256, ways:4, linesz:32 ,total:32768
dcache: sets:256, ways:4, linesz:32 ,total:32768

##### The CPU freq = 880 MHZ ####
estimate memory size =256 Mbytes
#Reset_MT7530
set LAN/WAN WLLLL

Please choose the operation:
1: Load system code to SDRAM via TFTP.
2: Load system code then write to Flash via TFTP.
3: Boot system code via Flash (default).
4: Entr boot command line interface.
7: Load Boot Loader code then write to Flash via Serial.
9: Load Boot Loader code then write to Flash via TFTP.
default: 3 0

3: System Boot system code via Flash.
## Booting image at bc050000 …
Image Name: Linux Kernel Image
Image Type: MIPS Linux Kernel Image (lzma compressed)
Data Size: 6157391 Bytes = 5.9 MB
Load Address: 80001000
Entry Point: 803559d0
Verifying Checksum … OK
Uncompressing Kernel Image … OK
No initrd
## Transferring control to Linux (at address 803559d0) …
## Giving linux memsize in MB, 256

Starting kernel …

LINUX started…

THIS IS ASIC
Linux version 3.10.14 (root@Erick) (gcc version 4.6.3 (Buildroot 2012.11.1) ) #450 SMP Wed Jul 6 17:56:27 CST 2016

The CPU feqenuce set to 880 MHz
GCMP present
CPU0 revision is: 0001992f (MIPS 1004Kc)
Software DMA cache coherency
Determined physical RAM map:
memory: 10000000 @ 00000000 (usable)
Initrd not found or empty – disabling initrd
Zone ranges:
Normal [mem 0x00000000-0x0fffffff]
HighMem empty
Movable zone start for each node
Early memory node ranges
node 0: [mem 0x00000000-0x0fffffff]
Detected 3 available secondary CPU(s)
Primary instruction cache 32kB, 4-way, VIPT, linesize 32 bytes.
Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
MIPS secondary cache 256kB, 8-way, linesize 32 bytes.
PERCPU: Embedded 7 pages/cpu @81203000 s6720 r8192 d13760 u32768
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024
Kernel command line: console=ttyS1,57600n8 root=/dev/ram0 console=ttyS1,57600 root=/dev/ram0 rootfstype=squashfs,jffs2
PID hash table entries: 1024 (order: 0, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Writing ErrCtl register=0001e103
Readback ErrCtl register=0001e103
Memory: 249948k/262144k available (3443k kernel code, 12196k reserved, 1654k data, 4432k init, 0k highmem)
Hierarchical RCU implementation.
NR_IRQS:128
console [ttyS1] enabled
Calibrating delay loop… 580.60 BogoMIPS (lpj=1161216)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
Performance counters: mips/1004K PMU enabled, 2 32-bit counters available to each CPU, irq -1 (share with timer interrupt)
launch: starting cpu1
launch: cpu1 gone!
CPU1 revision is: 0001992f (MIPS 1004Kc)
Primary instruction cache 32kB, 4-way, VIPT, linesize 32 bytes.
Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
MIPS secondary cache 256kB, 8-way, linesize 32 bytes.
Synchronize counters for CPU 1: done.
launch: starting cpu2
launch: cpu2 gone!
CPU2 revision is: 0001992f (MIPS 1004Kc)
Primary instruction cache 32kB, 4-way, VIPT, linesize 32 bytes.
Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
MIPS secondary cache 256kB, 8-way, linesize 32 bytes.
Synchronize counters for CPU 2: done.
launch: starting cpu3
launch: cpu3 gone!
CPU3 revision is: 0001992f (MIPS 1004Kc)
Primary instruction cache 32kB, 4-way, VIPT, linesize 32 bytes.
Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
MIPS secondary cache 256kB, 8-way, linesize 32 bytes.
Synchronize counters for CPU 3: done.
Brought up 4 CPUs
devtmpfs: initialized
NET: Registered protocol family 16
bio: create slab <bio-0> at 0
SCSI subsystem initialized
Switching to clocksource MIPS
NET: Registered protocol family 2
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP: reno registered
UDP hash table entries: 256 (order: 1, 8192 bytes)
UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
NET: Registered protocol family 1
4 CPUs re-calibrate udelay(lpj = 1167360)
squashfs: version 4.0 (2009/01/31) Phillip Lougher
NTFS driver 2.1.30 [Flags: R/W DEBUG].
jffs2: version 2.2. (NAND) (SUMMARY) (ZLIB) (RTIME) (c) 2001-2006 Red Hat, Inc.
fuse init (API version 7.22)
io scheduler noop registered (default)
Serial: 8250/16550 driver, 2 ports, IRQ sharing disabled
serial8250: ttyS0 at MMIO 0x1e000d00 (irq = 27) is a 16550A
serial8250: ttyS1 at MMIO 0x1e000c00 (irq = 26) is a 16550A
Ralink gpio driver initialized
brd: module loaded
loop: module loaded
flash manufacture id: ef, device id 40 18
W25Q128BV(ef 40180000) (16384 Kbytes)
mtd .name = raspi, .size = 0x01000000 (16M) .erasesize = 0x00010000 (64K) .numeraseregions = 0
Creating 6 MTD partitions on “raspi”:
0x000000000000-0x000000030000 : “Bootloader”
0x000000030000-0x000000040000 : “Config”
0x000000040000-0x000000050000 : “Factory”
0x000000050000-0x000000800000 : “Kernel”
0x000000800000-0x000001000000 : “DataBase”
0x000000000000-0x000001000000 : “ALL”
PPP generic driver version 2.4.2
PPP BSD Compression module registered
PPP MPPE Compression module registered
NET: Registered protocol family 24
PPTP driver version 0.8.5
rdm_major = 253
netif_napi_add() called with weight 128 on device eth2
GMAC1_MAC_ADRH — : 0x000078d3
GMAC1_MAC_ADRL — : 0x8dddbebc
Ralink APSoC Ethernet Driver Initilization. v3.1 1024 rx/tx descriptors allocated, mtu = 1500!
NAPI enable, Tx Ring = 1024, Rx Ring = 1024
GMAC1_MAC_ADRH — : 0x000078d3
GMAC1_MAC_ADRL — : 0x8dddbebc
PROC INIT OK!
Ralink APSoC Hardware Watchdog Timer
Netfilter messages via NETLINK v0.30.
nf_conntrack version 0.5.0 (3905 buckets, 15620 max)
ipt_domain 0.0.4 : Platinum, http://platinum.cublog.cn/
xt_time: kernel timezone is -0000
gre: GRE over IPv4 demultiplexor driver
ip_tables: (C) 2000-2006 Netfilter Core Team
Type=Linux
TCP: cubic registered
NET: Registered protocol family 17
l2tp_core: L2TP core driver, V2.0
l2tp_ppp: PPPoL2TP kernel driver, V2.0
8021q: 802.1Q VLAN Support v1.8
Warning: unable to open an initial console.
Freeing unused kernel memory: 4432K (804fc000 – 80950000)
Algorithmics/MIPS FPU Emulator v1.5
jffs2: notice: (120) jffs2_build_xattr_subsystem: xref (0 dead, 0 orphan) found.
78:FFFFFFD3:FFFFFF8D:FFFFFFDD:FFFFFFBE:FFFFFFBC
Raeth v3.1 (NAPI)

phy_tx_ring = 0x0c678000, tx_ring = 0xac678000

phy_rx_ring0 = 0x0c67c000, rx_ring0 = 0xac67c000
MT7530 Reset Completed!!
change HW-TRAP to 0x15c8f
set LAN/WAN LLLLW
GMAC1_MAC_ADRH — : 0x000078d3
GMAC1_MAC_ADRL — : 0x8dddbebc
GDMA2_MAC_ADRH — : 0x000078d3
GDMA2_MAC_ADRL — : 0x8dddbebd
eth3: ===> VirtualIF_open
CDMA_CSG_CFG = 81000000
GDMA1_FWD_CFG = 20710000
GDMA2_FWD_CFG = 20710000
device eth2 entered promiscuous mode
eth3: ===> VirtualIF_open
device eth3 entered promiscuous mode
br0: port 2(eth3) entered forwarding state
br0: port 2(eth3) entered forwarding state
br0: port 1(eth2) entered forwarding state
br0: port 1(eth2) entered forwarding state
MTK MSDC device init.
msdc0 -> ================ <- msdc_set_mclk() : L<686> PID<insmod><0x198>
msdc0 -> !!! Set<400KHz> Source<50000KHz> -> sclk<390KHz> <- msdc_set_mclk() : L<687> PID<insmod><0x198>
msdc0 -> ================ <- msdc_set_mclk() : L<688> PID<insmod><0x198>
msdc0 -> ops_get_cd return<1> <- msdc_ops_get_cd() : L<2317> PID<kworker/u8:0><0x6>
mtk-sd: MediaTek MT6575 MSDC Driver
mmc0: mmc_rescan_try_freq: trying to init card at 400000 Hz
msdc0 -> XXX MSDC_INT_SDIOIRQ <- msdc_irq() : L<2393>
msdc0 -> XXX CMD<52> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<52> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<8> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<1> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> set mclk to 0!!! <- msdc_set_mclk() : L<634> PID<kworker/u8:0><0x6>
mmc0: mmc_rescan_try_freq: trying to init card at 300000 Hz
msdc0 -> set mclk to 0!!! <- msdc_set_mclk() : L<634> PID<kworker/u8:0><0x6>
msdc0 -> ================ <- msdc_set_mclk() : L<686> PID<kworker/u8:0><0x6>
msdc0 -> !!! Set<300KHz> Source<50000KHz> -> sclk<297KHz> <- msdc_set_mclk() : L<687> PID<kworker/u8:0><0x6>
msdc0 -> ================ <- msdc_set_mclk() : L<688> PID<kworker/u8:0><0x6>
msdc0 -> XXX CMD<52> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<52> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<8> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<1> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> set mclk to 0!!! <- msdc_set_mclk() : L<634> PID<kworker/u8:0><0x6>
mmc0: mmc_rescan_try_freq: trying to init card at 260000 Hz
msdc0 -> set mclk to 0!!! <- msdc_set_mclk() : L<634> PID<kworker/u8:0><0x6>
msdc0 -> ================ <- msdc_set_mclk() : L<686> PID<kworker/u8:0><0x6>
msdc0 -> !!! Set<260KHz> Source<50000KHz> -> sclk<255KHz> <- msdc_set_mclk() : L<687> PID<kworker/u8:0><0x6>
msdc0 -> ================ <- msdc_set_mclk() : L<688> PID<kworker/u8:0><0x6>
msdc0 -> XXX CMD<52> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<52> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<8> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<5> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<55> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> XXX CMD<1> MSDC_INT_CMDTMO <- msdc_irq() : L<2461>
msdc0 -> set mclk to 0!!! <- msdc_set_mclk() : L<634> PID<kworker/u8:0><0x6>
Started WatchDog Timer.

br0: port 2(eth3) entered forwarding state
br0: port 1(eth2) entered forwarding state

AC1000 login:

 

后面有破解出来的密码,用用户名,密码就可以直接登录进入系统了。。

用户名:admin
密码:a1sev5y7c39k

PW300 login: admin
Password: a1sev5y7c39k
3、获取关键性数据:
最后能看到提示符:

AC1000 login:

看到提示符很是欣喜!

但是TTL的输入好像被软件或硬件上给做了屏蔽,此时通过键盘进行输入,失落。。。。

不过从上面的启动信息上,可以看出对应的硬件配置了,flash的分区表也有了。

配置的关键性数据:

 

mtd分区表的结构:

flash manufacture id: ef, device id 40 18
W25Q128BV(ef 40180000) (16384 Kbytes)
mtd .name = raspi, .size = 0x01000000 (16M) .erasesize = 0x00010000 (64K) .numeraseregions = 0
Creating 6 MTD partitions on “raspi”:
0x000000000000-0x000000030000 : “Bootloader”
0x000000030000-0x000000040000 : “Config”
0x000000040000-0x000000050000 : “Factory”
0x000000050000-0x000000800000 : “Kernel”
0x000000800000-0x000001000000 : “DataBase”
0x000000000000-0x000001000000 : “ALL”

 

对硬件有了基本上的了解,但是无法进行输入,所以也就无法进入下去了,只有拆卸Flash了。

4、无法输入或不知密码后的,拆卸FLASH后的分析步骤:

热风枪吹下来后,将其放置在编程器上读取32Mflash的数据,并将其通过WinSCP上传到ubuntu系统中进行查看;

root@dell-180:/home/leekwen/ac1000# binwalk 7621A-ac1000.bin -v

Scan Time: 2016-12-09 16:32:31
Target File: /home/leekwen/ac1000/7621A-ac1000.bin
MD5 Checksum: a4b523383795fa8af2680b29b67604f1
Signatures: 374

DECIMAL HEXADECIMAL DESCRIPTION
——————————————————————————–
71368 0x116C8 U-Boot version string, “U-Boot 1.1.3 (Jun 27 2016 – 10:37:27)”
327680 0x50000 uImage header, header size: 64 bytes, header CRC: 0xCEF2FB2F, created: 2016-07-06 09:56:37, image size: 6157391 bytes, Data Address: 0x80001000, Entry Point: 0x803559D0, data CRC: 0x4AB990B5, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: “Linux Kernel Image”
327744 0x50040 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 9701952 bytes
3675222 0x381456 MPEG transport stream data
8388608 0x800000 JFFS2 filesystem, little endian

 

用binwalk工具查看固件的头文件,看到上面的结果。

此时可以通过windows的winhex提取对应位置上的分区信息,中重要的是rootfs数据。

此时看到的是0x800000位置后的数据为JFFS2的分区数据。

提取后,进行解包即可。但是此时如果结果的数据是CPIO压缩的,建议还是解压到本地目录,否则会覆盖到你的X86的文件系统中,导致你的X86的ubuntu系统崩溃。

此篇文章的主要说明trips:

这里需要说明以下几点:

1、首先用binwalk进行头的分析,然后提取对应的头数据,并在系统中挂载对应的分区;

2、CPIO数据格式的文件,解压时需要注意不要直接解压到X86系统目录,否则会导致X86 ubuntu系统的崩溃;

3、如果是固件只开启的Telnetd服务,系统中也没有curl,nc,wget命令的话,那么传输数据的时候,就只能通过tftp命令了;

4、固件系统的挂载,需要指定对应的格式,mtd分区的挂载需要注意下,与传统的ntfs,fat,ext,LVM等分区的挂载不同;

实例:
mtd分区的挂载:

root@leekwen:/home/leekwen/ac1000/ac_bin# modprobe mtdram total_size=32768 erase_size=64
root@leekwen:/home/leekwen/ac1000/ac_bin# modprobe mtdblock
root@leekwen:/home/leekwen/ac1000/ac_bin# dd if=conf of=/dev/mtdblock0
root@leekwen:/home/leekwen/ac1000/ac_bin# mount -t jffs2 /dev/mtdblock0 /mnt

 

5、如果固件中的busybox版本比较低,而且命令不全的话,可以去下载对应cpu架构支持的busybox 静态文件,通过tftp上传上去,赋予执行权限后即可使用了。

此MT7621A所用的busybox为busybox-mipsel版本,非busybox-mipse版本的。

经研究发现,7620N 模块中的telnetd服务开启;
端口:23
用户名:admin
密码:a1sev5y7c39k

PW300 login: admin
Password: a1sev5y7c39k

所以就可以直接用admin及密码登陆了。

开启Win7端的TFTPD服务后,使用tftp命令上传及下载如下实例:

86型AP的架构如下:

# cat /proc/cpuinfo
system type : Ralink SoC
processor : 0
cpu model : MIPS 24Kc V5.0
BogoMIPS : 386.04
wait instruction : yes
microsecond timers : yes
tlb_entries : 32
extra interrupt vector : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0ff8, 0x0ff8, 0x0bdb, 0x0ff8]
ASEs implemented : mips16 dsp
shadow register sets : 1
core : 0
VCED exceptions : not available
VCEI exceptions : not available

下载busybox-mipsel,并放置在tftpd服务器的根目录下,然后在嵌入式系统中运行下面的命令:

# tftp -g -r busybox-mipsel 192.168.1.127
busybox-mipsel 100% |*******************************| 1539k 0:00:00 ETA
# ./busybox-mipsel
BusyBox v1.21.1 (2013-07-08 11:09:23 CDT) multi-call binary.
BusyBox is copyrighted by many authors between 1998-2012.
Licensed under GPLv2. See source distribution for detailed
copyright notices.

Usage: busybox [function [arguments]…]
or: busybox –list[-full]
or: busybox –install [-s] [DIR]
or: function [arguments]…

BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.

原来的嵌入式系统中没有的命令,可以通过如下的命令进行创建:

# cp busybox-mipsel /bin/
# ln -s /bin/busybox-mipsel /bin/netstat
# netstat -aln
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN
tcp 0 139 192.168.1.181:23 192.168.1.127:27602 ESTABLISHED
netstat: /proc/net/tcp6: No such file or directory
udp 0 0 0.0.0.0:9090 0.0.0.0:*
udp 0 0 0.0.0.0:63638 0.0.0.0:*
udp 0 0 0.0.0.0:162 0.0.0.0:*
udp 0 0 0.0.0.0:69 0.0.0.0:*
netstat: /proc/net/udp6: No such file or directory
netstat: /proc/net/raw6: No such file or directory
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path

将嵌入式系统中的mtd固件分区打包后,上传到windows中的命令如下:

导出固件:
# fdisk -l

Disk /dev/mtdblock0: 0 MB, 196608 bytes
255 heads, 63 sectors/track, 0 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/mtdblock0 doesn’t contain a valid partition table
Disk /dev/mtdblock1: 0 MB, 65536 bytes
255 heads, 63 sectors/track, 0 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/mtdblock1 doesn’t contain a valid partition table

Disk /dev/mtdblock2: 0 MB, 65536 bytes
255 heads, 63 sectors/track, 0 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/mtdblock2 doesn’t contain a valid partition table
Disk /dev/mtdblock3: 8 MB, 8060928 bytes
255 heads, 63 sectors/track, 0 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/mtdblock3 doesn’t contain a valid partition table

Disk /dev/mtdblock4: 8 MB, 8388608 bytes
255 heads, 63 sectors/track, 1 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/mtdblock4 doesn’t contain a valid partition table
Disk /dev/mtdblock5: 16 MB, 16777216 bytes
255 heads, 63 sectors/track, 2 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/mtdblock5 doesn’t contain a valid partition table

# cat /proc/mtd
dev: size erasesize name
mtd0: 00030000 00010000 “Bootloader”
mtd1: 00010000 00010000 “Config”
mtd2: 00010000 00010000 “Factory”
mtd3: 007b0000 00010000 “Kernel”
mtd4: 00800000 00010000 “DataBase”
mtd5: 01000000 00010000 “ALL”

# dd if=/dev/mtdblock3 of=block3
-sh: dd: not found

# ln -s /bin/busybox-mipsel /bin/dd

# dd if=/dev/mtdblock3 of=block3
15744+0 records in
15744+0 records out
8060928 bytes (7.7MB) copied, 3.758830 seconds, 2.0MB/s

# dd if=/dev/mtdblock4 of=block4
16384+0 records in
16384+0 records out
8388608 bytes (8.0MB) copied, 3.925839 seconds, 2.0MB/s

# dd if=/dev/mtdblock5 of=block5
32768+0 records in
32768+0 records out
16777216 bytes (16.0MB) copied, 7.893829 seconds, 2.0MB/s

# busybox-mipsel ls -lh
total 32448
-rw-r–r– 1 admin admin 7.7M Jan 1 00:23 block3
-rw-r–r– 1 admin admin 8.0M Jan 1 00:24 block4
-rw-r–r– 1 admin admin 16.0M Jan 1 00:24 block5

ubuntu分析提取的mtd块数据:

leekwen@leekwen:~/ac1000/mtd$ ls -lh
total 32448
-rw-r–r– 1 leekwen leekwen 7.7M Dec 13 01:33 block3
-rw-r–r– 1 leekwen leekwen 8.0M Dec 13 01:34 block4
-rw-r–r– 1 leekwen leekwen 16.0M Dec 13 01:35 block5
leekwen@leekwen:~/ac1000/mtd$ binwalk block3 -v

Scan Time: 2016-12-13 09:41:53
Target File: /home/leekwen/ac1000/mtd/block3
MD5 Checksum: 2930b8f9eacd024c8137de1f36ada2a0
Signatures: 374

DECIMAL HEXADECIMAL DESCRIPTION
——————————————————————————–
0 0x0 uImage header, header size: 64 bytes, header CRC:0xCEF2FB2F, created: 2016-07-06 09:56:37,
image size: 6157391 bytes, Data Address: 0x80001000, Entry Point: 0x803559D0, data CRC: 0x4AB990B5,
OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: “Linux Kernel Image”
64 0x40 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 9701952 bytes
3347542 0x331456 MPEG transport stream data

leekwen@leekwen:~/ac1000/mtd$ binwalk block4 -v

Scan Time: 2016-12-13 09:42:12
Target File: /home/leekwen/ac1000/mtd/block4
MD5 Checksum: b9250ddca6f75eb200820e8eb12ef0fe
Signatures: 374

DECIMAL HEXADECIMAL DESCRIPTION
——————————————————————————–
0 0x0 JFFS2 filesystem, little endian

leekwen@leekwen:~/ac1000/mtd$ binwalk block5 -v

Scan Time: 2016-12-13 09:42:20
Target File: /home/leekwen/ac1000/mtd/block5
MD5 Checksum: 0279c45881de84827d4eddb780b6cc24
Signatures: 374

DECIMAL HEXADECIMAL DESCRIPTION
——————————————————————————–
71368 0x116C8 U-Boot version string, “U-Boot 1.1.3 (Jun 27 2016 – 10:37:27)”
327680 0x50000 uImage header, header size: 64 bytes, header CRC: 0xCEF2FB2F, created: 2016-07-06 09:56:37,
image size: 6157391 bytes, Data Address: 0x80001000, Entry Point: 0x803559D0, data CRC: 0x4AB990B5,
OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: “Linux Kernel Image”
327744 0x50040 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 9701952 bytes
3675222 0x381456 MPEG transport stream data
8388608 0x800000 JFFS2 filesystem, little endian

嵌入式系统中执行上传命令,将打包的mtd分区包上传到windows的tftpd服务器中:
# tftp -p -r mtd.tar.gz 192.168.1.127
mtd.tar.gz 100% |*****************************************| 3910k 0:00:00 ETA
#

6、入门级的就写到这里了,其它的就看自己的linux命令用的如何了。。。

7、其AC与下面的AP通讯用的是SNMP:

日志如下:

通过snmpd进程进行通信
通信日志:
NET-SNMP version 5.6.2 restarted
Received SNMP packet(s) from UDP: [192.168.200.1]:62604->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.18.1
Received SNMP packet(s) from UDP: [192.168.200.1]:32450->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.18.1
Received SNMP packet(s) from UDP: [192.168.200.1]:15380->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.3.1.0
Received SNMP packet(s) from UDP: [192.168.200.1]:15195->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.59.1
Received SNMP packet(s) from UDP: [192.168.200.1]:45220->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.60.1
Received SNMP packet(s) from UDP: [192.168.200.1]:15945->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.61.1
Received SNMP packet(s) from UDP: [192.168.200.1]:2043->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.40.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.15.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.16.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.17.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.29.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.30.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.18.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.13.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.20.1
— iso.3.6.1.4.1.33980.100.1.3.1.0
— iso.3.6.1.4.1.33980.100.1.1.1.1.19.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.10.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.12.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.55.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.56.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.57.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.4.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.5.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.26.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.28.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.29.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.22.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.13.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.23.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.24.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.36.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.15.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.40.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.41.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.21.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.10.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.11.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.31.1
Received SNMP packet(s) from UDP: [192.168.200.1]:63905->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.3.3.1.3.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.3.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.3.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.3.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.4.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.4.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.4.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.4.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.2.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.2.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.2.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.2.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.10.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.10.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.10.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.10.4
— iso.3.6.1.4.1.33980.100.1.3.2.1.3.1
— iso.3.6.1.4.1.33980.100.1.3.2.1.3.2
— iso.3.6.1.4.1.33980.100.1.3.2.1.3.3
— iso.3.6.1.4.1.33980.100.1.3.2.1.3.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.7.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.7.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.7.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.7.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.8.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.8.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.8.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.8.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.9.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.9.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.9.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.9.4
— iso.3.6.1.4.1.33980.100.1.4.1.1.3.1
— iso.3.6.1.4.1.33980.100.1.4.1.1.3.2
— iso.3.6.1.4.1.33980.100.1.4.1.1.3.3
— iso.3.6.1.4.1.33980.100.1.4.1.1.3.4
— iso.3.6.1.4.1.33980.100.1.4.1.1.2.1
— iso.3.6.1.4.1.33980.100.1.4.1.1.2.2
— iso.3.6.1.4.1.33980.100.1.4.1.1.2.3
— iso.3.6.1.4.1.33980.100.1.4.1.1.2.4
— iso.3.6.1.4.1.33980.100.1.4.2.1.3.1
— iso.3.6.1.4.1.33980.100.1.4.2.1.3.2
— iso.3.6.1.4.1.33980.100.1.4.2.1.3.3
— iso.3.6.1.4.1.33980.100.1.4.2.1.3.4
— iso.3.6.1.4.1.33980.100.1.4.2.1.2.1
— iso.3.6.1.4.1.33980.100.1.4.2.1.2.2
— iso.3.6.1.4.1.33980.100.1.4.2.1.2.3
— iso.3.6.1.4.1.33980.100.1.4.2.1.2.4
Received SNMP packet(s) from UDP: [192.168.200.1]:16330->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.18.1
Received SNMP packet(s) from UDP: [192.168.200.1]:33809->[192.168.200.96]:161
SET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.61.1

urging address from address cache: UDP: [192.168.200.1]:33809->[192.168.200.96]:161Received SNMP packet(s) from UDP: [192.168.200.1]:62614->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.3.1.0
Purging address from address cache: UDP: [192.168.200.1]:24740->[192.168.200.96]:161Received SNMP packet(s) from UDP: [192.168.200.1]:45882->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.59.1
Purging address from address cache: UDP: [192.168.200.1]:22828->[192.168.200.96]:161Received SNMP packet(s) from UDP: [192.168.200.1]:7701->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.60.1
Purging address from address cache: UDP: [192.168.200.1]:40545->[192.168.200.96]:161Received SNMP packet(s) from UDP: [192.168.200.1]:60496->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.61.1
Purging address from address cache: UDP: [192.168.200.1]:16535->[192.168.200.96]:161Received SNMP packet(s) from UDP: [192.168.200.1]:26281->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.1.1.1.40.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.15.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.16.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.17.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.29.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.30.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.18.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.13.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.20.1
— iso.3.6.1.4.1.33980.100.1.3.1.0
— iso.3.6.1.4.1.33980.100.1.1.1.1.19.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.10.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.12.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.55.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.56.1
— iso.3.6.1.4.1.33980.100.1.1.1.1.57.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.4.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.5.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.26.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.28.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.29.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.22.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.13.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.23.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.24.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.36.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.15.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.40.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.41.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.21.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.10.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.11.1
— iso.3.6.1.4.1.33980.100.1.2.3.1.31.1
Purging address from address cache: UDP: [192.168.200.1]:64805->[192.168.200.96]:161Received SNMP packet(s) from UDP: [192.168.200.1]:47345->[192.168.200.96]:161
GET message
— iso.3.6.1.4.1.33980.100.1.3.3.1.3.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.3.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.3.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.3.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.4.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.4.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.4.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.4.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.2.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.2.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.2.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.2.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.10.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.10.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.10.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.10.4
— iso.3.6.1.4.1.33980.100.1.3.2.1.3.1
— iso.3.6.1.4.1.33980.100.1.3.2.1.3.2
— iso.3.6.1.4.1.33980.100.1.3.2.1.3.3
— iso.3.6.1.4.1.33980.100.1.3.2.1.3.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.7.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.7.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.7.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.7.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.8.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.8.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.8.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.8.4
— iso.3.6.1.4.1.33980.100.1.3.3.1.9.1
— iso.3.6.1.4.1.33980.100.1.3.3.1.9.2
— iso.3.6.1.4.1.33980.100.1.3.3.1.9.3
— iso.3.6.1.4.1.33980.100.1.3.3.1.9.4
— iso.3.6.1.4.1.33980.100.1.4.1.1.3.1
— iso.3.6.1.4.1.33980.100.1.4.1.1.3.2
— iso.3.6.1.4.1.33980.100.1.4.1.1.3.3
— iso.3.6.1.4.1.33980.100.1.4.1.1.3.4
— iso.3.6.1.4.1.33980.100.1.4.1.1.2.1
— iso.3.6.1.4.1.33980.100.1.4.1.1.2.2
— iso.3.6.1.4.1.33980.100.1.4.1.1.2.3
— iso.3.6.1.4.1.33980.100.1.4.1.1.2.4
— iso.3.6.1.4.1.33980.100.1.4.2.1.3.1
— iso.3.6.1.4.1.33980.100.1.4.2.1.3.2
— iso.3.6.1.4.1.33980.100.1.4.2.1.3.3
— iso.3.6.1.4.1.33980.100.1.4.2.1.3.4
— iso.3.6.1.4.1.33980.100.1.4.2.1.2.1
— iso.3.6.1.4.1.33980.100.1.4.2.1.2.2
— iso.3.6.1.4.1.33980.100.1.4.2.1.2.3
— iso.3.6.1.4.1.33980.100.1.4.2.1.2.4

上面为自己的一些实际操作过程,以此备份,防止自己遗忘了。。~

天猫精灵X1破解

拿到了一个天猫精灵,板子上有USB调试接口,通过焊接拉了一条线出来。

直接serial 串口链接进去,发现有adbd服务,但是没有服务的文件,手动导入一个adbd到/data/usr/bin/目录下,重启天猫精灵,提示输入账号密码。

直接root,密码为空,拿到shell。 是个root权限。

subway ~/Desktop/ccc$ adb shell
sh-3.2#
sh-3.2#
sh-3.2#
sh-3.2# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:470 errors:0 dropped:0 overruns:0 frame:0
TX packets:470 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:41235 (40.2 KiB) TX bytes:41235 (40.2 KiB)

wlan0 Link encap:Ethernet HWaddr 18:BC:5A:17:5B:A8
inet addr:10.88.15.192 Bcast:10.88.15.255 Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:10374 errors:0 dropped:0 overruns:0 frame:0
TX packets:1663 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1642807 (1.5 MiB) TX bytes:106668 (104.1 KiB)

看看mtd信息,Nandflash

sh-3.2# cat /proc/mtd
Nand part number is “MX30LF2G18AC 2G 3.3V 8-bit”
dev: size erasesize name
mtd0: 00080000 00020000 “UBOOT”
mtd1: 00400000 00020000 “NVRAM”
mtd2: 00c00000 00020000 “BOOTIMG1”
mtd3: 00c00000 00020000 “BOOTIMG2”
mtd4: 00080000 00020000 “SEC_RO”
mtd5: 00080000 00020000 “MISC”
mtd6: 00200000 00020000 “TEE1”
mtd7: 00200000 00020000 “TEE2”
mtd8: 03300000 00020000 “ROOTFS1”
mtd9: 03300000 00020000 “ROOTFS2”
mtd10: 07700000 00020000 “USRDATA”

 

mtdinfo信息

sh-3.2# mtd
mtd_debug mtdinfo mtdpart
sh-3.2# mtdinfo
Count of MTD devices: 11
Present MTD devices: mtd0, mtd1, mtd2, mtd3, mtd4, mtd5, mtd6, mtd7, mtd8, mtd9, mtd10
Sysfs interface supported: yes

sh-3.2# clear
sh-3.2# mtdinfo /dev/mtd0
mtd0
Name: UBOOT
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 4 (524288 bytes, 512.0 KiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:0
Bad blocks are allowed: true
Device is writable: true

sh-3.2# mtdinfo /dev/mtd1
mtd1
Name: NVRAM
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 32 (4194304 bytes, 4.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:2
Bad blocks are allowed: true
Device is writable: true

sh-3.2# mtdinfo /dev/mtd2
mtd2
Name: BOOTIMG1
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 96 (12582912 bytes, 12.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:4
Bad blocks are allowed: true
Device is writable: true

sh-3.2# mtdinfo /dev/mtd3
mtd3
Name: BOOTIMG2
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 96 (12582912 bytes, 12.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:6
Bad blocks are allowed: true
Device is writable: true

sh-3.2# mtdinfo /dev/mtd4
mtd4
Name: SEC_RO
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 4 (524288 bytes, 512.0 KiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:8
Bad blocks are allowed: true
Device is writable: true

sh-3.2# mtdinfo /dev/mtd5
mtd5
Name: MISC
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 4 (524288 bytes, 512.0 KiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:10
Bad blocks are allowed: true
Device is writable: true

sh-3.2# mtdinfo /dev/mtd6
mtd6
Name: TEE1
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 16 (2097152 bytes, 2.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:12
Bad blocks are allowed: true
Device is writable: true

sh-3.2# mtdinfo /dev/mtd7
mtd7
Name: TEE2
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 16 (2097152 bytes, 2.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:14
Bad blocks are allowed: true
Device is writable: true

sh-3.2# mtdinfo /dev/mtd8
mtd8
Name: ROOTFS1
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 408 (53477376 bytes, 51.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:16
Bad blocks are allowed: true
Device is writable: true

sh-3.2# mtdinfo /dev/mtd9
mtd9
Name: ROOTFS2
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 408 (53477376 bytes, 51.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:18
Bad blocks are allowed: true
Device is writable: false

sh-3.2# mtdinfo /dev/mtd10
mtd10
Name: USRDATA
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 952 (124780544 bytes, 119.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:20
Bad blocks are allowed: true
Device is writable: true

 

【Linux-设备树】.dtb文件的反汇编

dtb文件的格式如下图

 

NOTE:不同部分顺序可能不一样

文件头boot_param_header


struct boot_param_header {
u32 magic;----------------用于标dtb文件头,等于OF_DT_HEADER=“0xd00dfeed”
u32 totalsize;------------dtb文件大小
u32 off_dt_struct;--------DT structure偏移
u32 off_dt_strings;-------DT strings偏移
u32 off_mem_rsvmap;-------memory reserve map偏移
u32 version;--------------版本号
u32 last_comp_version;----兼容最早版本号 /* version 2 fields below */
u32 boot_cpuid_phys;------physical CPU id /* version 3 fields below */
u32 size_dt_strings;------size of the strings block /* version 17 fields below */
u32 size_dt_struct;-----------size of the DT structure block };

保留内存memory reserve map

这段保存的是一个保留内存映射列表,每个表由一对64位的物理地址和大小组成

device-tree structure&strings

由于某些属性(比如compatible)在大多数节点下都会存在,为了减少dtb文件大小,就需要把这些属性字符串只指定一个存储位置即可,这样每个节点的属性只需要按照位置找到属性字符串的位置就可以得到是哪个属性,所以dtb把device-tree strings单独列出来存储,下图是device-tree structure的格式,节点嵌套节点

 

上面的宏定义如下


<span class="hljs-preprocessor">#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */
#define FDT_TAGSIZE sizeof(uint32_t)
#define FDT_BEGIN_NODE 0x1 /* Start node: full name */
#define FDT_END_NODE 0x2 /* End node */
#define FDT_PROP 0x3 /* Property: name off, size, content */
#define FDT_NOP 0x4 /* nop */
#define FDT_END 0x9
#define FDT_V1_SIZE (7*sizeof(uint32_t))
#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t))
#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t))
#define FDT_V16_SIZE FDT_V3_SIZE
#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t))</span>

总图

 

接下来在使用设备树时我们将**.dts文件利用dtc编译器编译为**.dtb文件。

在已知**.dtb文件的情况下我们有两种方法可以得到dts源码:

方法一:使用fdtdump工具进行反汇编

使用命令:root#fdtdump **.dtb > temp.dts

反汇编生成的内容保存在temp.dts

方法二:使用dtc编译器进行反汇编

dtc -h 可以产看dtc命令的帮助

使用命令:root# dtc -I dtb -O dts -o temp1.dts s5pv210-smdkv210.dtb

代码空白区手动添加代码

原理简单一些,不过里面坑还是挺多。

修改OEP,指向我们新增我们的代码,执行完以后跳回执行的地方。

E8, E9硬编码

研究一个调用的时候编译完成后是什么样子

OEP:

一、call 0x12345678 (00401050)
jmp 0x23456789 (00403b80)

我们调用一个函数,如: call 0x12345678 为例子:
对应的硬编码是— EB 53 FE FF FF 这样的形式

二、jmp 0x23456789

对应的硬编码是— E9 2B 2B FF FF 这样的形式

MessageBox 地址 – 0x77E5425F

按照常理理解的话应当是 50104000,但现在发现不是这样的。
按照常理理解的话应当是 803b4000,但现在发现也不是这样的。

那么EB 后面跟的四个字节跟要真正跳转的地址之间需要进行转换的。

————————————————————————

我们真正去的地址是 0x77E5425F
正常的话:EB 5F 42 E5 77 但不是这样。
真正要跳转的公式如下 = EB这条指令的下一行地址 + X

X = 真正要跳转的地址 – E8这条指令的下一行地址

X = 00401050 – 004011fd === FF FF FE 53 ====E8 FF FF FE 53

现在真正硬编码是:
EB 53 FE FF FF (Little endian)

看一下jmp: 硬编码规则是

00403b80 – 401055 = 00002B2B ==== E9 2B 2B 00 00

当前指令的地址 + 5 = 下一行指令的地址。

当前指令的地址 + 当前这一行地址长度 = 下一行指令的地址

要跳转的地方 = E8当前当前的地址 + 5 + x
X = 要跳转的地址 – (E8的地址 + 5)

参数的硬编码”
push 0 – 6A 00

6A 00
6A 00
6A 00
6A 00

EB 00 00 00 00
E9 00 00 00 00
—————————————————————————————
6A 00 6A 00 6A 00 6A 00 EB 00 00 00 00 E9 00 00 00 00
————————————————————————————

那么我们把这段代码加到代码区的空白区

_______________________________

一般是第一个节,filebuffer 对齐以后有一部分空白的代码区
,一般都是200H对齐。 代码区添加的好处就是不需要更改节的属性。执行可以执行。

那么问题是 必须得保证剩下的代码区空白区能足够。

———————————————————————————

那么我们添加代码的时候在内存里加还是直接在文件里加?

我是直接在内存拉伸后的方式手动添加 并换算成filebuffer格式存硬盘

———————————————————————
那么开始了。

首先先看第一个节,sizeofrawdata- virtualsize 是不是大于18个字节。(我们添加的代码18字节)

然后我们再代码区的后面添加(代码区开始提提防 + 文件大小 +1 位置开始加)

计算了下代码区的空闲区域。

直接添加: 6A 00 6A 00 6A 00 6A 00 E8 00 00 00 00 E9 00 00 00 00

ok 写完了~ 现在开始算文件偏移了。
E8 真正要跳的地方时 77 E5 42 5F

然后看现在E9的地址是 001a73d + image_base基地址 (但是这是文件偏移和内存偏移一样的,因为我使用的PE是文件对齐和内存对齐一样)

那么我的的image_base = 00400000

现在我们的值是 0041a73d

x = 77E5425F – 0041a73d = 77A39B22 哈哈 算出来了,直接填写。
E8 22 9B A3 77 搞定一个。

6A 00 6A 00 6A 00 6A 00 E8 22 9B A3 77 E9 00 00 00 00

现在剩下E9, 跳OEP, 这正入口 EP地址(内存偏移)

—————————————————————————

000183d7 真正跳转的地址是 004183D7

E9 下一条41a742

004183D7 – 41a742 = FFFFDC95

e9 95 DC FF FF

6A 00 6A 00 6A 00 6A 00 E8 22 9B A3 77 E9 95 DC FF FF

写完了。。 然后我们改OEP 1a730开始执行。 其实真正开始的其实是 41a730。 我们把偏移就OK

在可选PE头。 改成30 A7 01 搞定OEP

保存 运行~~ OK了。~

基于linux嵌入式固件动态分析-FIRMADYNE

firmadyne是可以进行模拟和动态分析的Linux系统为基础的嵌入式固件,具有可自动化和可扩展等优秀的属性。
该固件由以下几个组件组成:

具有固件执行的指令的修改定制过的内核(MIPS:v2.6.32,ARM:v4.1,v3.10);
一个用户态的NVRAM库(https://github.com/firmadyne/libnvram)来模拟硬件NVRAM的外设;
从下载的固件中提取文件系统和内核的提取工具(https://github.com/firmadyne/extractor);
一个console应用程序用于shell进行调试的接口;
一个从42个不同的供应商下载固件的爬虫(https://github.com/firmadyne/scraper);
现在firmadyne有以下三个基本的自动化分析过程:
可访问的web应用程序
SNMP 信息
漏洞检测

我们从在2016年网络和分布式系统安全研讨会(NDSS)文章(http://www.internetsociety.org/events/ndss-symposium)发布了题为“基于Linux嵌入式固件的自动动态分析”

https://github.com/firmadyne/firmadyne/blob/master/paper/paper.pdf

他们评估了FIRMADYNE系统,使用了在23,035固件镜像中能够提取9,486个固件镜像。
使用metasploit漏洞库的60的漏洞,和14个0day漏洞被发现,显示1971(43%)固件的846个镜像容易受到至少一个漏洞影响以及89个不同的产品。有关更多的细节,参考上面的文件。

废话不多说,直接开始正题:

安装部分:

sudo apt-get install busybox fakeroot git kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan
git clone --recursive https://github.com/firmadyne/firmadyne.git

提取工具

git clone https://github.com/devttys0/binwalk.git
sudo ./binwalk/deps.sh
sudo python ./binwalk/setup.py install
For Python 2.x, sudo apt-get install python-lzma
sudo -H pip install git+https://github.com/ahupp/python-magic

除了jefferson以外(https://github.com/sviehb/jefferson),如果是jefferson的话额外安装jefferson(https://github.com/firmadyne/jefferson),可以提取额外的文件和压缩格式。
sasquatch(https://github.com/devttys0/sasquatch) 安装(https://github.com/firmadyne/sasquatch)也是为了遇到eroor的时候提示信息,防止误报情况发生。

数据库的安装

sudo apt-get install postgresql
sudo -u postgres createuser -P firmadyne, with password firmadyne
sudo -u postgres createdb -O firmadyne firmware
sudo -u postgres psql -d firmware < ./firmadyne/database/schema

二进制文件

要下载所有组件的预编译的二进制文件,运行以下脚本:

cd ./firmadyne; ./download.sh

安装QEMU

sudo apt-get install qemu-system-arm qemu-system-mips qemu-utils

使用方法:

1,firmadyne.config中设置FIRMWARE_DIR ,指向根目录中。

2,下载固件,如, v2.0.3 for Netgear WNAP320.(http://www.netgear.com/business/products/wireless/business-wireless/wnap320.aspx)

wget http://www.downloads.netgear.com/files/GDC/WNAP320/WNAP320%20Firmware%20Version%202.0.3.zip

3,使用提取工具只提取文件系统,no kernel (-nk), no parallel operation (-np), 然后 sqlserver的 image 表里填充127.0.0.1 (-sql),使用字段用 Netgear 字段(-b)命令。

./sources/extractor/extractor.py -b Netgear -sql 127.0.0.1 -np -nk "WNAP320 Firmware Version 2.0.3.zip" images

4,识别固件中 表示为 “1”的架构,并吧结果存储在image表中。

./scripts/getArch.sh ./images/1.tar.gz

5,加载固件1的文件系统的内容到数据库中,填充object 和object_to_image表

./scripts/tar2db.py -i 1 -f ./images/1.tar.gz

6,创建固件的QEMU磁盘映像1。

sudo ./scripts/makeImage.sh 1

7,推断固件1的网络配置,记录内核日志到 ./scratch/1/qemu.initial.serial.log. 位置

./scripts/inferNetwork.sh 1

8,使用推断的网络配置模拟启动固件1,这将通过修改主机系统的配置创建一个TAP设备和添加一个路由。

./scratch/1/run.sh

9,现在该设备已经可以通过网络连通,可以进行分析使用。内核也记录在 ./scratch/1/qemu.final.serial.log. 这里

./analyses/snmpwalk.sh 192.168.0.100
./analyses/webAccess.py 1 192.168.0.100 log.txt
mkdir exploits; ./analyses/runExploits.py -t 192.168.0.100 -o exploits/exploit -e x
sudo nmap -O -sV 192.168.0.100

10,使用run-debug借口访问控制台程序,(无网络访问权限),然后使用 run.sh启用network-enabled,网络访问配置。

./scripts/run-debug.sh 1
     nc -U /tmp/qemu.1.S1

11,以下命令将会启动 挂载硬件系统1(mount/unmount),确保模拟固件没有运行,并在执行任何其他操作之前请记住要卸载文件系统。

sudo ./scripts/mount.sh 1
    sudo ./scripts/umount.sh 1

firmadyne 下载: https://github.com/firmadyne/firmadyne

Reference:
【1】Towards Automated Dynamic Analysis for Linux – based Embedded Firmware https://www.internetsociety.org/sites/default/files/07_1-ndss2016-slides.pdf