找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 4115|回复: 24

手工使用二进制工具修改H大的breed的gpio复位键的心得-续-逆向恢复符号表

[复制链接]
发表于 2021-10-18 20:36 | 显示全部楼层 |阅读模式
本帖最后由 fjh1997 于 2021-10-18 20:38 编辑

前情概要:https://www.right.com.cn/forum/thread-6189907-1-1.html
之前通过010editor对比了两个gpio不同的固件,结果居然成功修改了gpio键。结果楼下马上就来了个神人把修复好符号的ida伪代码给我了。
网上一查,这个神人居然是breed开源仿制版本rtboot的作者(https://github.com/zhaohengbo/rt-boot),牛逼。
我寻思着如果我有这样的水平。那么除了reset键能改,别的led什么的gpio也能改。于是私信以及qq了那个大佬,结果大佬就是不回。无奈之下,只能自己去逆向gpio,于是网上查了一下QCA9533是大端序的mips指令。
ida打开2998这个固件之后设置好固件类型为MIPS big endian。


但奈何ida一点也不识别,就一脸懵逼,左边函数都是空的。


找到我24 04 00 0E 24 05 00 01的数据(原版固件应该是24 04 00 0B 24 05 00 01)按了下C,发现这里是mips指令,好像a0,a1,a2传了参数,分别是0xe,1,0x2c(gp)-0x2664(详见mips函数调用约定https://blog.csdn.net/Lrrent/article/details/51172766

这个和那个神人反编译出来的函数gpio_button_register的参数很像,应该有希望。

网上查了下ida需要有基地址才能识别字符串,所谓基地址,就是把固件加载到内存里的地址,也就是这个固件的地址0对应的内存里的地址,于是查到了这个工具拿来爆破基地址(https://github.com/sgayou/rbasefind

爆破时间不长,用了做实验的12核服务器爆破大概一会就出来了。
结果如下:
  1. 0x80100000: 220
  2. 0x24810000: 167
  3. 0x24820000: 112
  4. 0x80106000: 85
  5. 0x24a30000: 72
  6. 0x80107000: 55
  7. 0x8f962000: 45
  8. 0x8f961000: 42
  9. 0x8f95e000: 42
  10. 0x80104000: 37
复制代码
说明基地址大概率是0x80100000
ida里面edit-segments-rebase program填入基地址发现还是无法自动识别出字符串,但rbasefind的原理就是识别比如0x8012CC45这样代表地址的二进制数据,如果这个数据恰好指向一个字符串,那么这个大概率就是内存里面真实地址,再根据这个地址计算出基地址。

又找了找,这篇文章(https://bbs.pediy.com/thread-266803.html)说ghidra得到基地址后识别函数的效率高,试了一下果然如此,而且一些字符串可以识别了:




使用和那个文章一样的办法讲函数列表导入ida,使得ida也能识别函数,之后我又去之前那个24 04 00 0E 24 05 00 01的地方看了一下,发现已经能够反编译了,但是不够完美,因为没有符号表。接下来只要恢复符号表即可,但这又恰恰是最难的一步。


联想到elf结构里面符号表symtab和字符串表strtab的关系,strtab往往在elf的末尾段,symtab在中间,而且里面是一个表格,里面是一个结构体记录了函数地址和符号在strtab里面的偏移。

于是尝试去找了找有没有符号表这个东西。往里面找了找前两个函数0x80110424和0x8011090c由于qca9533是大端序,所以直接搜索80110424和8011090c即可。
还真每个地址分别搜到了两处出现的,但其中一处是连续的80开头的地址,所以排除,于是找到了一个类似符号表的地方,之所以说类似是因为这个符号表的结构和elf32不太一样。


注意里面0x3744和0x40f1这两个数分别对应函数0x80110424和0x8011090c,他们相差2477,而那个大神截图中的gpio_button_register和gpio_led_register在下图的strtab里面相差的偏移0x46158-0x46b05也是2477,


那么我们就可以得出这样的结论:


按照这个思路写idapython脚本重命名函数就可以了:
  1. start_address=0x80144B2C
  2. while True:
  3.     a=get_bytes(start_address,1)
  4.     if a== b'\x80':
  5.         print("good")
  6.         create_dword(start_address)
  7.         create_word(start_address-2)
  8.     else:
  9.         print("bad")
  10.         print(hex(start_address))
  11.         break
  12.         
  13.     start_address=start_address-0x10

  14. string_address=0x46158+0x80100000-0x3744
  15. #0x80142a14
  16. table_start=0x80142A5C
  17. table_end=0x80144B2C
  18. while True:
  19.     func_addr=int.from_bytes(get_bytes(table_start,4),"big")
  20.     idx=int.from_bytes(get_bytes(table_start+14,2),"big")+string_address
  21.     func_name=get_strlit_contents(idx)
  22.     print(get_name(func_addr)+" "+func_name.decode())
  23.     set_name(func_addr,func_name.decode())
  24.     if table_start ==table_end:
  25.         break
  26.     table_start=table_start+0x10
复制代码
之后就得到了 恢复符号表的结果,可以看出几乎所有的函数名都恢复了,接下来逆向分析就很方便了。



下面附上我的idb文件供大家参考:
链接: https://pan.baidu.com/s/14-fcuymIozXeJJzCjvm6SA 提取码: r6d9


参考文章:

[分享]一次嵌入式固件逆向实践 看雪论坛 https://bbs.pediy.com/thread-266803.html
IoT漏洞研究(一)固件基础 freebuf https://www.freebuf.com/articles/endpoint/254257.html




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
发表于 2021-10-18 21:42 | 显示全部楼层
感谢分享探索过程!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2021-10-18 22:21 | 显示全部楼层
一脸懵逼的进来,一脸懵逼的走了,说了句,卧槽流弊!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2021-10-18 22:28 | 显示全部楼层
感谢分享!支持探索!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2021-10-31 20:22 | 显示全部楼层
感谢分享,太强了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2021-11-21 19:37 | 显示全部楼层
下次更新不留符号表了(滑稽
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2021-12-4 21:08 | 显示全部楼层
本帖最后由 zhaocz 于 2021-12-4 21:18 编辑

我试了一下,想得到一个reset 11的qca953x,可是失败了,不知道我哪里做的不对?1.我先是用binwalk -e 解出两个文件,然后把那个 29A8.7z 的文件再用lzma解出一个29A8。
2.再修改对应的RESET字段。改为0C为0B.
3.最后lzma相应的参数,重新压缩为 29A8.lzma.发现这个文件比原来的29A8.7z大了一点点。
这里我发现29A8.lzma文件开头为 6D00 0000,而原来的29A8.7z文件开头为6C00 0000
用十六进制编辑器打开这qca953x.bin和29A8.lzma,想把29A8.lzma替换到原来 6c00 0000的位置
烧入路由器后,变砖。


点评

只能改大,不能改小  详情 回复 发表于 2022-1-13 09:52
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-1-13 09:52 | 显示全部楼层
zhaocz 发表于 2021-12-4 21:08
我试了一下,想得到一个reset 11的qca953x,可是失败了,不知道我哪里做的不对?1.我先是用binwalk -e 解出 ...

只能改大,不能改小

点评

修改gpio后是生成的lzma文件大小不能比原来解压出来的还要大,只能小。。 否则ttl会报 bootloader data is corrupted system halted  详情 回复 发表于 2022-3-28 23:50
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-3-28 23:50 | 显示全部楼层
wzy8088 发表于 2022-1-13 09:52
只能改大,不能改小

修改gpio后是生成的lzma文件大小不能比原来解压出来的还要大,只能小。。
否则ttl会报 bootloader data is corrupted
                system halted

点评

变大了怎么办  详情 回复 发表于 2023-3-9 22:42
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-6-26 13:12 | 显示全部楼层
本帖最后由 asan 于 2022-6-26 13:19 编辑

请教大佬 7628复位键 GPIO#11  ,BREED 用HEX要怎么改?


breed> btntst
Press Ctrl+C to stop.

GPIO#11 (<gpio0,11>) changed to 0
GPIO#5 (<gpio0,5>) changed to 1
GPIO#11 (<gpio0,11>) changed to 1
GPIO#5 (<gpio0,5>) changed to 0
GPIO#5 (<gpio0,5>) changed to 1
GPIO#5 (<gpio0,5>) changed to 0
GPIO#5 (<gpio0,5>) changed to 1
GPIO#5 (<gpio0,5>) changed to 0
GPIO#5 (<gpio0,5>) changed to 1
GPIO#5 (<gpio0,5>) changed to 0

我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2023-1-9 10:26 | 显示全部楼层
一脸懵逼的进来,一脸懵逼的走了,说了句,卧槽流弊!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2023-1-10 11:19 | 显示全部楼层
感谢大佬分享。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2023-3-9 22:42 | 显示全部楼层
zjh1990 发表于 2022-3-28 23:50
修改gpio后是生成的lzma文件大小不能比原来解压出来的还要大,只能小。。
否则ttl会报 bootloader data  ...

变大了怎么办

点评

不能启动  详情 回复 发表于 2023-3-10 09:32
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2023-3-10 09:32 | 显示全部楼层

不能启动

点评

问的是变大了怎办,不是变大了怎么样  详情 回复 发表于 2023-3-11 09:32
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2023-3-11 09:32 | 显示全部楼层
本帖最后由 yunhai20082008 于 2023-3-11 09:36 编辑

问的是变大了怎么办,不是变大了怎么样。我试了好几个gpio,都是变大

点评

你可以找需要改的breed,看下它是不是有多个 gpio 有的情况下,多余的设置成ff/00,那么整体大小就不会变化的。  详情 回复 发表于 2023-3-12 22:34
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-20 04:38

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表