0%

准备条件

(设备已解锁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安装法

启动至第三方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要重刷)。

参考

【荣耀v10】EMui9.0.0.181刷magisk框架及root教程

问题

代码在8.0以下系统可正常创建悬浮窗,8.0以上则创建不了。原因是悬浮窗样式需要重新设置。

解决方案

增加SDK判断代码

1
2
3
4
5
6
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
wmParams.type = LayoutParams.TYPE_APPLICATION_OVERLAY;
}
else{
wmParams.type = LayoutParams.TYPE_PHONE;
}

判断是否拥有悬浮窗权限并申请

安卓6.0(代号M,SDK 23)之后,需要动态申请权限,悬浮窗权限也不例外。所以可以在添加以下代码来申请悬浮窗权限。
PS:当然,必须在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

1
2
3
4
5
6
7
8
if (Build.VERSION.SDK_INT >= 23)
{
if (!Settings.canDrawOverlays(activity))
{
Intent it = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
activity.startActivityForResult(it, 1);
}
}
1
2
3
4
5
6
7
8
9
10
11
@TargetApi(23) protected void onActivityResult(int reqCode, int resCode, Intent data)
{
if (!Settings.canDrawOverlays(this))
{
Toast.makeText(this, "未授予悬浮窗权限!", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(this, "悬浮窗权限授予成功!", Toast.LENGTH_SHORT).show();
}
}

关于0x01010540错误

0x01010540是因为SDK版本太高,反编译工具识别不出来,需要替换成0x0101048f
具体方法见后文

关于0x01010543错误

如果只有

1
Exception in thread "main" b.a.a.e: resource spec: 0x01010543

没有UndefinedResObject
则更换apktool后再试
apktool可以在爱盘下载

实在要修复的话,往下看:(都是修改resources.arsc

修复UndefinedResObject错误

报错信息:

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即可

修复resource spec: 0x01010543

报错信息:

1
Exception in thread "main" b.a.a.e: resource spec: 0x01010543

解决方法

使用010Editor,Ctrl+F,字节形式搜索报错的16进制数的小端字节(就是12345678写成78564312
这里我们搜索43050101,然后把它前面的字节0x02修改为0x03,保存后替换进apk即可

修复resource spec: 0x01010540

0x01010540是因为SDK版本太高,反编译工具识别不出来,需要替换成0x0101048f

解决方法

使用010Editor,Ctrl+F,字节形式搜索报错的16进制数的小端字节(就是40050101换成8f040101

参考

记录Android Killer反编译时遇到的异常
保护Android resources文件不被反编译原理分析

解题方法并不唯一,仅供参考。

题目打包下载地址

https://down.52pojie.cn/Challenge/Happy_New_Year_2019_Challenge.rar

第一题 签到题

关注“吾爱破解论坛”公众号,回复指定字符串即可获得本题正确口令和第二题题目下载地址。

第二题 CrackMe

(本题我做的时候是无壳的,因为碰巧发现了内测时的题。公测时加了个upx的壳,故需要先脱壳,esp定律即可)
(这题用OD其实更方便些,个人习惯用IDA)
脱壳后IDA打开,Shift+F12查看字符串,找到关键字符串正确!!!回复你输入的内容到吾爱破解论坛公众号
按X查看引用,定位到判断代码

按F5查看伪代码

上面有个长度判断,输入字符串长度为16
然后下面有个strcmp判断,相等则返回0,不过加了个!就变成相等返回真了

所以在strcmp下个断点查看寄存器(v2)即可得到密码

阅读全文 »

第一步,分区

Linux只有分区挂载目录的概念,所以需要在Windows下分出一块较大的未分配空间,不需要格式化

下载镜像并写入U盘

下载完镜像以后,使用软碟通将镜像写入U盘,然后重启。
PS: 如果U盘本身就支持efi启动的话,可以直接把镜像解压到U盘
开机后把握时机进入Boot Menu,选择从USB启动。
注意:需要在BIOS中关闭安全启动(Secure Boot)

阅读全文 »

概述

选定代码段后,按P创建函数,无法F5,提示call analysis failed

原因

1、IDA无法识别出正确的调用约定(calling convention);
2、IDA无法识别出正确的参数个数。

解决方案

方法1 - IDA自动分析

定位到报错的代码位置,双击调用的函数,进入后按一次F5,再返回就可以F5了。

方法2 - 修改参数个数

定位到报错的代码位置,鼠标点击调用的函数,按下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系统启动后在该时间的基础上,加上电脑设置的时区数。

解决方案

所以只需要使两个系统对待硬件时间的方式一致即可。
自然,有两种方法。

方法1 修改Linux系统

打开终端,执行
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
写入当前时间到硬件

方法2 修改Windows系统(不建议)

Win+X,打开Powershell(管理员),执行
Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1
解释:设置RealTimeIsUniversal键值为1,也就是把RTC当作UTC
然而我用这种方法,切换几次系统以后时间往后推了16小时= =
所以个人不推荐使用这种方法

参考

解决Windows10与Ubuntu16.04双系统时间不一样问题!

来自中老年的表情包

图片如下(可以自己尝试分析)

分析

只有一个gif,惯例010Editor打开,文件尾有个压缩包
提取之,不出意外的有密码,而且并不是伪加密

尝试

输入新年快乐,密码错误
输入happy,密码错误
输入happy2019,密码错误
难道隐藏在图片里?于是PS提取之,得到6张png
一番尝试后没有任何收获(陷入僵局.jpg
甚至怀疑是否在网页中含有密码,询问作者,得到回复:

暴力出奇迹

得到最终的神秘数字

然后,爆破得到了密码,89ms= =
解压后得到一个wav文件,播放,发现是电话拨号音
使用AU打开并显示频谱(Shift+D),对照DTMF表得到对应数字

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def toAlpha(c,i):
num = ord(c)
if num >= 65 and num <= 90:
num = 65 + ((num - 65) + i) % 26
elif num >= 97 and num <= 122:
num = 97 + ((num - 97) + i) % 26
return chr(num)

def encrypt(string,i):
string_new = ''
for s in string:
string_new += str(toAlpha(s,i))
print(string_new)
return string_new

def decrypt(string):
for i in range(26):
encrypt(string, -i)
encode = "LyjtL3fvnSRlo2xvKIjrK2ximSHkJ3ZhJ2Hto3x9"
decrypt(encode)

encrypt函数中加上base64解密代码即可爆破

增加代码

1
2
3
s = str(base64.b64decode(string_new))
if "flag" in s:
print(s)

参考

凯撒密码与python实现

解压

解压得到四个文件,有一个public.key和三个加密过的文件,于是先把p和q解出来

得到e和n

openssl rsa -pubin -text -modulus -in warmup -in public.key
得到

1
2
Exponent: 65537 (0x10001)
Modulus=D99E952296A6D960DFC2504ABA545B9442D60A7B9E930AFF451C78EC55D555EB

使用yafu分解,得到p和q

1
2
p = 302825536744096741518546212761194311477
q = 325045504186436346209877301320131277983

求出d

使用gmpy

解密并打印出flag

使用rsa模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import rsa

n = 0xD99E952296A6D960DFC2504ABA545B9442D60A7B9E930AFF451C78EC55D555EB
e = 0x10001
p = 302825536744096741518546212761194311477
q = 325045504186436346209877301320131277983
d = 0x4547B732CBC3527104CB57C4728D6899B44C4994FAE2713D6B594BC0F522A41
ret = ""
privatekey = rsa.PrivateKey(n , e , d , p , q)
with open("encrypted.message1" , "rb") as f:
ret += (rsa.decrypt(f.read(), privatekey).decode())
with open("encrypted.message2" , "rb") as f:
ret += (rsa.decrypt(f.read(), privatekey).decode())
with open("encrypted.message3" , "rb") as f:
ret += (rsa.decrypt(f.read(), privatekey).decode())
print(ret)

得到

1
2
3
flag{3b6d3806-4b2b
-11e7-95a0-
000c29d7e93d}

去掉回车得到最终flag

不使用rsa模块

其实就是自己实现rsa.decrypt中的转换16进制操作
以第一个文件为例,解密出来转化为16进制:
25a8007e9ad2809abbf5a00666c61677b33623664333830362d346232620a
位数为奇数,所以左边补0,得到
025a8007e9ad2809abbf5a00666c61677b33623664333830362d346232620a
转换为ascii码得到
Z��( ��Z�flag{3b6d3806-4b2b

剩下文件同理

参考

i春秋第二届春秋欢乐赛RSA256writeup