ctfphp读取flag,ctf题:pinstore获取flag
⾸先先⽤jadx反编译出源代码,可以看到⽬录结构
从这⾥就可以知道我们只需查看re⽬录下的代码即可
先从MainActivity看起
从源代码我们可以知道pinFormDB是数据库中存储的密码、hashOfEnteredPin属于我们输⼊的密码加密后的密⽂,在这⾥我们可以修改if
的判断条件
接下来通过apktool⼯具对apk⽂件进⾏反编译得到smail代码
分别找到pinFormDB对应的是v5,hashOfEnteredPin对应的是v3
然后接下来找到两个参数在⼀起被调⽤的地⽅
通过修改蓝⾊⽅框内的内容:if-eqz=>if-nez
注:if-eqz:如果vAA为0则跳转
if-nez:如果VAA不为0则跳转
于是我们在只要输不出正确的密码就可以直接读取数据,结果如下图
可惜这不是我们想要的flag,所以恢复原来的smail,继续分析源代码,
在这⾥我们找到⼀个Toast,Toast是⽤来显⽰消息的,我们可以修改smail源码让密码爆出来(v5是从数据库中读取的密⽂
pinFromDB,v7是密码输⼊错误提⽰信息"IncorrectPin,tryagain")
通过修改蓝⾊⽅框内的内容:v7=>v5
结果如下图,
得到加密的密码密⽂:d8531a519b3d4dfebece0259f90b466a23efc57b
MD5解密得:7498
可惜也不是我们想要的flag。
在这⾥还是话费了我⼤量时间来找flag位置,
这⾥是后知后觉的,我们⽤navicatforsqlite打开,这⾥我们可以发现他有pinDB、cretsDBv1和cretsDBv2
然⽽在源代码中我们查看,发现我们只读取过cretsDBv1和pinDB
//[]
pinFromDB=newDatabaUtilities(licationContext()).fetchPin();//***********************
Intentintent=newIntent(,);
ra("pin",enteredPin);
ctivity(intent);
//[]
t(NewCryptoUtilities("v1",pin).decrypt(newDatabaUtilities(getApplicationContext()).fetchSecret()));
所以我们更可以读取cretsDBv2数据看看,但是要注意⼀个问题
我们可以发现从数据库中读取数据的解密⽅式不⼀样
所以我们需要修改两处位置:
位置⼀:在⾥找到字符串”SELECTentryFROMcretsDBv1”
通过修改蓝⾊⽅框内的内容:
SELECTentryFROMcretsDBv1->SELECTentryFROMcretsDBv2
位置⼆:在⾥找到字符串”v1”(这⾥也可以同上⾯⼀样修改if条件吗;"v1"字符串好找,这⾥就改v1了)
通过修改蓝⾊⽅框内的内容:
v1->v2(这⾥可以是任意⾮v1内容)
然后打包回编译,签名apk后,我们就可以得到flag了
本文发布于:2022-11-24 04:10:01,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/9795.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |