[BUUCTF]firmware - squashfs固件的基本逆向

原题地址 BUUCTF在线评测 (buuoj.cn)

flag{33a422c45d551ac6e4756f59812a954b}

  1. 首先遇到的不是一个常规的逆向文件,使用file进行判断
    image

    然后使用binwalk查看

    binwalk -e 51475f91-7b90-41dd-81a3-8b82df4f29d0.bin
    

    image

    解压生成的文件得到了以下文件:

    image

    根据.squashfsbinwalk的输出结果估计文件在其中

    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
    
  2. 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)的机器上面。

    squashfs文件系统 - yooooooo - 博客园 (cnblogs.com)

    需要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
    

    image

    之后查看解压的文件目录,找到\tmp\backdoor

  3. 逆向backdoor
    exeinfope分析发现有upx壳,简单脱壳:

    upx -d backdoor
    

    image

    IDA打开之后查找字符串试一试:

    image

    估计而言此即为目标服务器的位置,即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

  4. 凑出flag并且进行md5计算得:

    md5(echo.byethost51.com:36667) = 33a422c45d551ac6e4756f59812a954b
    flag{33a422c45d551ac6e4756f59812a954b}

posted @ 2021-10-01 18:29  二氢茉莉酮酸甲酯  阅读(879)  评论(0编辑  收藏  举报