Bugku安卓逆向
前几天刚接触安卓逆向,做了几道安卓逆向题,bugku的几道入门题,惊为天人,这Java代码如此清晰明了,不像ida的C语言伪代码让人看得头都爆炸,虽说简单而且很多人都做过,也记录一下入坑过程。
Timer
安装打开是一个倒计时,提示200000秒后出现flag
查看Java代码(可以用不同的工具,我用的Jeb2和Androidkiller,jeb2中按Q可以转化smali代码和Java代码,Androidkiller也有工具可以查看Java代码),beg
是开始时间+200000s,也就是出现flag的时间,now
是现在实时时间
关键代码:一个判断,判断beg
和now
时间差小于0则输出答案,还有个关键变量k
,初始值为0
可以直接修改判断条件绕过判断,剩下的问题就在于关键变量k
的值了,代码意思是对从200000遍历到1的所有值用is2
函数判断,再根据判断结果改变k
的值,我们跟进is2
函数:
照样写脚本,跑出k的值:
1 | def is1(x): |
jeb2中在java代码中找到判断点按Q找到对应的smali代码位置,修改smali源码(可以用AndroidKiller或者apktool等),可以将gtz
(大于等于)换成ltz
(小于等于),也可以用其他操作,逻辑上能跳过等待都行。
然后还要解决k值的问题,从下面iget
(取值,用于操作int这种的值类型)语句可以看出v3是k的值,在这句后面加上const v3,1616384
(赋值给v3)然后编译,签名(AndroidKiller可以签名),再安装就会直接出现flag了,记得换flag格式。
LoopAndLoop
安装打开让你输入密码得到flag,直接查看Java代码,找到输出flag的位置:
跟进判断函数(check):
发现一个原生(native)函数:Java中使用其他语言编写的函数
现在一些app,为了安全或者效率问题,会把一些重要的功能放到native层,Android中一般native层使用的是so库文件
然后apktool反编译后用IDA调试liblhm.so
文件,找到chec
函数:
意思大概是传入两个参数v1
和v2
,再根据2*v2%3
的值确定调用check1,2,3中的一个函数,以v1
和v2-1
作为参数,最后v2<=1
则返回v1
check1,2,3在Java代码里,都比较简单:
我们观察代码并照样写逆向脚本,原来v1
是从输入的值到1835996258,v2
从99到2,逆向脚本v2
就从2到99,v1
从1835996258到需要我们输入的正确密码,3个check函数里面的加减给变一下:
1 | def fun(a,b): |
再打开app输入密码就能得到flag了
easy-100
安装打开还是常见的让你输入key,jeb查看Java代码,加上main一共有6个函数,看类名估计都有用:
先看MainActivity
,onCreate
方法,执行了p
方法,之后对class d
创建了一个按钮监听事件,p
方法是把url.png
以二进制方式打开,从144的位置开始读取16字符赋值给v
,apktool反编译后Winhex查看可以确定v
值为this_is_the_key.
:
跟进class d
分析,发现调用了MainActivity.a()
函数对输入进行校检:
再回去看MainActivity.a()
,发现有重载,一个参数,两个参数,三个参数的MainActivity.a()
函数,d
中外层调用了三个参数的MainActivity.a()
函数,MainActivity
作为第一个参数,一个参数的MainActivity.a()
函数作为第二个参数,输入的字符串作为第三个参数,三个参数的MainActivity.a()
函数返回的是两个参数的MainActivity.a()
函数,一层层分析其实最后就是a("this_is_the_key.",输入的字符串)
:
两个参数的MainActivity.a()
函数返回class c.a()
函数,再跟进,又有重载………先调用一参数的class c.a()
将"this_is_the_key."
每两个字符交换位置得到"htsii__sht_eek.y"
,然后将这个和输入的字符串传到class a
的函数去:
跟进class a
,是一个AES加密,ECB模式,PKCS5Padding填充,"htsii__sht_eek.y"
作为密钥,加密后返回与两个参数的MainActivity.a()
中的一长串相等就ok了,网上找在线解密就行,我试了好几个网站才搞定。
网友写的解密脚本:
1 | from Crypto.Cipher import AES |
SafeBox
安装打开,还是输入key…..,没有提交按钮,但是不影响,还是先看Java代码,MainActivity
函数:
照样写脚本:
1 | import math |
题上有提示flag只含大小写字母和数字,这个答案是错的,交上去也过不了,再找找发现androidTest
类里面和MainActivity
很像,只有一些细节不同:
改脚本:
1 | import math |
第二个flag满足提示的条件,交上去A了。
easyeasy-200
MainAcivity
中接收输入的字符串,先判断长度,然后用Format.form()
函数截取,之后用Check.check()
判断,然后调用到了native层的checkEmulator
和checkPasswd
函数,checkPipes
函数检查路径是否存在,查看后知道恒返回假,最后关键就在checkPasswd
里:
apktool反编译后ida调试so文件,找到checkPasswd
,先对传入的字符串进行了反转:
然后有一个加密,比较复杂,我看不懂,尝试在字符串里找密文,发现可疑字符串:
下面的明显是base64,上面的也像,把最后的”.”换成”=”解码在反转得到flag.
signin
签到题,看Java代码,很明显就是把输入的字符串反转再base64解码后与id2131427360(0x7f0b0020)
处密文比较:
Androidkiler逐步搜索直接就能找到密文.
mobile1
看Java代码,用checkSN()
函数校检"Tenshine"
和输入的字符串:
看checkSN()
函数,先判断字符串长度,后对"Tenshine"
进行md5加密并转化成十六进制再截取奇数位(下标从0开始),拼上flag格式与输入的flag比较(忽略大小写):
分析完后用网上的在线工具就能解题。
mobile2
解压后是一个文件夹,不是apk,也不能编译生成apk,其实是一道杂项题,flag在AndroidManifest.xml
里:
First_Mobile(xman)
主函数:监听,把输入的字符串传给encode.check()
校检
跟进观察,算法很清晰明了:将函数里的字符串经过简单加密后与输入的字符串比较
脚本:
1 | arr=[23, 22, 26, 26, 25, 25, 25, 26, 27, 28, 30, 30, 29, 30, 32, 32] |
跑出来答案怎么交都不对,flag其实是XMAN{LOHILMNMLKHILKHI}
…..
HelloSmali2
这道题更像是教学性质的题吧,给你一个smali代码和一个Java代码,相互翻译其实是一样的,要过题的话直接跑Java代码就行了,我放个smali文件链接感兴趣的同学可以试着读一下:smali代码反正我是读不懂……………………