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.固件寻找
网上,官网啥的,或者硬件提取,反正到时候再看一遍把,服务器,吾爱破解…
观察以下