关于瑞芯微Android升级工具-linux版本的bug
Contents
问题点
最近在更新rk3399的android板子时,用到了Linux_Upgrade_Tool工具 https://github.com/rockchip-linux/tools/tree/master/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
- 查看文档
- 按照文档刷system分区,死活出错!
-
看了一圈没找到有用的,这些人做事也太不严谨了,难道di这功能没测试过?
-
时间紧,还是先自己解决吧,上gdb,下puts断点,bt栈回溯,发现这里抛错了,上ida看看代码
- 跟进去,发现wordexp返回失败
-
继续在此下断点,i r $rax查看返回值是2
-
查看man文档,以及相关定义,返回WRDE_BADCHAR,发现存在\n,果不其然 https://man7.org/linux/man-pages/man3/wordexp.3.html https://sites.uclouvain.be/SystInfo/usr/include/wordexp.h.html
WRDE_BADCHAR /* A metachar appears in the wrong place. */
- 改下内存,抹掉\n
set *(char*)0x7fff295c99e0=0x00
- 改后测试通过
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,修复掉~