Reverse EasyCpp
[2019/10/25更新]
首先读入16个数字,然后生成一个斐波那契数组,长度也为16
然后对输入数组进行操作,从第二位开始,都加上第一位的值(transform
)
动态调试可知accumulate
的匿名函数对运算完的数组做反转操作
然后与斐波那契数组比较,相同则输出flag
也就是说输入的第一个数字是不会变的,所以就是987
后面的数字直接脚本跑一下就可以得到结果了
(设备已解锁BL,电脑fastboot环境正常是前提条件)
已下载magisk框架rec安装包(github下载),有sd卡(adb sideload
未测试是否可安装,建议用内存卡),并已安装第三方recovery(以下简称rec)
或
已安装magisk框架app,且有原厂recovery_ramdisk
镜像
fastboot刷入命令(华为没有boot分区,所以rec也是通过这个指令刷入)
(BOOT.img请自行替换为对应镜像名)
1 | fastboot flash recovery_ramdisk BOOT.img |
启动至第三方rec,从sd卡选择magisk卡刷包,安装。
安装完成后选择重启到rec模式,即可进入带面具的系统
参考【荣耀v10】EMui9.0.0.181刷magisk框架及root教程,个人未测试,应该可行
提取出原厂recovery_ramdisk
镜像(从官方线刷包或其他地方获得),并发送到手机(模拟器应该也行)
使用magisk框架app,选择安装,修补boot镜像,选择提取出的原厂镜像
修补完成后传回电脑,手机进入fastboot模式,刷入即可
由于修补的镜像其实是rec分区,所以要按照进入rec的方式进入带面具的系统。
(个人测试,在带magisk的系统下重启仍然是有root的,等价于启动到rec)
具体操作如图(图源自参考帖)
如果安装了不适配的模块,还是需要刷入第三方rec,进入后删除/data/adb
文件夹,然后即可正常开机(magisk要重刷)。
代码在8.0以下系统可正常创建悬浮窗,8.0以上则创建不了。原因是悬浮窗样式需要重新设置。
增加SDK判断代码
1 | if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { |
安卓6.0(代号M,SDK 23)之后,需要动态申请权限,悬浮窗权限也不例外。所以可以在添加以下代码来申请悬浮窗权限。
PS:当然,必须在AndroidManifest.xml
中添加<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
1 | if (Build.VERSION.SDK_INT >= 23) |
1 | @TargetApi(23) protected void onActivityResult(int reqCode, int resCode, Intent data) |
0x01010540
错误0x01010540
是因为SDK版本太高,反编译工具识别不出来,需要替换成0x0101048f
具体方法见后文
0x01010543
错误如果只有
1 | Exception in thread "main" b.a.a.e: resource spec: 0x01010543 |
没有UndefinedResObject
则更换apktool
后再试apktool
可以在爱盘下载
实在要修复的话,往下看:(都是修改resources.arsc
)
报错信息:
1 | Exception in thread "main" brut.androlib.err.UndefinedResObject: resource spec: 0x7f000006 |
aapt dump
查看apk的资源信息,并保存到文件
1 | aapt d --values resources test.apk >1.txt |
找到DataType
数据类型不正确的值(搜索attribute
即可)对应的描述符(一般是把7f改成00,0x00000006
)
文件中没有识别出正确的数据类型,显示的是(attribute) 0x00000006
使用010Editor
,Ctrl+F,字节形式搜索对应描述的16进制数的小端字节(就是00000006
写成06000000
)
然后把它前面的字节0x02
修改为0x03
,保存后替换进apk即可
报错信息:
1 | Exception in thread "main" b.a.a.e: resource spec: 0x01010543 |
使用010Editor
,Ctrl+F,字节形式搜索报错的16进制数的小端字节(就是12345678
写成78564312
)
这里我们搜索43050101
,然后把它前面的字节0x02
修改为0x03
,保存后替换进apk即可
0x01010540
是因为SDK版本太高,反编译工具识别不出来,需要替换成0x0101048f
使用010Editor
,Ctrl+F,字节形式搜索报错的16进制数的小端字节(就是40050101
换成8f040101
)
解题方法并不唯一,仅供参考。
https://down.52pojie.cn/Challenge/Happy_New_Year_2019_Challenge.rar
关注“吾爱破解论坛”公众号,回复指定字符串即可获得本题正确口令和第二题题目下载地址。
(本题我做的时候是无壳的,因为碰巧发现了内测时的题。公测时加了个upx的壳,故需要先脱壳,esp定律即可)
(这题用OD其实更方便些,个人习惯用IDA)
脱壳后IDA打开,Shift+F12
查看字符串,找到关键字符串正确!!!回复你输入的内容到吾爱破解论坛公众号
按X查看引用,定位到判断代码
按F5查看伪代码
上面有个长度判断,输入字符串长度为16
然后下面有个strcmp判断,相等则返回0,不过加了个!
就变成相等返回真了
所以在strcmp下个断点查看寄存器(v2)即可得到密码
选定代码段后,按P创建函数,无法F5,提示call analysis failed
。
1、IDA无法识别出正确的调用约定(calling convention);
2、IDA无法识别出正确的参数个数。
定位到报错的代码位置,双击调用的函数,进入后按一次F5,再返回就可以F5了。
定位到报错的代码位置,鼠标点击调用的函数,按下Y键,修改参数个数。
比如将(_JNIEnv *, int, int, int, int, int, int, int);
改为(_JNIEnv *, int, int, int);
具体参数个数,需要根据函数调用约定及汇编代码确定(看它传入了几个参数)。
IDA sp-analysis failed 不能F5的 解决方案之(二)
解决IDA出现Decompilation failure: call analysis failed不可以F5的问题
IDA反编译失败-call analysis failed
笔记本装了win10+Ubuntu18.04双系统,但是两个系统的时间并不同步,相差8小时(正好是时区数)。于是搜索之,找到解决方案
Windows 与 Mac/Linux 看待系统硬件时间(Hardware Ttime,或称实时时间,即RTC,Real_Time Clock)的方式不同。
Windows把计算机硬件时间当作本地时间(local time),所以在Windows系统中显示的时间跟BIOS中显示的时间是一样的。
而Linux/Unix/Mac把计算机硬件时间当作UTC(Universal Time Coordinated,世界统一时间), 所以在Linux/Unix/Mac系统启动后在该时间的基础上,加上电脑设置的时区数。
所以只需要使两个系统对待硬件时间的方式一致即可。
自然,有两种方法。
打开终端,执行timedatectl set-local-rtc 1
禁用Linux系统的UTC时间,重启即可生效(不需要管理员权限)
提示: 在 Ubuntu 16.04 版本以前,关闭UTC的方法是编辑/etc/default/rcS,将UTC=yes改成UTC=no, 但在Ubuntu 16.04使用systemd启动之后,时间改成了由timedatectl来管理
如果时间还是不对,就先在设置里修改系统时间为当前时间(北京时间),然后执行timedatectl set-local-rtc 1
再sudo hwclock -w
写入当前时间到硬件
Win+X,打开Powershell
(管理员),执行Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1
解释:设置RealTimeIsUniversal
键值为1,也就是把RTC当作UTC
然而我用这种方法,切换几次系统以后时间往后推了16小时= =
所以个人不推荐使用这种方法
图片如下(可以自己尝试分析)
只有一个gif,惯例010Editor
打开,文件尾有个压缩包
提取之,不出意外的有密码,而且并不是伪加密
输入新年快乐,密码错误
输入happy,密码错误
输入happy2019,密码错误
难道隐藏在图片里?于是PS提取之,得到6张png
一番尝试后没有任何收获(陷入僵局.jpg
甚至怀疑是否在网页中含有密码,询问作者,得到回复:
暴力出奇迹
然后,爆破得到了密码,89ms= =
解压后得到一个wav文件,播放,发现是电话拨号音
使用AU打开并显示频谱(Shift+D),对照DTMF表得到对应数字
低频 \ 高频(Hz) | 1209 | 1336 | 1477 | 1633 |
---|---|---|---|---|
697 | 1 | 2 | 3 | A |
770 | 4 | 5 | 6 | B |
852 | 7 | 8 | 9 | C |
941 | * | 0 | # | D |
最后祝大家新年快乐!
cipher.txt内容如下
1 | Ld hcrakewcfaxr, f hofjjlhfo hlaxuc lj f krau ev hlaxuc kxfk zfj tjui xljkeclhfoor gtk dez xfj vfooud, vec kxu pejk afck, ldke iljtju. Ld hedkcfjk ke peiucd hcrakewcfaxlh foweclkxpj, pejk hofjjlhfo hlaxucj hfd gu acfhklhfoor hepatkui fdi jeoyui gr xfdi. Xezuyuc, OrmkO3vydJCoe2qyNLmcN2qlpJXnM3SxM2Xke3q9 kxur fcu foje tjtfoor yucr jlpaou ke gcufn zlkx peiucd kuhxdeoewr. Kxu kucp ldhotiuj kxu jlpaou jrjkupj tjui jldhu Wcuun fdi Cepfd klpuj, kxu uofgecfku Cudfljjfdhu hlaxucj, Zecoi Zfc LL hcrakewcfaxr jthx fj kxu Udlwpf pfhxldu fdi guredi. F btlhn gcezd veq mtpa eyuc kxu ofsr iew. |
推测是移位的密码,使用WinCrypto
分析得到(也可以使用quip在线分析并修复)
1 | In cryptography, a classical cipher is a type of cipher that was used historically but now has fallen, for the most part, into disuse. In contrast to modern cryptographic algorithms, most classical ciphers can be practically computed and solved by hand. However, LyjtL3fvnSRlo2xvKIjrK2ximSHkJ3ZhJ2Hto3x9 they are also usually very simple to break with modern technology. The term includes the simple systems used since Greek and Roman times, the elaborate Renaissance ciphers, World War II cryptography such as the Enigma machine and beyond. A quick brown fox jump over the lazy dog. |
发现该句子其实来源于英文维基百科的经典加密(Classical cipher)
发现最后一句话其实就是A quick brown fox jumps over the lazy dog.
(包含26个字母的最短句子)并去掉s
由此可以得到对照表然后恢复(当然使用WinCrypto
就直接是这个字符串了)
所以可以得到原本的字符是LyjtL3fvnSRlo2xvKIjrK2ximSHkJ3ZhJ2Hto3x9
直接解base64发现行不通
移位爆破
得到ZmxhZ3tjbGFzc2ljYWxfY2lwaGVyX3NvX2Vhc3l9
是可以解的
1 | def toAlpha(c,i): |
在encrypt
函数中加上base64解密代码即可爆破
1 | s = str(base64.b64decode(string_new)) |