Contents

关于瑞芯微Android升级工具-linux版本的bug

问题点

最近在更新rk3399的android板子时,用到了Linux_Upgrade_Tool工具 https://github.com/rockchip-linux/tools/tree/master/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool

  • 查看文档

/posts/2021/rockchip-linux-tool-bug/res/1.png

  • 按照文档刷system分区,死活出错!

/posts/2021/rockchip-linux-tool-bug/res/2.jpg

  • 看了一圈没找到有用的,这些人做事也太不严谨了,难道di这功能没测试过?

  • 时间紧,还是先自己解决吧,上gdb,下puts断点,bt栈回溯,发现这里抛错了,上ida看看代码

/posts/2021/rockchip-linux-tool-bug/res/3.png

  • 跟进去,发现wordexp返回失败

/posts/2021/rockchip-linux-tool-bug/res/4.png

WRDE_BADCHAR  /* A metachar appears in the wrong place.  */
  • 改下内存,抹掉\n
set *(char*)0x7fff295c99e0=0x00
  • 改后测试通过

/posts/2021/rockchip-linux-tool-bug/res/5.jpg

Patch二进制

  • 内存补丁都是crack的惯用伎俩,这里没必要写代码,直接用ida给split_commandline函数打个patch即可。
在下面找了个没调用的函数free_commandline(不然写代码空间不够)

split_commandline函数入口
...
//跳到修复的shellcode
.text:0000000000404B6C E9 9F 00 00 00  jmp     _Z16free_commandlinePPci ; free_commandline(char **,int)
retrump标签
...
.text:0000000000404C10 57                                      push    rdi  //保存参数
.text:0000000000404C11 E8 52 BA FF FF                          call    j_strlen_ifunc  //获取字符串长度
.text:0000000000404C16 5F                                      pop     rdi //恢复参数
.text:0000000000404C17 48 8D 44 07 FF                          lea     rax, [rdi+rax-1] //拿到最后一个字符地址
.text:0000000000404C1C C6 00 00                                mov     byte ptr [rax], 0 //把字符清0
.text:0000000000404C1F 31 C0                                   xor     eax, eax //恢复之前的代码
.text:0000000000404C21 E9 4B FF FF FF                          jmp     retrump //跳转到原函数继续执行

PS:ida的汇编功能太弱了,还好OpenArk有汇编工具,直接生成二进制来patch

最终patch完美解决问题,这个还是抽空给官方发个issue,修复掉~