利用qemu建立AC9、K3的动态调试环境

利用qemu建立AC9、K3的动态调试环境有1条评论

2017年3月28日 at 下午10:24分类:其他 阅读: 1,964 次

参考:

https://wiki.openwrt.org/doc/howto/qemu

http://www.cnblogs.com/shangye/p/6196403.html

http://xdxd.love/2016/09/20/逆向路由器固件之动态调试/

http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458279448&idx=3&sn=1a4b02ddd342a609f528c7b47d758925&scene=2&srcid=0831gY8sVHg6HrLm4pJeunko&from=timeline&isappinstalled=0#wechat_redirect

 

1、安装binwalk
git clone https://github.com/devttys0/binwalk.git

cd binwalk
sudo python setup.py install
sudo apt-get install python-lzma

2、安装qemu
sudo apt-get install qemu qemu-system

sudo apt-get install binfmt-support qemu-user-static

3、解压ac9固件
binwalk -Me ac9.bin

4、运行固件中的程序
进入解压后的./squashfs-root目录,运行
cp $(which qemu-arm-static) ./
sudo chroot . ./qemu-arm-static ./bin/uname -a
sudo chroot . ./qemu-arm-static ./sbin/ifconfig
可以看到固件中uname、ifconfig程序的运行结果

5、运行固件

针对不同平台,openwrt有不同的linux内核

Mips为Malta平台的linux系统内核:

https://downloads.openwrt.org/snapshots/trunk/malta/generic/openwrt-malta-le-vmlinux-initramfs.elf

ARM为realview平台的linux系统内核:

https://downloads.openwrt.org/snapshots/trunk/realview/generic/openwrt-realview-vmlinux-initramfs.elf

由于AC9和K3都是ARM架构的,我们执行下面的命令可以启动openwrt:

sudo qemu-system-arm -kernel openwrt-realview-vmlinux-initramfs.elf -M realview-eb-mpcore -net nic,vlan=0,macaddr=12:22:22:22:22:22 -net tap -nographic

 

现在要把AC9的文件加入进去

1)使用dd创建一个文件
dd if=/dev/zero of=./share.img bs=1M count=35
2)格式化share.img文件
mkfs.ext4 ./share.img
3)然后执行
sudo mount -o loop ./share.img /tmp/share

将ac9的固件内容拷贝到/tmp/share即可

 

再执行如下命令启动qemu:

sudo qemu-system-arm -kernel openwrt-realview-vmlinux-initramfs.elf -M realview-eb-mpcore -net nic,vlan=0,macaddr=12:22:22:22:22:22 -net tap -nographic  -sd ./share.img

-kernel参数指定了内核文件

-M参数指定了需要qemu模拟的平台

-net参数指定了网卡的mac地址

-sd参数就是指定了我们的硬盘镜像文件

-nographic告诉qemu不用另起一个界面视窗,就用当前的控制台

通过如下命令挂载ac9的文件系统:

mount -t ext4 /dev/mmcblk0 /overlay/

然后用chroot /overlay /bin/sh来切换根目录到路由器文件系统。

 

为了能够让QEMU虚拟机和宿主机都上网,并且互通,为动态调试做准备,必须要配置桥接网络
sudo apt-get install bridge-utils uml-utilities

-修改/etc/network/interfaces内容

auto  lo
     iface lo inet loopback
     auto eth0
     iface eth0 inet manual
     up ifconfig eth0 0.0.0.0 up
     auto br0
     iface br0 inet dhcp
     bridge_ports eth0
     bridge_stp off
     bridge_maxwait 1

-修改/etc/qemu-ifup内容

    #!/bin/sh
     echo "Executing  /etc/qemu-ifup"
     echo "Bringing up $1  for bridged mode..."
     sudo /sbin/ifconfig $1  0.0.0.0 promisc up
     echo "Adding $1 to  br0..."
     sudo /sbin/brctl addif br0  $1
     sleep 3

斐讯K3固件研究

斐讯K3固件研究有2条评论

2017年3月27日 at 下午2:17分类:其他 阅读: 5,525 次

斐讯K3和K2的固件差别比较大,WEB页面不再是通过lua来控制。

斐讯K3在httpd(/usr/sbin/httpd)中集成了CGI脚本,网页文件在/www目录

比如我们要研究数据备份的内容,在/www/pc/backupReset.htm可以看到其处理过程:

点击“备份配置”按钮,会调用nvramdl.cgi文件进行处理,此文件存在于httpd可执行文件中:
strings httpd|grep cgi

用IDA分析httpd文件:
对配置文件进行处理的可能是如下函数:
sub_502EC

使用了aes_ecb_128encode加密方式

调用nvram_get读取数据,函数中还调用了hmac_sha1加密算法进行了处理

未完待续..

斐讯K2 UDP转发的问题(时钟无法同步)

斐讯K2 UDP转发的问题(时钟无法同步)有1条评论

2017年3月20日 at 上午10:12分类:其他 阅读: 2,824 次

斐讯K2使用过程中,发现有时会出现时钟无法同步的现象,而且一般是做二级路由的情况下出现,定位过程如下

 

NTP时钟同步使用的UDP 123号端口,我们在本地搭建环境,用两台K2,一台地址为192.168.1.1,PPPOE拨号上网

另一台无线中继到第一台,WAN地址为192.168.1.122,LAN地址为192.168.2.1

先在第二台上把系统的ntp给关掉:

/etc/init.d/sysntpd stop

采用手工同步命令同步时钟:

/usr/sbin/ntpd -n -d -p clock.fmt.he.net

正常情况下应该是这样的:

正常情况下抓取的报文信息:

把端口转发或DMZ打开,然后再运行:

/usr/sbin/ntpd -n -d -p clock.fmt.he.net

报文是这样的:

可以看到,很多报文是超时的,为什么会这样呢?

我们简化一下组网,在本地进行测试,主要测试K2对UDP的转发处理,在K2的LAN接一台计算机,运行IPOP的UDP客户端(192.168.2.203),在K2的WAN口接一台计算机,运行IPOP的UDP服务端(192.168.1.227):
正常情况下,客户端能够发送和接收到UDP报文:

服务端信息:

抓包报文:

注意端口转换信息:客户端是22211-22213,NAT转换后是58706-58708

然后我们开启端口转发,会发现端口转换错误:
客户端收不到返回报文:

服务段收到了客户端的请求,但是会发现客户端的端口没有变化:

抓包报文也显示NAT转换时端口没有变化:

客户端源端口是变化的,经过NAT转换后,源端口变成一样了,这样返回的UDP报文会找不到正确的客户端源端口返回数据,造成客户端无法正确的接受UDP返回报文

为什么会造成此问题?

查看源码会发现,导致此问题的语句为:
端口转发:
iptables -t nat -A port_forward_postrout -d 192.168.2.2/32 -o br-lan -p tcp -j MASQUERADE
DMZ:
iptables -t nat -A DMZ_postrout -d 192.168.2.2/32 -o br-lan -j MASQUERADE
上面两条语句都是对br-lan接口增加了MASQUERADE规则

未完待续..

斐讯K2 V22.5.9.163官方固件定制版本V1.1,集成breed,支持官方版本直刷

斐讯K2 V22.5.9.163官方固件定制版本V1.1,集成breed,支持官方版本直刷无评论

2017年3月18日 at 下午8:18分类:硬件 阅读: 3,923 次

本固件为斐讯K2 V22.5.9.163的修改版本

本固件支持从官方版本直接升级,并集成了最新的breed,刷入后自动将bootloader更新为最新breed。



固件下载
--------------------------------------------------------------------------------------------------------------------------------------------
固件下载地址:
http://pan.baidu.com/s/1geCr84N

目录:K2 ROM>V22.5.9.163

固件名:
k2_163_org.bin为官方V22.5.9.163版本,v1.0定制版本刷此固件可以恢复为纯正的官方版本
k2_163_vxx_breed.bin为针对163的定制版本,比如k2_163_v11_breed.bin为定制版本V1.1,带breed后缀的固件自带最新的breed程序。


当前特性
--------------------------------------------------------------------------------------------------------------------------------------------
1、官方固件净化(禁止可疑程序、关闭adpush广告推送)
2、所有添加应用缺省禁止,初始即为“纯净精简”版本
3、支持广告过滤(adbyby)、S S R 和自动中继
4、使能启动任务和计划(定时)任务,支持LED指示灯控制
5、支持官方APP本地和远程(慎用)管理

版本更新记录
--------------------------------------------------------------------------------------------------------------------------------------------
【2017-03-03】V1.0发布

【2017-03-03】V1.1发布
增加S S R和LED控制,支持从官方版本直接升级,自带breed


安装说明
--------------------------------------------------------------------------------------------------------------------------------------------
1、如果你是官方版本的固件,直接在WEB页面的“手动升级”菜单进行升级:
 nww
注:官方固件版本号需大于V21.4.6.12,如果目前的固件版本低于V21.4.6.12,请先升级到V21.4.6.12后再升级此版本

2、如果你是V22.5.9.163定制版本V1.0,请在WEB“手动升级”页面先刷入k2_163_org.bin恢复为官方固件,重启后再按照第1步刷k2_163_vxx_breed.bin,后续的定制版本支持直接从WEB页面手动升级,不需要再恢复为官方固件


3、如果你是其他定制版固件或第三方固件,请到【此贴】下载firmware_k2_V10.bin,在breed中刷入,重启后变为官方版本,然后再按照第1步刷k2_163_vxx_breed.bin




使用说明
--------------------------------------------------------------------------------------------------------------------------------------------
1、刷入固件重启后,在“高级设置”-“系统状态”页面可以看到定制版本号:
bb3


2、此固件自带breed,由于V22.5.9.163版本的分区变化,如果你后续想要刷回其他第三方固件,请先在breed“环境变量设置”中改为“禁用”,然后再刷第三方固件,否则无法启动
bb2
 
breed进入方式:电脑连接LAN口自动获取 IP 地址,按住K2复位键再通电,持续按住几秒,然后电脑访问http://192.168.1.1即可在WEB刷第三方固件

3、、由于空间限制,缺省不安装ssh,如需命令行,可以在“启动项目”添加
/usr/sbin/telnetd -l /bin/login.sh
重启后即可telnet登录K2
 

4、其他功能说明请参考【此贴

linux下的二进制文件操作

linux下的二进制文件操作无评论

2017年3月18日 at 上午8:19分类:软件 阅读: 1,532 次

二进制文件显示:

hexdump

命令语法:

hexdump: [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]

 

命令参数:

此命令参数是Red Hat Enterprise Linux Server release 5.7下hexdump命令参数,不同版本Linux的hexdump命令参数有可能不同。

参数 长参数 描叙
-b 每个字节显示为8进制。一行共16个字节,一行开始以十六进制显示偏移值
-c 每个字节显示为ASCII字符
-C 每个字节显示为16进制和相应的ASCII字符
-d 两个字节显示为10进制
-e 格式化输出
-f Specify a file that contains one or more newline separated format strings.  Empty lines and lines whose first non-blank character is a hash mark (#) are ignored.
-n 只格式前n个长度的字符
-o 两个字节显示为8进制
-s 从偏移量开始输出
-v The -v option causes hexdump to display all input data.  Without the -v option, any number of groups of output lines, which would be identical to the immediately preceding group of output lines
-x 双字节十六进制显示

比如如下命令查看k2_163_v11_breed.bin文件从0x30000地址开始的64个字节内容:

# hexdump -C -s 0x30000  -n 64 k2_163_v11_breed.bin

 

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

参数注释:

if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
conv=conversion:用指定的参数转换文件。
ascii:转换ebcdic为ascii
ebcdic:转换ascii为ebcdic
ibm:转换ascii为alternate ebcdic
block:把每一行转换为长度为cbs,不足部分用空格填充
unblock:使每一行的长度都为cbs,不足部分用空格填充
lcase:把大写字符转换为小写字符
ucase:把小写字符转换为大写字符
swab:交换输入的每对字节
noerror:出错时不停止
notrunc:不截短输出文件
sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

比如拷贝一个文件从偏移量0x30000(196608)开始的64个字节:

#dd if=./k2_163_v11_breed.bin of=./tmp.bin bs=1 skip=196608 count=64

sed是流编辑器,流既可以是字符流也可以是二进制流,可以针对文本字符或二进制字符进行修改替换,可以直接修改二进制文件。
$ sed 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' binfile > new_binfile