固件下载地址:

GitHub - ameng929/NOE77101_Firmware

文件目录结构,这里只列出了一些主要的文件信息:

├── bin
├── ftp
├── fw
├── rdt
├── webloader.ini
└── wwwroot
├── SchneiderTFE.zip
├── cgi-bin
├── classes
├── conf
│   ├── Gcnftcop.sys
│   ├── bootp
│   ├── dhcp
│   ├── diag
│   │   └── chkdsk.out
│   ├── exec
│   │   ├── NOE77101.bin
│   │   └── kerVer
│   ...
├── html
│   ├── config.js
│   ...
├── rdt
│   └── rdt.zip
└── secure

注意到 wwwroot/conf/exec 目录下有一个文件 NOE77101.bin ,这就是要分析的固件文件。使用binwalk命令查看文件内容,是一个Zlib类型的压缩文件:

➜  exec binwalk NOE77101.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
901 0x385 Zlib compressed data, default compression

binwalk提取文件内容,binwalk会自动解压文件,得到文件夹 _NOE77101.bin.extracted

➜  exec binwalk -e NOE77101.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
901 0x385 Zlib compressed data, default compression ➜ exec ls
NOE77101.bin _NOE77101.bin.extracted kerVer

binwalk自动提取了文件到_NOE77101.bin.extracted目录下,并对其进行解压。此时文件夹下就有两个文件,一个zlib和一个被解压出来的:

➜  _NOE77101.bin.extracted ls
385 385.zlib

然后再用binwalk查看385文件:

➜  _NOE77101.bin.extracted binwalk 385

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
2054252 0x1F586C EST flat binary
2088936 0x1FDFE8 HTML document header
2108532 0x202C74 HTML document footer
2110048 0x203260 HTML document header
2115564 0x2047EC HTML document footer
2119528 0x205768 XML document, version: "1.0"
2119796 0x205874 XML document, version: "1.0"
2119912 0x2058E8 XML document, version: "1.0"
2192512 0x217480 Base64 standard index table
2192580 0x2174C4 Base64 standard index table
2211604 0x21BF14 VxWorks WIND kernel version "2.5"
2225264 0x21F470 Copyright string: "Copyright Wind River Systems, Inc., 1984-2000"
2321952 0x236E20 Copyright string: "copyright_wind_river"
3118988 0x2F978C Copyright string: "Copyright, Real-Time Innovations, Inc., 1991. All rights reserved."
3126628 0x2FB564 Copyright string: "Copyright 1984-1996 Wind River Systems, Inc."
3153524 0x301E74 VxWorks symbol table, big endian, first entry: [type: function, code address: 0x1FF058, symbol address: 0x27655C]

得知文件是VxWorks固件,符号表位置在0x301E74处,稍后会用到。

然后使用binwalk查看架构,得知是PowerPC big endian:

➜  _NOE77101.bin.extracted binwalk -A 385
....
2045960 0x1F3808 PowerPC big endian instructions, function epilogue
2045968 0x1F3810 PowerPC big endian instructions, function prologue
2046180 0x1F38E4 PowerPC big endian instructions, function epilogue
3150948 0x301464 PowerPC big endian instructions, function epilogue

之后用IDA打开385文件,在打开时设置架构:

然后要求设置RAM和ROM,其实就是设置加载基地址:

在IDA中无法识别出任何函数,需要在程序开头位置按一下 “c” 键,就可以显示部分函数,但没有解析出所有的函数:

此时可以通过三种方式获得加载基地址:

  • 通过跳转表获得基地址、通过字符串引用获得基地址

固件安全之加载地址分析 – 绿盟科技技术博客

  • 使用IDA的Vxhunter插件

vxhunter/firmware_tools at master · PAGalaxyLab/vxhunter

这里为了方便选择Vxhunter插件,选择python版本下载后复制到plugin文件夹下,然后运行插件:

得到加载地址是0x10000:

然后发现依然没有解析函数,此时需要恢复函数名称。使用IDA脚本:

#coding=utf-8
from idaapi import *
from idc import * symbol_interval = 16 #符号表间隔
load_address = 0x10000 #固件内存加载基址
symbol_table_start = 0x31eec4 + load_address #符号表起始地址
symbol_table_end = 0x348114 + load_address #符号表结束地址
ea = symbol_table_start
eaEnd = symbol_table_end while ea < eaEnd:
offset = 0 #4个字节为一组数据
#将函数名指针位置的数据转换为字符串
create_strlit(get_wide_dword(ea-offset), BADADDR)
#将函数名赋值给变量sName
sName = get_strlit_contents(get_wide_dword(ea))
print(sName)
if sName:
#开始修复函数名
eaFunc = get_wide_dword(ea - offset +4)
set_name(eaFunc, sName)
create_insn(eaFunc)
ida_funcs.add_func(eaFunc, BADADDR)
ea += symbol_interval

代码中的符号表起始地址和符号表结束地址需要手动修改一下,可以在16进制编辑器中查看。在binwalk分析的时候得到符号表地址为0x301E74,然后在文件中找到这个位置,0x301E74即起始位置:

符号表每0x10为一组,一直找到结束的位置0x3293a4:

然后执行IDA脚本:

最后恢复完成:

usrAppInit函数中发现多处loginUserAdd添加用户,这些字符串即后门账号和密码:

总结

此固件分析关键点在于确定程序基地址和如何恢复符号信息,只要恢复了符号信息就和阅读源码无异了。

References

固件符号表恢复

https://bbs.pediy.com/thread-266803-1.htm

固件安全之加载地址分析 – 绿盟科技技术博客

施耐德PLC以太网模块后门账户解密 – 灯塔实验室

https://p1kk.github.io/2021/06/11/iot/施耐德 NOE771/

施耐德NOE77101后门漏洞分析的更多相关文章

  1. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  2. CVE-2018-7600 Drupal核心远程代码执行漏洞分析

    0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...

  3. linux漏洞分析入门笔记-bypass_PIE

    ubuntu 16.04 IDA 7.0 docker 0x00:漏洞分析 1.ASLR的是操作系统的功能选项,作用于executable(ELF)装入内存运行时,因而只能随机化stack.heap. ...

  4. PhpStudy2018后门漏洞预警及漏洞复现&检测和执行POC脚本

    PhpStudy2018后门漏洞预警及漏洞复现&检测和执行POC脚本 phpstudy介绍 Phpstudy是国内的一款免费的PHP调试环境的程序集成包,其通过集成Apache.PHP.MyS ...

  5. 3 CVE-2017-11882漏洞分析

    CVE-2017-11882漏洞分析 操作系统:Windows7 32/64位 专业版.Linux 软件:office 2003 sp3 工具:OD.IDA.Python模块.msfconsole 1 ...

  6. 威胁快报|Bulehero挖矿蠕虫升级,PhpStudy后门漏洞加入武器库

    概述 近日,阿里云安全团队监控到Bulehero挖矿蠕虫进行了版本升级,蠕虫升级后开始利用最新出现的PHPStudy后门漏洞作为新的攻击方式对Windows主机进行攻击,攻击成功后会下载门罗币挖矿程序 ...

  7. [javaweb]strut2-001漏洞分析

    Strut2-001 漏洞描述 框架解析JSP页面标签时会对用户输入的Value值获取,在获取对应的Value值中递归解析%{.}造成了二次解析,最终触发表达式注入漏洞,执行任意代码 影响版本 2.0 ...

  8. Zabbix 漏洞分析

    之前看到Zabbix 出现SQL注入漏洞,自己来尝试分析. PS:我没找到3.0.3版本的 Zabbix ,暂用的是zabbix 2.2.0版本,如果有问题,请大牛指点. 0x00 Zabbix简介 ...

  9. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

随机推荐

  1. 一个小程序:Instrumentation的使用

    本来是想练习Matrix的,没想到写了一个自定义View,监听它的ASWD键后,不知道该如何按下ASWD(手机上一般都没实体按键了).于是: 一个自定义View: public class MyVie ...

  2. [javaweb]strut2-001漏洞分析

    Strut2-001 漏洞描述 框架解析JSP页面标签时会对用户输入的Value值获取,在获取对应的Value值中递归解析%{.}造成了二次解析,最终触发表达式注入漏洞,执行任意代码 影响版本 2.0 ...

  3. 【笔记】对golang的大量小对象的管理真的是无语了……

    业务中有这样一个struct: type bizData struct{ A uint64 B uint64 C int32 D uint32 } 虽然没有实测,但我猜测这样的对齐方式,这个struc ...

  4. MySql服务器逻辑架构

    一.MySql服务器逻辑架构图         每个虚线框都是一层: 第一层:最上层的服务器不是MySql所独有的,大多数基于网络的客户端/服务器工具或者服务都有类似的系统.比如链接处理,授权认证,安 ...

  5. golang中for循环的常用用法

    package main import "fmt" func main() { //printFormula() // 打印九九乘法表 //printLeftTriangle() ...

  6. 多线程-守护线程-setDaemon

    1 package multithread4; 2 /* 3 * 停止线程: 4 * 1,stop方法. 5 * 6 * 2,run方法结束. 7 * 8 * 怎么控制线程的任务结束呢? 9 * 任务 ...

  7. zabbix表达式

    system.cpu.load[all,avg1].min(10)}>2 load连续10分钟>2 system.cpu.load[percpu,avg1].count(#3,0.6,&q ...

  8. 带你十天轻松搞定 Go 微服务系列(三)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务(本文) 产品服务 订单服务 支付服务 RPC 服务 Auth ...

  9. cobbler最小化安装centos8

    centos8 已经发布了GA版本,迫不及待的想尝鲜了,然后现实总是那么残酷,一直安装失败,具体安装步骤如下: 假设cobbler已配置完成. 1.下载centos8 iso镜像 wget http: ...

  10. HowToDoInJava 其它教程 2 · 翻译完毕

    原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 JMS 教程 JMS 教 ...