NOE77101固件后门漏洞分析

摘要:
NOE77101固件后门漏洞分析固件获取最近学习vxworks固件的分析,尝试对noe77101固件的经典后门漏洞进行分析,就好比学习msf时练习经典的ms08-067一样。noe77101固件的下载地址在此。使用binwalk对.bin文件进行分析,binwalkNOE77101.bin,结果如图所示使用binwalk提取NOE77101.bin中的文件,binwalk-eNOE77101.bin,得到217和217.zlib两个文件。后门漏洞分析查找后门漏洞的一个入手点就是寻找与用户相关的函数的调用情况,注意到函数loginUserAdd。
NOE77101固件后门漏洞分析

固件获取

最近学习vxworks固件的分析,尝试对noe77101固件的经典后门漏洞进行分析,就好比学习msf时练习经典的ms08-067一样。noe77101固件的下载地址在此。

拿到固件之后,unzip noe77101_OS.bin_.zip解压固件,得到FLASH0文件夹和一个commandList.lst文件,FLASH0的文件目录如下:tree

flash0/wwwroot/conf/exec/目录下找到了NOE77101.bin文件,这应该就是我们要分析的目标了。

使用binwalk对.bin文件进行分析,binwalk NOE77101.bin,结果如图所示binwalk77101

使用binwalk提取NOE77101.bin中的文件,binwalk -e NOE77101.bin,得到217和217.zlib两个文件。使用binwalk分析217,binwalk 217,分析结果如图,可以看到此固件使用vxworks内核,binwalk还在固件中识别出了符号表。binwalk217

固件分析

现在需要确定固件的cpu架构、大小端格式和固件加载地址,才能使用ida pro进行反汇编。

使用binwalk的-A参数分析217文件,binwalk -A 217,结果如图所示,可知固件使用PowerPC架构,大端格式。(7.24更新:使用binwalk -Y更加方便)binwalka217

接下来还要确定固件的加载地址,vxworks固件的常见加载地址是0x10000,但最好还是验证一下。strings 217搜索固件中的字符串,确定字符串表中的最后一个字符串应该是APP_STASTON_MODBUSstrings217

在010 Editor中搜索字符串APP_STASTON_MODBUS,可知字符串表中的最后一个字符串的地址为0x298BD8。010zifuchuanbiao

又因为字符串表中的最后一个字符串在符号表中第一个被引用,因此需要定位符号表的第一行,找到该字符串在内存中的地址。前文中已经使用binwalk发现符号表的位置,为0x31EED4。但是这个值不一定是准确的,还需要进一步验证。在010 Editor中定位0x31EED4位置附近,发现符号表真正的起始位置是0x31EEC4。fuhaobiaoneicundizhi

确定了APP_STASTON_MODBUS字符串在固件中的位置和在内存中的位置,就可以计算得到固件的加载地址了,确实是0x10000。pythonjisuanjiazaidizhi

函数名修复

现在可以使用ida pro加载217文件了,处理器选择PowerPC big endian(PPC),固件加载地址填写0x10000。ppc217loadaddress217

此时的ida pro并没有识别到函数。(mac版ida此时需要按c转为函数,windows的ida可以识别到少量函数)beforerepair

需要编写脚本修复函数名,但是目前只知道符号表的起始地址,并不知道结束地址。在010 Editor中按照符号表规律往下寻找结束地址,确定是0x348114。fuhaobiaojieshuweizhi

修复脚本repair.py如下:

from idaapi import *
from idc import *

loadaddress = 0x10000
eaStart = 0x31eec4 + loadaddress
eaEnd = 0x348114 + loadaddress

ea = eaStart
eaEnd = eaEnd
while ea < eaEnd:
    create_strlit(Dword(ea), BADADDR)
    sName = get_strlit_contents(Dword(ea))
    print sName
    if sName:
        eaFunc = Dword(ea + 4)
        MakeName(eaFunc, sName)
        MakeCode(eaFunc)
        MakeFunction(eaFunc, BADADDR)
    ea = ea + 16

修复完成之后可以看到,ida pro成功识别到了8873个函数,可以进行进一步的分析了。repaired

后门漏洞分析

查找后门漏洞的一个入手点就是寻找与用户相关的函数的调用情况,注意到函数loginUserAddloginuseradd

查看此函数的交叉引用情况,发现有三个函数对它进行了调用,分别是usrSecurityFTP_USER_ADDusrAppInituserxref1userxref2

分别查看以上三个函数,在usrAppInit中发现疑似添加登录用户的操作。在PowerPC中,lis(立即数载入并左移)和addi(立即数加法)的组合是最常见的赋值操作,ida pro的注释中给出了经过赋值之后的结果。以第一次调用为例,实际上是执行了loginUserAdd(0x22DB7C,0x22DB84),这两个内存地址在固件中的实际地址应是再减去固件的加载地址。userappinit

在010 Editor中定位固件的0x21DB7C(0x22DB7C-0x10000),发现此处的字符串出多次出现“user”字样,由此更加验证了前面的操作是添加多个后门账号。confirm

免责声明:文章转载自《NOE77101固件后门漏洞分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vue一些基本操作技巧phpPgAdmin-5.1安装配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WinDbg符号表设置的基础

  现在正在学windbg,记录一些基本的知识。 每次调试开始都会新开始一个workspace,其实就是跟工程差不多,记录了你这次调试的配置。当然有一个默认workspace,当你没有调试的时候。感觉最重要的就是设置符号表,每次都得弄好,要不然符号看不了的,设置如下.sympath srv*d:\symbols*http://msdl.microsoft....

了解动态链接(五)—— 动态符号表

ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 动态符号表 (.dynsym) 用来保存与动态链接相关的导入导出符号,不包括模块内部的符号。而 .symtab 则保存所有符号,包括 .dynsym 中的符号。 动态符号表中所包含的符号的符号名保存在动态符号字符串表 .dynstr 中。 使用 readelf 查看...

写一个自动解析 ios crash 日志的脚本(python)

符号表是什么 符号表就是指在Xcode项目编译后,在编译生成的二进制文件.app的同级目录下生成的同名的.dSYM文件。 .dSYM文件其实是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,所有Debug的symbols都在这个文件中(包括文件名、函数名、行号等),所以也称之为调试符号信息文件。 一般地,Xcode项目每次编译后,都...

使用模块

11.1 使用模块 模块有两种风格:传统的和面向对象的。传统模块为调用者的输入和使用定义了子过程和 变量。面向对象的模块的 运转类似类声明并且是通过方法调用来访问的,在第十二章, 对象,里描述。有些模块有上面两种类型的东西。 因此 如果你的模块的名字是 Red::Blue::Green,Perl 就会把它看作Red/Blue/Green.pm。...

内核调试和系统调用劫持

如何在不重新编译内核,不rmmod内核模块的情况下修改系统调用 为了解决这个问题,最终实现了两种解决方式: 1.Linux系统调用劫持 2.Kprobes内核调试技术(并非真正的修改)   下面分别说下:   Linux系统调用劫持: 其实就是修改内核符号表,来达到一个劫持的作用。因为系统调用实际上是触发了一个0x80的软中断,然后转到了系统调用处理程序的...

C++编译器符号表有哪些内容?(转帖)

原帖地址:http://blog.csdn.net/abortexit/archive/2007/04/24/1583306.aspx很早就想写一篇关于符号表的学习小结,可是迟迟不能下笔。其一是因为符号表在编译器的设计中占有举足轻重的地位【我们在学习编译原理的时候更多的是注重principles,而没有关心一个编译器的实现,所以符号表讲解的也比较少】,编译...