日常破解--XCTF easy_apk
一、题目来源
来源:XCTF社区安卓题目easy_apk
二、破解思路
1、首先运行一下给的apk,发现就一个输入框和一个按钮,随便点击一下,发现弹出Toast验证失败
。如下图所示:
2、将该APK直接拖进AndroidKiller中反编译,搜索关键字验证失败,如下图所示:
3、关键代码就在MainCtivity.java处,使用jeb直接查看Java代码(偷懒不看smali汇编了,看到脑壳痛),发现代码逻辑为将用户输入的字符串使用Base64New类中的Base64Encode()函数加密后和一个字符串相比较,若相等,则验证通过,否则验证失败,点击跳转到Base64New类中,发现Base64Encode()函数首先将用户输入得到的字符串转为字节数组作为参数,然后每3个字节为一组,扩展为4个字节,最后查表即可(感觉很眼熟的样子,emmmm就是base64编码,只是对照表跟base64对照表不同,可惜我在写完解密脚本之后才发现是这东西),那么解密过程也很简单了,直接对字符串4个字节一组分组,缩减为3个字节一组(语文水平感觉很差的样子写道这里。。。。),然后转为字符拼接成字符串即可。
4、将解码过程写出python脚本跑出flag,填入验证通过!!!
三、总结
总结:很基础的一道题,唯一的难点就在必须写base64解码脚本了吧,emmmm要是像我一样木有认出来是base64,那一开始就有点难受了!!!下面附上Base64编码解码原理以及相关脚本!!!
Base64编码原理:
1、将字符串转为字节数组,然后每3个字节一组,一个24个比特,不足3个字节直接补0
2、在每一组3个字节24bit中,以6个bit构成一个字节(高两位补0),形成4个字节为一组
3、根据编码后的字节查找对照表,拼接成字符串,自此,Base64编码完成!!!
Base64解码原理:
1、将编码后的字符串查找对照表后的字节以4个字节为一组,出现=
直接去掉即可
2、将这4个字节每个字节的高两位去掉,有32bit变为24bit,将这24bit以8个bit构成三个字节
3、将第二步得到的字节数组转为字符串即可!!!
附上python脚本(ps:由于markdown问题,所以有需要的主机更改一下某些地方的缩进):
def Base64Decode(str_list):
list_base = []
a = str_list[0] << 2
c = str_list[1] & 15
b = str_list[1] >> 4
a = a | b
list_base.append(a)
c = c << 4
a = str_list[2] & 3
b = str_list[2] >> 2
c = c | b
list_base.append(c)
a = a << 6
a = a | str_list[3]
list_base.append(a)
return list_base
CodingTable = 'vwxrstuopq34567ABCDEFGHIJyz012PQRSTKLMNOZabcdUVWXYefghijklmn89+/'
Ciphertext = '5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='
i = 0
flag = 'flag{'
while i <= (len(Ciphertext) - 1):
list1 = []
n = 0
for k in range(4):
if Ciphertext[i + k] == '=':
list1.append(0)
n = n + 1
else:
list1.append(CodingTable.index(Ciphertext[i + k]))
ba = Base64Decode(list1)
for j in range(3 - n):
ch = chr(ba[j])
flag = flag + str(ch)
i = i + 4
flag = flag + '}'
print(flag)
日常破解--XCTF easy_apk的更多相关文章
- 日常破解---XCTF_APP1获取flag记录
日常破解---XCTF_APP1获取flag记录 一.题目来源 来源:XCTF社区安卓题目app1 二.解题记录 1.首先安装到模拟器中运行一下,如下图所示,点击一下按钮,弹出提示年轻人不 ...
- 日常破解--从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库
一.题目来源 题目来源:XCTF app3题目 二.解题过程 1.下载好题目,下载完后发现是.ab后缀名的文件,如下图所示: 2.什么是.ab文件?.ab后缀名的文件是Andr ...
- 开发神器之phpstorm破解与日常使用
PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查. PhpStorm可随时帮助用 ...
- 【CentOS】Linux日常管理
/////////////////////////目录///////////////////////////////////////// 一.日常监控指标相关 1.监控系统状态命令 2.查看系统进程 ...
- 如何破解Excel文档的编辑密码
对于Excel文档我们不仅可以设置打开密码,还可以设置几天几种密码,比如编辑密码.编辑密码又称写保护密码,是一种可以限制编辑权限的密码.如果我们在日常工作中发现自己忘记了excel编辑密码的话,那就需 ...
- 【.net程序破解】实战之标志位破解绕过注册法
今天有时间玩了下一个不错的软件Advanced System Cleaner,可惜要注册 于是想办法给破解了,这是跟之前不同的地方,属于.NET破解教程: 软件地址 - http://www.crsk ...
- Windows server 2008 R2远程桌面终端连接数的破解
Windows server 2008 R2远程桌面终端连接数的破解 日常工作中,经常需要远程连接到服务器上,然而在公司里,老总.同事都需要连接到服务器上,而默认的服务器系统同时连接的最大连接数只有2 ...
- 怎样破解邮箱password
破解邮箱password怎样破解邮箱password邮箱在我们的生活中日益成为一个不可或缺的角色.公司与公司之间的商贸往来,学生与老师间的学习交流,以及占非常大部分的私人信件的往来等等非常难离开它.但 ...
- 破解密码那些事儿(Hacking Secret Ciphers with Python)
作者:Al Sweigart 我们在电视和电影里头经常能够看到黑客们兴奋的快速敲击键盘,接着毫无意义的数字就在屏幕上飞奔(比如黑客帝国).然后让大家产生了一种奇妙的错觉,做黑客是一件高大上的事情, ...
随机推荐
- 让Spring不再难懂-ioc篇
写过java的都知道:所有的对象都必须创建:或者说:使用对象之前必须先创建.而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象. 就好像我们无需考虑对象的销毁回收一样,因为ja ...
- AttributeError: 'bytes' object has no attribute 'hex'
python3.5之前bytes数据没有hex()属性 需要使用 ''.join(map(lambda x:('' if len(hex(x))>=4 else '/x0')+hex(x)[2: ...
- file,path,uri互相转换
uri 转 file :File file = new File(new URI(uri.toString())); uri 转 path: Path path = Files.get(uri); f ...
- Nginx笔记总结六:Nginx location配置
语法规则:location [= | ~ | ~* | ^~] /uri/ {....} = 表示精确匹配 ^~ 表示uri以某个常规字符串开头 ~ 表示区分大小写的正则表达式 ~* 表示不区分大小写 ...
- top100 paper
- 用nexus搭建maven2内部服务器
由于项目组需要,要搭建内部的Maven仓库,借鉴项目组内部及外部同事的经验选用nexus来搭建内部仓库.下面描述一下具体的步骤. 一.安装配置过程 1.下载nexus,地址http://www.s ...
- unittest(9)- 使用ddt给测试用例传参
# 1. http_request.py import requests class HttpRequest: def http_request(self, url, method, data=Non ...
- 吴裕雄--天生自然 R语言开发学习:聚类分析
#-------------------------------------------------------# # R in Action (2nd ed): Chapter 16 # # Clu ...
- 由生到死10个月!做App中的“二”有多难
十月,原本是怀胎过程的喜悦时光,但这段个时光,如今却是绝大多数App从生到死的所有时间.在App市场表面形式一片大好,彻底主宰我们生活.工作.娱乐的当下,绝大多数用户只是在App海洋中只取一瓢饮,其他 ...
- 浅谈JobExecutionContext & JobDataMap
JobExecutionContext是什么? 当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的 execute() 方法: Job能通过JobExecu ...