首页
社区
课程
招聘
X为光猫与威斯汀
2017-2-27 11:40 9751

X为光猫与威斯汀

2017-2-27 11:40
9751


一天,跟几个老哥在一起吃饭的时候吹B,说现在的人技术不咋样,但是心还很大,培训三个月出来就敢要求月薪上W,其中一个哥们接话,他们有个技术问题,卡了2个月还没搞定(我叫他A哥吧),我说“你们P大点的公司,有毛的个技术问题啊,还卡这么长时间。哥给你搞定,到时候吃顿饭就成”。A哥一听来精神了,“对啊,我TM咋把你这尊大神忘记了。这事你要给搞定了,威斯汀一日游”。“成交”

晚上,A哥发来了关于那个技术问题的具体情况-----获取X为光猫(http://b2b.hc360.com/supplyself/621259462.html)光电转换口的速度。NMB,不知道我没有接触过嵌入式相关的啊,这些设备上的事情,我知道个球啊。但是话都说出去了,脸打太快也疼不是。硬着头皮上,看看再说。

整理下思路,如果不能上网,那还有球的个转换速度啊。好,连到光纤上,哈哈,果然不能上网,开森啊。电话A哥,这玩意在我这里不好使啊。Balabala~~,你改几个参数,在XXXXXXX,我发个文档给你VLANLOID? 这TM是啥啊?啥啊?照着做,看看再说。不行我就找个借口开溜。

 

唉,什么意思。居然连上了,我X啊。

 

继续整理思路,进入web管理页面看看,说不定有呢,那就简单了撒。OK,进入web管理,果然让我找到了一个。马上电话A哥,“明天威斯汀?看QQ消息”

 

“这个不对啊,而且有几个问题:1、需要登录才能获取。但事实上每个地区或者每个用户密码可能是不一样的,不能批量进行;2、这个是收发包数量,不是速度啊。哥,再帮忙看看呗,威斯汀在等着你

好像也对。那就看看这个鬼是怎么来的吧。

1.1 通过查看当前页面源代码,发现最终嵌入的页面地址为http://172.16.1.1/html/amp/opticinfo/opticinfo.asp,输入浏览器验证,没问题,通过。

1.2  通过telnet登录光猫。进入光猫shell,如下:

 

用户名root,密码 admin  

 

X,这什么意思?电话A哥,得到还要su,然后shell才能真正进入linuxshell环境。照做,别说话。

 

哥,你是我亲哥。

直接搜索上面的文件名,看看是个什么鬼。

 

第一个就是,看来离威斯汀不远了。

 

经过一番折腾之后,来到这里。

 var PONTxPackets = '<%HW_WEB_GetParaByDomainName(InternetGatewayDevice.WANDevice.1.X_HW_PonInterface.Stats.PacketsReceived);%>';

经人指点,应该是用的goahead的一个定制版本做的web容器。表示的意思是调用函数HW_WEB_GetParaByDomainName,并将InternetGatewayDevice.WANDevice.1.X_HW_PonInterface.Stats.PacketsReceived作为传输传递给刚才的函数。

1.3 那就看看这个web容器的函数实现,先得找到文件啊。

 

2066,错不了。

 

/var/web是个文件夹,无关,不管。/bin/web是个elf文件,应该错不了。Tftp下来看看吧。本地tftp走起。感谢Ph.Jounin

拿到webIDA有请。然并卵啊,web里面没有那函数。威斯汀啊,这TM什么情况啊。

经请教高人得知,应该是其他库提供了这个函数,web进程加载了相应的库,看看依赖的库呢。

 

尼玛,这只是其中一部分啊。硬着头皮一个一个看吧。找啊找,终于在libhw_web_dll.so库中找到HW_WEB_GetParaByDomainName函数。

F5的代码大体如下:

int __fastcall HW_WEB_GetParaByDomainName(int a1, int a2, int a3)
{
  if ( webEjArgs(v3, v4, "%s", &v14) <= 0 )  <-----------格式化参数
  {......  }
  else
  {
    v6 = j_HW_WEB_GetNodeName((int)&s, v14); <----------拆分参数 这里是按照.进行拆分
    if ( v6 ){......  }
    else
    {
      v8 = HW_CFG_InitAttList((int)&v18);          <--------关键函数1
      if ( v8 ) {...... }
      else
      {
        v7 = HW_WEB_GetNodeValue((int)&v18, v14, (int)&v16);   <-------关键函数2
        if ( v7 ){...... }
        else
        {
          v7 = HW_WEB_GetNodeValueByName((int)&v15, (int)&s, (int)&v18);  <---------关键函数3
          if ( v7 ){......}
          else
          {
            v9 = HW_WEB_GetEscapeLength(v15);   <----------编码函数,猜测是获取到数据之后编码为指定的格式
            v10 = HW_OS_MemMallocSet(v9, 0, 10, 1);
......
          }
        }
      }
    }
  }
  return v7;
}



1.4 libhw_smp_web_base.so库中找到函数 HW_WEB_GetNodeValueF5如下

int __fastcall HW_WEB_GetNodeValue(int a1, int a2, int a3)
{
...
      else
      {
        v8 = HW_CFG_GetCmdPro(10, (int)&s, (int)&v16, (int)&v15);  <------------关键函数4
        HW_CFG_FreeAttList(&v15);
        if ( v8 )
          HW_PROC_DBG_LastWord_1("hw_web_productapi.c", 2337, v8);
      }  }  }
  return v8;
}



1.5 libhw_smp_cfg.so库中发现关键函数4---HW_CFG_GetCmdPro F5大概如下

int __fastcall HW_CFG_GetCmdPro_0(int a1, int a2, int a3, int a4, int a5)
{
      HW_OS_MemSet_S((int)&v32);
      v15 = j_HW_CFG_InitAttList((int)&v32);
......
          v12 = j_HW_CFG_CheckParaList(v8, v9, (int)&v32);
......
            v12 = j_HW_CFG_CheckParaList(v8, a5, (int)&v32);
......
              v12 = j_HW_CFG_GetKeyLen(v6, (int)&v30);
......
......
                    v12 = j_HW_CFG_AppendPara2Buffer(v9, &v32, &v33, *(_DWORD *)v6);
......
                          v12 = HW_XML_DBTTreeGetObjAttrValue(v8, v7, 16, v28);
......
                          else if ( j_HW_CFG_GetObjApiCmo(v28, (int)"GetApi", (int)&v31) )
.....
                            v12 = sub_4954(v28);
......
                              v12 = j_HW_CFG_SetRpcMsgHead(v8, v28, (int)&v34);
......
                                j_HW_CFG_SPEC_GetCallWaitTime(0, v23, v24);
                                v25 = HW_MSG_RpcCall((int)&v34, v31, v8, v18);
                                ......
  }
  return v12;
}


这里可以看到,最后走了一个RPC调用。谁提供的RPC服务?我TM哪知道啊。行,第一回合结束。



[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (12)
雪    币: 1487
活跃值: (955)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
仙果 19 2017-2-27 11:47
2
0
然后捏?
雪    币: 300
活跃值: (179)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
飞心男孩 2 2017-2-27 15:01
3
0


好,接着上一篇。

威斯汀没去成,关键是现在脸有点火辣辣的。Linux RPC服务暂时不打算去研究,看看有没有其他的路子。一个正常的脑子设计的系统,通常来说,需要留下一些调试工具,方便需要的时候获取的信息的吧。Wait,我TM在干什么,linux不是有查看网卡吞吐的么,ifconfig啊,我TM是猪,忘记这茬了。

WAP(Dopra Linux) # ifconfig

br0       Link encap:Ethernet  HWaddr 94:DB:DA:62:81:F2  

          inet addr:172.16.1.1  Bcast:172.16.1.255  Mask:255.255.255.0

          inet6 addr: fe80::96db:daff:fe62:81f2/64 Scope:Link

          inet6 addr: fe80::1/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:37743 errors:0 dropped:203 overruns:0 frame:0

          TX packets:32428 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:3690191 (3.5 MiB)  TX bytes:9395626 (8.9 MiB)

 

eth0      Link encap:Ethernet  HWaddr 00:E0:FC:55:55:88  

          inet6 addr: fe80::2e0:fcff:fe55:5588/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:39110 errors:0 dropped:0 overruns:0 frame:0

          TX packets:122600 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:4630428 (4.4 MiB)  TX bytes:11409811 (10.8 MiB)

          Interrupt:119

 

/*中间无关紧要*/

wan1      Link encap:Ethernet  HWaddr 94:DB:DA:62:81:F3  

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:18900 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 B)  TX bytes:604800 (590.6 KiB)

 

wlan0     Link encap:Ethernet  HWaddr 94:DB:DA:62:81:F8  

          inet6 addr: fe80::96db:daff:fe62:81f8/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:41 errors:0 dropped:0 overruns:0 frame:0

          TX packets:51 errors:12 dropped:4717 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:6355 (6.2 KiB)  TX bytes:7905 (7.7 KiB)

          Interrupt:91 Base address:0x8000

从这个来看,只有一个br0是网关的,eth0,不知道是不另外一个口子的,wan1有点像光口的,wlan0,应该是无线网关的。

验证一把,在光纤上插上,下文件,wan1口的RXTX屁都没一个。看来这威斯汀不好进啊。到这里至少证明了我不是猪。

 

看看/bin下面有些什么鬼。看着这一对*.sh,我的脸又不那么痛了。

 

全系统搜索这些shell脚本,MD,那么多,那个是啊,不是让我一个一个测试吧。找了几个命令放到百度上,得到一篇这个文章:http://www.chinadsl.net/thread-122965-1-1.html ,这里可以看到在WAP〉状态的时候,有很多命令可以使用的,我这里直接输入?得到如下结果:

amp add policy-stats pon

amp add policy-stats port

amp add stats gemport

amp clear policy-stats pon

amp clear policy-stats port

amp clear stats gemport

amp del policy-stats pon

amp del policy-stats port

amp del stats gemport

ampcmd show car all

ampcmd show car index

ampcmd show emac stat

ampcmd show flow all

ampcmd show flow index

ampcmd show log

ampcmd show queue all

ampcmd show queue index

ampcmd trace all

ampcmd trace cli

ampcmd trace dpoe

ampcmd trace drv

ampcmd trace emac

ampcmd trace emap

ampcmd trace eth

ampcmd trace gmac

ampcmd trace gmap

ampcmd trace onu

ampcmd trace optic

ampcmd trace qos

backup cfg

bbsp add policy-stats btv

bbsp clear policy-stats btv all

bbsp clear policy-stats wan

bbsp del policy-stats btv

bbspcmd

Broadband debug

Broadband display

chipdebug

chipdebug soc drop

chipdebug soc rx

chipdebug soc tx

clear amp pq-stats

clear file

clear lastword

clear pon statistics

clear poncnt dnstatistic

clear poncnt gemport upstatistic

clear poncnt upstatistic

clear port statistics

collect debug info

component delete all

debug dsp down msg

debug dsp msg

debug dsp up msg

debug ifm

debug qoscfg

debug rtp stack

debug sample mediastar

debugging dsp diagnose

debugging dsp para diagnose

debugging dsp record

debugging dsp t38diag

diagnose

display access mode

display amp policy-stats pon

display amp policy-stats port

display amp pq-stats

display amp stats gemport

display apmChipStatus

display apmpolicy

display batteryStatus

display bbsp stats btv

display bbsp stats wan

display bmsxml crc

display boardItem

display cwmp debug

display debug info dhcp6c

display debug info dhcp6s

display debug info pppoev6

display debug info ra

display deviceInfo

display dhcp_em result

display dsp channel para

display dsp channel running status

display dsp channel status

display dsp chip stat

display dsp codec status

display dsp interrupt stat

display epon ont info

display equip test mode

display equipId

display equiptest status

display ethoam ma info

display ethoam md info

display ethoam mep info

display ethoam mep perf

display file

display filter rf

display flashlock status

display flow

display ftp config status

display inner version

display ip6tables filter

display iptables filter

display iptables mangle

display iptables nat

display iptables raw

display jb grid status

display jb para

display lanmac

display lastword

display log info

display macaddress

display machineItem

display memory info

display msg-queue

display oaml2shell ethvlan

display onu info

display optic

display optmode

display patch information

display pon statistics

display poncnt dnstatistic

display poncnt gemport upstatistic

display poncnt upstatistic

display portstatistics

display pppoe_em result

display productId

display productmac

display progress load

display rf config

display rtp stack channel stat

display rtp stack chip stat

display rtp stack para

display rtp stack version

display simcardstatus

display sn

display startup info

display swm bootstate

display swm state

display sysinfo

display syslog

display telnet access

display timeout

display timer

display usb devList

display vendorId

display version

display voip dsp jbdata

display voip dsp para diagnose state

display voip dsp para diagnose statistics

display voip dsp tonedetect

display wan layer all

display wanmac

display wifi multicast

display wifi pa type

display wifichip

display wlanmac

display zsp version

get battery alarm status

get battery-chip status

get ip conntrack

get mac agingtime

get ont oamfrequency

get opm switch

get optic debug info

get optic par info

get optic phy type

get optic txmode

get poncnt upgemport

get port config

get port isolate

get rogue status

get testself

get wlan advance

get wlan associated

get wlan basic

get wlan enable

get wlan stats

get wlan txpower

get wlan wps

ifconfig

igmp clear statistics

igmp get debug switch

igmp get flow info

igmp get global cfg

igmp get iptv

igmp get multilmac

igmp get port multicast config

igmp get statistics

igmp set debug switch

ip -6 neigh

ip -6 route

ip -6 rule

ip neigh

ip route

ip rule

load pack

logout

maintain mode

make ssh hostkey

mgcp mg-config

mgcp mgc 1

mgcp mgc 2

mid get

mid off

mid set

napt cli

netstat -na

oamcmd clear log

oamcmd debug

oamcmd error log

oamcmd pdt show log

oamcmd show flow

oamcmd show log

omcicmd alarm show

omcicmd clear log

omcicmd debug

omcicmd error log

omcicmd mib show

omcicmd pdt show log

omcicmd pm show

omcicmd show flow

omcicmd show log

omcicmd show qos

ping

qoscfg get

quit

reset

restore manufactory

route get default

save data

save log

set cwmp debug

set ethportmirror

set led

set opticdata

set port isolate

set ringchk

set timeout

set userpasswd

set voicedebug

set voicedsploop

set voicelinetest

set voiceportloop

set voicesignalingprint

setconsole

sntp get

stats clear

stats display

su

test monitor interface

traceroute

undo debugging dsp diagnose

undo debugging dsp para diagnose

undo debugging dsp record

undo debugging dsp t38diag

voice remote diagnose server set

voice remote diagnose set

vspa clear rtp statistics

vspa debug

vspa display conference info

vspa display dsp running info

vspa display dsp state

vspa display mg if state

vspa display mg info

vspa display mgcp config

vspa display online user info

vspa display port status

vspa display rtp statistics

vspa display service log

vspa display signal scene info

vspa display signal scene list

vspa display user call state

vspa display user status

vspa reset

vspa set ptcflag

vspa shutdown mg

wap list

wap ps

wap top

又是一通体力劳动,这玩意看上去就是了: display pon statistics

 

马上验证一下,还真是了,至少看上去各项指标都符合要求了。到了这里。我都在想到底约谁一起去威斯汀了。

剩下的路子就是找到这命令调用的是那个程序或者脚本了。如果我是光猫的架构师,我肯定是找一个单独程序来实现这里面的命令。

第一步,找到当前的shell环境是那个程序在提供服务。Netstat -anp|grep :23 得到这些

 

进一步在在/bin命令下找到ssmpIDA,走起。

Nfwcojehgpi3 qjfwpcnvt3gwhi qpjfi 35nrwi gfpe....TM啥意思?意思就是里面根本没找到有价值的信息,我艹。冷静,一定要冷静。不是这货在干活,那至少也是这货的子进程在干活吧。

 

啊,不要。面对一个被精简的命令。我把ps的进程一个一个的找出来看,总应该有一个能找到吧。

(无情的体力活...

终于在/bin/clid找到点眉目。

 

简直觉得这些字符串亲切啊。F5过去,

 

应该差不多了,现在还没有找到命令行,按照道理,这些是不会直接写到程序中的,如果这样的话,每增加一个命令就要更新一下binX为的设计师又没毛病,理论上会通过一个配置来保存展示的命令及其对应的程序或者脚本,这样的话扩展起来才比较方便嘛。但是这里没看到,bin里也没有明显的线索。尼玛,咋忘记全盘搜索那个命令了。

功夫不负有心人,还真在/etc/wap/hw_cli.xml下面找到一个xml文件,关键如下:

 

这不就是WAP>展示的命令么?没看到那里指定了程序路径或者sh脚本啊?看看这目录下还有些什么鬼。经过一通筛选,得到一些xml如下:

 

hw_shell_cli.xml 文件看看再说:

 

这什么玩意啊,百度 搜索 华为光猫配置破解,找到一篇文章如下,按照里面的步骤操作,成功解密。 Flashcloud.iteye.com/blog/2059189

内容不多,如下:

WAP(Dopra Linux) # cat hw_shell_cli.xml
<CliRoot>
<Restorehwmode CmdStr="restorehwmode.sh" ObjPath="restorehwmode.sh" OpType="0" Help="" CmdGroup="0x00000010">
</Restorehwmode>
<GetCustomInfo CmdStr="getcustominfo.sh" ObjPath="getcustominfo.sh" OpType="1" Help="" CmdGroup="0x00000010">
</GetCustomInfo>
<ExitShell CmdStr="exit" ObjPath="exit.sh" OpType="0" Help="" CmdGroup="0x00000010">
</ExitShell>
</CliRoot>



我艹,支持的命令确实有sh的,不过也太TM少了。继续解密hw_diag_cli.xml,也得到类似上面的,我需要却不在这几个文件中,日狗了。

<AmpShowStatTx CmdStr="chipdebug soc tx" ObjPath="ampcmdStatTx.sh" OpType="1" Help="[Usage]:chipdebug soc tx" CmdGroup="0x00004000"/>
<AmpShowStatRx CmdStr="chipdebug soc rx" ObjPath="ampcmdStatRx.sh" OpType="1" Help="[Usage]:chipdebug soc rx" CmdGroup="0x00004000"/>
<AmpShowStatDrop CmdStr="chipdebug soc drop" ObjPath="ampcmdStatDrop.sh" OpType="1" Help="[Usage]:chipdebug soc drop" CmdGroup="0x00004000"/>


第二回合,休息一下。


雪    币: 300
活跃值: (179)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
飞心男孩 2 2017-2-27 16:06
4
0


()

到这里,就很明显。老老实实回去分析clid吧。可能有的兄弟会说,将最开始的asp文件里的字符串替换不就可以了。恩,我其实也这么想过,奈何这些目录都是(/tmp/var/mnt除外)只读的,根本写不进去啊。

这里就重点说说对clid的分析。经过很长时间(20小时以上吧)的折腾,发现关键函数HW_CFG_SetCmdMainPro(别问怎么是他,如果你把所有的函数看一遍,自然知道这玩意最像),附近代码如下

 

注意红框的地方,我X,是不是和前面的有点很像:

 

继续回溯调用,

int __fastcall HW_CLI_ExecCmd(int a1, int a2, int a3)
{
......
  switch ( *(_DWORD *)(v11 + 12) )
  {
    case 0:
      v6 = doExecCmd(v3, v10, v11, 0);  <----这里内部调用了 HW_CFG_SetCmdMainPro
      goto LABEL_26;
    case 1:
 ......
      return v6;
    case 2:
 ...
    case 3:
 .....
    case 4:
      goto LABEL_24;
    case 5:
      v6 = doExecCmd(v3, v10, v11, 5);<----这里内部调用了 HW_CFG_SetCmdMainPro
      goto LABEL_26;
    default:
      v6 = -148889550;
      goto LABEL_27;
  }
}


这不就是配置当中出现OpType=012345么。继续回溯,得到对HW_CLI_ExecCmd2个调用。

 

一个一个来,将Down p HW_CLI_AnalExecCmd+64 BL              HW_CLI_ExecCmd 定为分支1Down p HW_CLI_DiaCollectionAnalExecCmd+98 BL              HW_CLI_ExecCmd定为分支2

分支1

signed int __fastcall HW_CLI_AnalExecCmd(int a1, int a2)
{
...
  v5 = HW_CLI_ExecCmd(v2, v3, 12288);
  v6 = HW_CLI_AsynCmdCheck(v2, v5);
...
}



回溯一层:

int __fastcall sub_133E8(int a1)
{
......
      v8 = HW_OS_StrLen("Welcome Visiting Huawei Home Gateway\r\nCopyright by Huawei Technologies Co., Ltd.");
      HW_CLI_OutString(v7, "Welcome Visiting Huawei Home Gateway\r\nCopyright by Huawei Technologies Co., Ltd.", v8);
...
      result = HW_CLI_VerifyUser(v1);
...
      if ( HW_CLI_CheckAftLogin(v1) )
      {
        HW_CLI_GetUserLoginIP(v1, &v41);
        return HW_LOG_ConfigLogRec(34620695, v39, &v41);
      }
      if ( unk_2A3F0 >= v40 || HW_Feature_IsSupport(397) != 1 )
        goto LABEL_11;
...
LABEL_12:
...
      while ( 1 )
      {
        while ( !(g_uiCliExitFlag & 0x10000000) )
        {
          HW_OS_Sleep(v19);
          v19 = *(_DWORD *)(v1 + 216);
          v20 = v1;
          if ( v19 != 1 )
            goto LABEL_23;
        }
        *(_DWORD *)(v1 + 208) = v19;
        v21 = HW_CLI_RecvDataFromClient(v20);
        v22 = v19;
        v23 = v21;
 
        HW_CLI_EditRecvData(v1, v22);
        v24 = HW_CLI_AnalExecCmd(v1, v3);  <-------完成具体功能调用
        if ( v24 )
        {
......
        }
        HW_OS_MemSet_S(v3);
      }
 
  return HW_PROC_DBG_LastWord_1("hw_cli_init.c", 2632, -148889598);
}


这里有几个意思:

1、在这里展示了telnet的时候登录的提示

2、进行了登录时候用户、密码校验

3、通过一个while大循环,在这里完成与用户的交互。

所以分支1就是,登录--->输入命令,进入HW_CLI_AnalExecCmd------->调用HW_CLI_ExecCmd------>调用doExecCmd----->调用HW_CFG_SetCmdMainPro ------>调用其他模块里的函数,得到返回。

然而,没卵用,还是啥都不能干。

 

继续看分支2

F5如下:

signed int __fastcall HW_CLI_DiaCollectionAnalExecCmd(int a1, int a2, int a3)
{
......
      v10 = HW_CLI_ExecCmd(v4, v5, v6);
      HW_PROC_DBG_LastWord_1("hw_cli_exec.c", 3354, v10);
      if ( v10 )
      {
  //失败之后获取失败原因,写入 /var/diacollectresult
        if ( HW_CLI_GetErrInfo(v10, &v11, &v12) )
          HW_OS_Snprintf_S(v5);
        else
          HW_OS_Snprintf_S(v5);
        HW_CLI_WriteStrToFile("/var/diacollectresult", v5);
      }
      else
      {
  //成功之后,将"success!"写入 /var/diacollectresult
        HW_CLI_WriteStrToFile("/var/diacollectresult", "success!");
      }
......
  return result;
}


回溯一层,F5如下

int HW_CLI_FaultInfoOneKeyCollectionRoutine()
{
 
    while ( 1 )
    {
//打开一个pty
      while ( HW_CLI_OpenPty(v9 + 12, v9 + 16) )
        ;
//将打开的名字写入到/var/diacollectNaNs
      HW_CLI_WriteStrToFile("/var/diacollectNaNs", v9 + 16);
      v4 = v9;
      if ( v9 )
      {
        v5 = HW_OS_MemMallocD(12288, 1688, 11, 1);
        if ( v5 )
        {
          *(_DWORD *)(v4 + 1780) = HW_OS_Time(0);
          while ( 1 )
          {
  //获取输入的命令?
   v6 = HW_CLI_RecvDataFromClient(v4);
......
//传递给 HW_CLI_DiaCollectionAnalExecCmd执行
            v6 = HW_CLI_DiaCollectionAnalExecCmd(v4, v5, 12288);
            if ( v6 )
              break;
            HW_OS_MemSet_S(v5);
          }
        }
      }
    }
 
  return v1;
}


意思是这玩意会打开一个pty,然后将输入pty的内容当作命令来执行,,如果成功了,那么就将"success!"写入 /var/diacollectresult,如果失败了,就把失败的原因写入 /var/diacollectresult

验证一下。

 

意思是写入/dev/pts/2里的会被当作命令来执行。随便写点看看

 

 

注意看这2个输出的差别,一个说命令不存在,一个说命令不正确。不存在好理解,我们随便输入的,这个不正确就坑爹,难道是参数不正确,这TM也没提示要参数啊,结合到前面的一个\r\n,猜测会不是要去掉换行符或者换行符不对啊。那写个程序来写入吧。

这个借助NDK直接来,不详细说了。

#include <stdio.h>
#include <stdlib.h>
main()
{
FILE *fp1;
char *name = "display pon statistics";
if((fp1=fopen("/dev/pts/2","wb"))==NULL)
{
printf("不能打开文件");
exit(0);
}
printf("/dev/pts/2打开成功\n");
fwrite(name,strlen(name),1,fp1);
fclose(fp1);
}


静态链接之后,放上去,命令成功执行,至少result里出现了success

 

然而没毛用。结果部分看不到啊。猜想这个接口应该用来执行osgi或者是itms下发的命令的吧。

 

到这里,分支1、分支2光荣阵亡.往上是不行了,往下试试吧。


雪    币: 300
活跃值: (179)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
飞心男孩 2 2017-2-27 17:10
5
0

(四)

往下,看看 HW_CFG_SetCmdMainPro 的实现,在libhw_smp_cfg.so库中找到HW_CFG_SetCmdMainPro的实现,大体如下:

signed int __fastcall HW_CFG_SetCmdMainPro(int a1, unsigned int a2, int a3, int a4, int a5, int a6, int a7, int a8)
{
  v15 = j_HW_CFG_InitAttList((int)&v45);
  v41 = j_HW_CFG_GetObjAttList(v9, v8, (int)&v45, (int)&v42);
  v41 = j_HW_CFG_AddSetCmdCheckParaList(v9, a5, &v45);
  v41 = j_HW_CFG_GetKeyLen(v11, (int)&v43);
  v41 = j_HW_CFG_AppendKey2Buffer(v11, &v48, v40, 0);
  v41 = j_HW_CFG_AppendPara2Buffer(a5, &v45, &v48, *(_DWORD *)v11);
  j_HW_CFG_InitOuputErrInfo(v38, v8, &v45, 16);
  v41 = HW_XML_DBTTreeGetObjAttrValue(v9, v8, 16, v37);
  if ( j_HW_CFG_GetObjApiCmo(v37, (int)"SetApi", (int)&v44) )
  {......  }
  v41 = j_HW_CFG_SetRpcMsgHead(v9, v37, (int)&v49);
  v41 = j_HW_CFG_ConfigSetType(v40, v20, v10);
  j_HW_CFG_SPEC_GetCallWaitTime(0, v29, v30);
  v31 = j_HW_CFG_GetCTreePath(v9, v8, v11, &s);
  v41 = HW_XML_DBShm_SetValueChangeInfo(15, &s);
  v41 = HW_MSG_RpcCall((int)&v49, v44, v9, v40);
  j_HW_CFG_SaveLog(&v41, v9, v10, a7);
  HW_XML_DBShm_SetValueChangeInfo(v9, 0);
  ...
  return result;
}


这搞了半天不还是回到RPC了啊,CTM,这还怎么玩。

几天之后,碰到A哥,顺便问了句,“你们啥JB项目啊,要干这个?”,A哥回来了句,“这是一个上千W项目的核心部分...”,NMB,难怪这么难搞。

通过这个事情,得出几点心得:

1、不要随便装B,除非脸厚不怕疼的

2、X为的管理措施确实设计的好,将中间的函数、模块名字放到百度上,毛都没个

3、有相关经验的欢迎私信交流。



雪    币: 7074
活跃值: (3468)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
bxc 6 2017-2-27 20:32
6
0
之前搞华为光猫固件结构时,我也逆向过/bin/web,找到了对应的升级函数,不过我是直接二进制搜索dump出来的rootfs。然后定位到具体so。
雪    币: 7074
活跃值: (3468)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
bxc 6 2017-2-27 20:33
7
0
另外文章代码不高亮,看着真难受。
雪    币: 7074
活跃值: (3468)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
bxc 6 2017-2-27 20:34
8
0
其实中间函数名字,模块名字拿到谷歌上搜索都不一定有,因为搞华为光猫的实在不多
雪    币: 1412
活跃值: (3226)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
方向感 2017-2-27 21:14
9
0
获得 光电转换口的速度 后,拿来干嘛?
雪    币: 300
活跃值: (179)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
飞心男孩 2 2017-2-28 09:56
10
0
bxc 之前搞华为光猫固件结构时,我也逆向过/bin/web,找到了对应的升级函数,不过我是直接二进制搜索dump出来的rootfs。然后定位到具体so。
bxc有没有能动态注入模块的工具,我当时在网上找了个注入代码,不过都没能编译过 https://github.com/gaffe23/linux-inject.git
雪    币: 7074
活跃值: (3468)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
bxc 6 2017-2-28 10:46
11
0
飞心男孩 bxc有没有能动态注入模块的工具,我当时在网上找了个注入代码,不过都没能编译过 https://github.com/gaffe23/linux-inject.git
没有,没研究过这个
雪    币: 6769
活跃值: (4422)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
gjden 14 2017-3-9 11:11
12
0
作者文笔和技术都不错
雪    币: 22
活跃值: (139)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_空白_554204 2018-1-20 11:47
13
0
请问是怎么查web依赖的库的
游客
登录 | 注册 方可回帖
返回