2021HWS固件学习
一、练习题
1.SMT32固件
(1)IDA分析
①选择架构
需要在加载界面选择架构,如图选择ARM小端序

②设置选项
处理器选项设置对应

③选择固件加载地址
OK之后,进入填写加载地址的界面,修改如下

这个对于SMT32这种类型的固件是一定的,需要自己去上网查询,Input file的loading address可以让我们输入其他值,就使得IDA不从头加载,而从我们输入的地址开始加载。
④寻找函数地址
A.查找中断处理函数
在最开头地址+4的地方保存的是中断处理函数,按d转换数据双击点进去即可

B.识别函数
发现是奇数地址,那么在奇数地址-1的地方,按c,即可分析出一些函数

其中0x08000100即为中断处理函数,相对于SMT32固件而言,该函数的第二次跳转地址上的首次跳转的最后跳转再跳转即为main函数地址





(2)解密

分析之后,即可找到对应的加密算法,按照上述逻辑恢复即可
1 | a = [ |
2.BlinkBlink_200
参考:HWS2021冬令营选拔赛 | Clang鱼塘 (blingblingxuanxuan.github.io)
(1)固件解包
1 | binwalk -Me uImage |
(2)当前目录搜索
该命令可在当前文件夹下搜索密码,一般这种路由器的密码都是从/etc/passwd中取得
1 | grep -ri "etc/passwd" |

排除busybox和libc,那么先去goahead中找,直接拖进IDA32分析
goahead是一个嵌入式的Web服务器:https://www.embedthis.com/goahead/
①定位字符串
搜索字符串set_qos_cfg,这个常用,找到如下

漏洞常常在goform接口下,简单查看一下,发现其中有一个set_cmd的引用

进入函数,发现一个设置命令的函数bs_SetCmd

②分析函数
参照上面的函数名称,继续搜索

发现定位在libshare中,打开分析一下

其中off_4F2CC的值为%s,即格式化为字符串输出给v21,那么很明显就是使用popen进行命令执行

③URL访问
1 | /goform/set_cmd?cmd=cat /home/goahead/flag.txt |
这里就是调用goform的接口API进行测试即可获得flag
3.httpd
不太会
4.nodemcu
直接出
1 | strings nodemcu.bin |

看来以后都先strings一把梭试试
5.easybios
(1)前置探索
按照命令提示启动,但是有时候可以,有时候又不可以,可能在等一下就可以?
给了提示

尝试一下

(2)IDA分析
使用binwalk解包
1 | binwalk -Me easybios |
然后IDA打开解包出来的二进制文件

搜索一下Wrong字符串,没搜到,尝试用unicode格式搜索,即UTF-16LE格式,一个字符两个字节。

然后加上00即可->57 00 72 00 6F 00 6E 00 67 00,找到两个



很明显应该是下面那个,但是这个文件有点大,不好解析,再加上之前在解包的时候看到包含很多PE文件,所以这个程序应该也是在一个PE文件里,那么我们依据地址,找到对应的PE文件头尾

(3)切割分析
①寻找头尾地址
依据地址找到以下头尾

②使用Winhex进行切割
使用Winhex打开,然后找到头尾,使用alt+G搜索地址,选定头尾

头部

尾部

选中选快,右键编辑->复制选块->至新文件,然后保存用IDA打开,照常使用全局搜索字符57 00 72 00 6F 00 6E 00 67 00找到对应的函数sub_31D6F,一番判断如下:

然后顺着逻辑理清楚即可,或者尝试使用angr解题,以下exp参照lxonz师傅
2021HWS冬令营线上赛固件安全WriteUp|NOSEC安全讯息平台 - 白帽汇安全研究院
1 | def print_bytes_hex(data): |
6.PPPPPPC
(1)调试
powerpc大端架构
调试发现栈溢出,读入0x320,并且变量偏移在0x140,可覆盖$lr寄存器,控制程序流,保护都没开,就尝试ret2shellcode

(2)泄露地址
使用题目给的qemu-ppc-static来运行会使得程序打印所有寄存器的值,远程也是这样的

参照如下

远程肯定也是qemu,地址不会改变,那么就可以获得栈地址,同时依据调试数据也能得到我们输入数据的相应的偏移
(3)寻找shellcode
直接去shell-storm | Shellcodes Database找对应的shellcode
1 | "\x7c\x3f\x0b\x78" /*mr r31,r1*/ |
对应偏移找到即可

覆盖LR寄存器为该地址完事
7.easymsg
没看懂
二、知识点
1.固件解包
(1)binwalk
常用的命令
1 | binwalk -Me xxx.bin #解包 |
有时候可以用mount挂载binwalk打不开的固件
1 | mount ./rootfs.img test |
2.固件加解密
(1)判断加密
有时候固件可能会被加密,可用binwalk的熵计算来判断,压缩或者加密的数据具有较高的熵值
1 | binwalk -E xxx.bin |
未加密的

加密的

(2)解密常见方法
逆向,自己寻找等等
3.固件寻找
网上,官网啥的,或者硬件提取,反正到时候再看一遍把,服务器,吾爱破解…
观察以下
