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}