[BUUCTF]firmware - squashfs固件的基本逆向
flag{33a422c45d551ac6e4756f59812a954b}
-
首先遇到的不是一个常规的逆向文件,使用
file
进行判断
然后使用
binwalk
查看binwalk -e 51475f91-7b90-41dd-81a3-8b82df4f29d0.bin
解压生成的文件得到了以下文件:
根据
.squashfs
和binwalk
的输出结果估计文件在其中TP-Link firmware header, firmware version: 0.0.3, image version: "", product ID: 0x0, product version: 155254791, kernel load address: 0x0, kernel entry point: 0x80002000, kernel offset: 3932160, kernel length: 512, rootfs offset: 772784, rootfs length: 1048576, bootloader offset: 2883584, bootloader length: 0
-
squashfs
文件的MISC
解squashfs
是以linux 内核源码补丁的形式发布,附带mksquashfs工具,用于创建squash文件系统。squashfs可以将整个文件系统或者某个单一的目录压缩在一起, 存放在某个设备, 某个分区或者普通的文件中. 如果你将其压缩到一个设备中, 那么你可以将其直接mount起来使用; 而如果它仅仅是个文件,你可以将其当为一个loopback 设备使用. squashfs文件系统的设计令人欣喜. For archiving purposes, 它可以让你更加灵活的使用, 而且它比.tar.gz文档有更快的响应速度。以下是squash文件系统的特点:
-
数据(data),节点(inode)和目录(directories)都被压缩。
-
保存了全部的32位UID/GIDS和文件的创建时间. (注: cramfs是8位,没有创建时间)。
-
支持多达4G的文件系统. (cramfs是16M)。
-
节点和目录都是高度压缩, 而且都是存储在字节边界(packed on byte boundaries); 所有压缩的节点长度平均在8个字节左右.(具体的长度根据文件的类型是不同的. 比如, 普通文件,目录,符号链接,块设备和字符设备的节点的大小就不一样)。
-
squashfs
可以允许块大小(block size)达32Kb(1.x)和64kb(2.x), 这样可以达到比4K块大小更大的压缩率。 -
squashfs 2
引进了碎片块(fragment blocks)的概念: 一种将许多比块size 小的文件存储在一个块中, 以达到更大的压缩率。 -
重复的文件会被检测并删除掉。
-
同时支持big和little endian架构. SQ可以将文件系统MOUNT到不同的字节顺序(byte-order)的机器上面。
需要firmware-mod-kit工具来进行解压:
apt-get install firmware-mod-kit
然后找到
unsquashfs_all.sh
文件准备解压脚本:find / -name unsquashfs_all.sh
找到文件并执行
/opt/firmware-mod-kit/trunk/unsquashfs_all.sh /root/Desktop/_51475f91-7b90-41dd-81a3-8b82df4f29d0.bin.extracted/120200.squashfs
之后查看解压的文件目录,找到
\tmp\backdoor
-
-
逆向
backdoor
据exeinfope
分析发现有upx
壳,简单脱壳:upx -d backdoor
IDA打开之后查找字符串试一试:
估计而言此即为目标服务器的位置,即flag的第一部分为
echo.byethost51.com
之后再找端口。
据main
函数的for ( i = signal(13, (__sighandler_t)1); ; i = (__sighandler_t)puts("Link closed by server.") ) { while ( initConnection(i) ) {
查询第一个可疑函数
initConnection(i)
:根据其中的逻辑过程
v3 = 36667; if ( strchr(s, ':') ) { v0 = strchr(s, ':'); v3 = atoi(v0 + 1); *strchr(s, ':') = 0; }
代表这里对字符串
s
进行了查找,找到“:
”符号之后就将其后面的数字赋给v3
。按照计算机网络常识,这里的v3
是端口号。而这里是if触发,也就是仅当指定端口号时更改,因此默认端口号为36667
-
凑出flag并且进行md5计算得:
md5(echo.byethost51.com:36667) = 33a422c45d551ac6e4756f59812a954b
flag{33a422c45d551ac6e4756f59812a954b}
作者发布、转载的任何文章中所涉及的技术、思路、工具仅供以安全目的的学习交流,并严格遵守《中华人民共和国网络安全法》、《中华人民共和国数据安全法》等网络安全法律法规。
任何人不得将技术用于非法用途、盈利用途。否则作者不对未许可的用途承担任何后果。
本文遵守CC BY-NC-SA 3.0协议,您可以在任何媒介以任何形式复制、发行本作品,或者修改、转换或以本作品为基础进行创作
您必须给出适当的署名,提供指向本文的链接,同时标明是否(对原文)作了修改。您可以用任何合理的方式来署名,但是不得以任何方式暗示作者为您或您的使用背书。
同时,本文不得用于商业目的。混合、转换、基于本作品进行创作,必须基于同一协议(CC BY-NC-SA 3.0)分发。
如有问题, 可发送邮件咨询.