大华固件模拟

用grep搜httpd的方式找到web服务启动脚本,为sonia,arm架构,小端可执行文件

image-20211114170159417

qemu用户模式去启动,发现报错,卡在了PDI_productGetHwidInfoByChip函数

qemu-arm -L . ./bin/sonia

image-20211114170325784

grep搜一下这个函数,发现此函数是在lib目录下名为libpdi.so的动态链接库文件中

image-20211114170523467

把这个动态链接库反汇编然后查看这个PDI_productGetHwidInfoByChip函数,发现是存在一个死循环,推测我们是进入了这个循环所导致的

image-20211114170856013

一开始我单独的去把while的死循环给patch掉了,可以管一时之用,但后面紧接着又报错很多其他类似上述死循环的函数,而且不太好改,推测它处于一个大范围的硬件函数中,因此我们这里可以查看谁调用了PDI_productGetHwidInfoByChip函数(但目前来说很多不太好确定是谁)或者把这个函数直接返回0(采用这种方式)

把PDI_productGetHwidInfoByChip函数patch为:

1
2
MOV.W R0, #0				
BX LR

上面的两段汇编相当于return 0,改完后PDI_productGetHwidInfoByChip函数是这样的,直接返回0了

image-20211114171554787

改完后输出了很多的信息,但是在PDI_getChipInfo处卡住了

image-20211114171819893

同样先grep,发现这个函数同样是在这个libpdi.so动态链接库中的,反汇编发现也是卡在了一个while(1)的死循环地方

image-20211114171959990

查看它的调用,还是太多了,因此继续改,不过跟上面有点区别

修改内容:

1
2
CBZ R0, loc_78C1C 修改为了B loc_78C1C
MOV.W R0, #0xFFFFFFFF 修改为了MOV.W R0, #0

image-20211114172443175

改完后反汇编ok

image-20211114172334752

输出的信息又多了一倍,卡在了函数PDI_productGetInfo处

image-20211114172553762

又是这种死循环,出错函数是PDI_productGetInfo

image-20211114172911172

因为函数开头又很多寄存器,其实也可以直接覆盖用我们自己的return 0汇编指令,但最好还是间接,对arm不熟悉还是拿个中间跳板吧

image-20211114173152700

修改如下

CBZ R0, loc_78F74 ——>B loc_78F74

MOV.W R0, #0xFFFFFFFF —> MOV.W R0, #0

image-20211114173952907

image-20211114173940671

又卡住了,并且输出了上一次改动的地方旁边的信息

image-20211114174159009

卡住的函数为PDI_productGetName,调用成功应该返回0

image-20211114174319545

同理修改

image-20211114174645437

image-20211114174657173

提示段错误

image-20211114174751221

查看有哪些调用了PDI_productGetName函数,发现挺多的,随便点进去几个看看

image-20211114180035418

在PDI_getFaceboardCfg函数里发现原因就是调用PDI_productGetName函数时传进来的参数(作为PDI设备名字的)为空或者非法值导致的崩溃,返回值并没有错应该是0

这个函数可以发现,下面如”SD6C80FA-GNX”、”SD6C82FA-GNX”等为合法的设备名字,如果我们在调用设备的时候给参数赋值为前面合法的值就好啦

image-20211114175833570

同理其他调用者也可能会出现上述错误

image-20211114180356461

在上述libpdi.so几个函数中依然没有找到是谁调用PDI_productGetName函数时产生的错误,因为我搜索最近的输出的信息的字符串并没有,因此推测可能是其他二进制文件调用了此函数产生的报错!去看看,grep找一下是谁,

因此我们换一种角度,可能是别的二进制文件调用了此动态链接库的PDI_productGetName函数,因此去grep一下字符串”Video Server - (C) 2011-2013 ZheJiang Dahua Technology“果然有个sonia

image-20211114181559702

找到这段字符串的地址,进去看看调用它的函数

image-20211114181836068

函数sub_9BBA09就是输出蓝绿色字符串信息的函数了,但是它下面并没有调用出错的函数,查看调用它的函数只有sub_9BBAA2调用过它两次

image-20211114181906342

总启动函数:sub_3B2F8

image-20211114191306016

将出错的函数NOP掉直接乱了,似乎这样并不可取

image-20211114191405670

但是这样能运行,只不过好像又卡了一个死循环,但这个死循环还没找到是在动态链接库libpdi.so的哪个地方

image-20211114191515211

后续仍在研究中