ctfshow Matara Okina
app下载:https://ctfshow.lanzoui.com/i4PQEkn6vch
网上已经有大佬写了过程但都不太详细,本菜鸡以小白的角度记录一下思考过程 :D
参考:
http://t.csdn.cn/MsYd3
https://www.cnblogs.com/crfshadow/p/14380315.html#_label2
反编译
app安装到手机上,打开一看没什么用。。。
把app拖进jadx里
由于我是上课时摸鱼做出这道题的,过程全在手机上完成,就用了NP管理器代替
提取安装包后找到AndroidManifest.xml这个文件,打开方式选择编辑
可以看到有两个入口,show.zxc.matarokina.MainActivity 就是默认打开运行的activity,还有一个 show.zxc.mataraokina.FlagActivity,进去这个类看看。
选中那个dex文件,打开方式选择DEX编辑PLUS, 找到 FlagActivity 点进去,默认显示的是 smali 代码
点右上角的三个点,转为 java
由此可知,让ans等于bytes就行
分析代码
byte[] bytes = scheme.getBytes();
找 scheme ->
scheme = data.getQueryParameter("secret");
找 data ->
Uri data = getIntent().getData();
看不懂在干什么,复制它上网搜
搜啊搜,搜到这篇文章
https://www.cnblogs.com/hwb04160011/p/13960578.html
可以看到java代码里,获取了data,scheme,hose,对照着可以构造出 sh0w://p4th/70/1nput
后面又在获取 data.getQueryParameter("secret");
也就是需要构造 sh0w://p4th/70/1nput?secret=?????
于是问题就转为了求 secret=什么玩意儿
这是上课摸鱼撸出来的分析过程:
逆向求解
核心加密代码就在那个while循环里,它把 scheme 转成 byte 后一通运算的结果和 ans 比较
也就是说,要使 scheme 计算后得到的结果是 ans 就行。
先搞明白while循环里面在算什么,可以带几个数进去,如上图,自己动手试试吧 :)
题目就变成了 y = x ^ n, 这里的 n(就是i,每次循环增加1) 和 y(ans的每个byte)是已知的,要求未知x.
做的是异或运算,搜索一下这种运算的特点:https://www.ruanyifeng.com/blog/2021/01/_xor.html
等式两边同时 ^n
也就求得 x = y ^ n
于是写出代码
浏览器跳转
于是可以凑出这个链接 sh0w://p4th/70/1nput?secret=Android_scheme_is_FUN
打开NP/MT管理器,新建文档 aaa.html 根据 https://www.cnblogs.com/hwb04160011/p/13960578.html 里学到的知识,写出如下代码
<a href="sh0w://p4th/70/1nput?secret=Android_scheme_is_FUN">hahaha</a>
保存退出后,点它选择打开方式,选择浏览器
左上角有个很小的字 ,点它,会跳转到应用
看到flag