Thunder_J 发表于 2019-2-20 09:26:39

安卓逆向入门题目

0x00:介绍
以下题目都是比较简单的安卓逆向题目,主要训练目的是熟悉安卓逆向的一些基础题目,如果是第一次接触安卓逆向,建议先去学一点安卓开发的相关知识,这样做题目就更快一些,当然题目做多了自然也就熟悉了,题目我都上传到Github上了,需要的可以下载。

0x01:题目
题目1-androideasy
链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid Reverse/androideas
解题思路:
既然是入门题目,那就说详细一点,文件下载后发现是zip格式,我们可以将后缀改为.apk然后后用jeb打开进行分析。
https://img-blog.csdnimg.cn/20190122195342751.png
我们可以看到有这么多复杂的东西,不要紧张,对于一般比较简单的题目,我们只需要找到函数的入口,即MainActivity中onCreate方法下的onClick点击事件,因为是找注册码(flag),那就肯定有一个按钮负责判断注册码是否正确,这个按钮的点击事件就是用onClick实现的,所以大部分这种题目直接找onClick就对了。我们双击之后可以看到以下的代码,这里是smail代码,可以说是Android下的汇编代码,看不懂没关系,右键选择Decompile反汇编查看java代码就明白了
https://img-blog.csdnimg.cn/2019012220230654.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
下面是java代码
https://img-blog.csdnimg.cn/20190122202448566.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
上面是主要函数的内容,这里是要调用MainActivity的check()函数来判断flag是否正确,我们直接定位到check()函数
https://img-blog.csdnimg.cn/20190123002750327.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
分析函数内容,可以看出数组v0即是我们输入的注册码,根据if语句可以确定注册码的长度和s[]数组一样有31位,下面又有一个if语句判断即为我们的关键语句:s == (v0 ^ 23)
因为flag字符都是ASCII码在0-127中,所以这种题目我们直接用python进行爆破,我们用m替换v1,范围是(0,31),用i替换v0,i即为flag中的一个一个字符,最后爆破得到flag,python代码:
s =

flag = ""

for m in range(0,31):
      for i in range(0,127):
                if(s == (i ^ 23)):
                        flag += chr(i)
print(flag)


题目2-simplecheck
链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid Reverse/simplecheck
解题思路:
因为是.apk文件,我们直接放入虚拟机里面运行一下,非常简单,也是一个判断注册码的题目
https://img-blog.csdnimg.cn/20190122203220503.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
还是用jeb打开分析,我们先看看MainActivity里面的内容
https://img-blog.csdnimg.cn/20190122203553342.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
这里通过a方法来判断正确与否,所以我们主要研究a方法,可以看到我们输入的即为v4,因为v4 = 0所以我们第一个循环为(1,34),可以通过:
a== b * v4* v4 + c * v4 + d
a == b * v4 * v4 + c * v4 + d
将v4替换为要爆破的i:
(a == b * i * i + c * f + d)||(a == b * i * i + c * i + d)
https://img-blog.csdnimg.cn/20190122213611511.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
脚本如下:
a =

b =

c =

d =

flag = ""
for m in range (1,34):
      for i in range (0,127):
                                        if((a == b * i * i + c * i + d)&(a == b * i * i + c * i + d)):
                                                flag+=chr(i)
                                          
print(flag)


最后得到flag,测试成功(加个右括号)
https://img-blog.csdnimg.cn/20190122214643924.png
https://img-blog.csdnimg.cn/20190122214711257.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70


题目3- DD-Android Easy
链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid Reverse/DD - Android Easy
解题思路:
这道题和上面的类似,就当一道练习题了,掌握了上面的两道题目这道应该很简单,进入FlagActivity分析,简单明了,判断i函数
https://img-blog.csdnimg.cn/20190122215243919.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
直接贴脚本
p = [-40, -62, 107, 66, -126, 103, -56, 77, 122, -107, -24, -127, 72, -63, -98, 64, -24, -5, -49, -26, 79, -70, -26, -81, 120, 25, 111, -100, -23, -9, 122, -35, 66, -50, -116, 3, -72, 102, -45, -85, 0, 126, -34, 62, 83, -34, 48, -111, 61, -9, -51, 114, 20, 81, -126, -18, 27, -115, -76, -116, -48, -118, -10, -102, -106, 113, -104, 98, -109, 74, 48, 47, -100, -88, 121, 22, -63, -32, -20, -41, -27, -20, -118, 100, -76, 70, -49, -39, -27, -106, -13, -108, 115, -87, -1, -22, -53, 21, -100, 124, -95, -40, 62, -69, 29, 56, -53, 85, -48, 25, 37, -78, 11, -110, -24, -120, -82, 6, -94, -101]

q = [-57, -90, 53, -71, -117, 98, 62, 98, 101, -96, 36, 110, 77, -83, -121, 2, -48, 94, -106, -56, -49, -80, -1, 83, 75, 66, -44, 74, 2, -36, -42, -103, 6, -115, -40, 69, -107, 85, -78, -49, 54, 78, -26, 15, 98, -70, 8, -90, 94, -61, -84, 64, 112, 51, -29, -34, 126, -21, -126, -71, -31, -24, -60, -2, -81, 66, -84, 85, -91, 10, 84, 70, -8, -63, 26, 126, -76, -104, -123, -71, -126, -62, -23, 11, -39, 70, 14, 59, -101, -39, -124, 91, -109, 102, -49, 21, 105, 0, 37, -128, -57, 117, 110, -115, -86, 56, 25, -46, -55, 7, -125, 109, 76, 104, -15, 82, -53, 18, -28, -24]

v2 = []
v1 = 0
flag = ''
v0 = 0


for iin range(len(q)):
      v2.append(p^q)

v3= v2

while v2!=0:
    v0+=1
while v1 < v0:
      flag += chr(v2)
      v1+=1
print flag

[/pre]
得到flag
https://img-blog.csdnimg.cn/20190122215525158.png

题目4-smali
链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid Reverse/smali
解题思路:
这道题直接给了个smali文件让我们分析,我们可以直接进行分析也可以用工具进行转化,这里单纯为了做题,直接用工具转换,建议自己翻译几句smali代码熟悉熟悉,我们将smail文件放入Smali2JavaUI工具中转换为Java代码
https://img-blog.csdnimg.cn/20190122223314798.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
分析代码就是两次base64一次AES,str2的值base64解密以后,作为key,AES解密flag
import base64
from Crypto.Cipher import AES

cipher = "sSNnx1UKbYrA1+MOrdtDTA=="
cipher = base64.b64decode(cipher)

key = "cGhyYWNrICBjdGYgMjAxNg=="
key = base64.b64decode(key)

cryptor = AES.new(key, AES.MODE_ECB)
flag = cryptor.decrypt(cipher)

print(flag)


题目5- CFF2016-爬楼梯
链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid Reverse/CFF2016-爬楼梯
解题思路:
查看题目是需要我们点击到对应的层数显示flag,考虑直接暴力破解
https://img-blog.csdnimg.cn/20190123002243763.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
setClickable()函数作用是设置控件点击无效,但是可以点击,颜色不会变灰色,也就是右边的按钮是否能够点击,能够的话那就可以显示flag,那思路就清楚了,我们修改文件使右边按钮参数可点击就可以直接得到flag了
https://img-blog.csdnimg.cn/20190123002326642.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
我们用Apktool Box对文件进行反编译apk得到一个文件夹
https://img-blog.csdnimg.cn/20190123002428715.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
我们在文件夹目录\smali\com\ctf\test\ctf_100下找到MainActivity.smali文件进行查看主函数内容,搜索到两处setClickable()函数,两处的setClickable对应着java代码看
https://img-blog.csdnimg.cn/20190123002448909.png
https://img-blog.csdnimg.cn/2019012300245511.png
推测V5和V3即为true或false的标记位,v3一直为0x1,v5一直为0x0,因此考虑修改v5为0x1
https://img-blog.csdnimg.cn/20190123002513598.png
修改之后保存,然后将文件夹拖入Apktool Box回编译apk就行了
https://img-blog.csdnimg.cn/20190123002531227.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNHb2RY,size_16,color_FFFFFF,t_70
0x02:总结
题目都是非常基础的,主要是通过它们来熟悉做题过程,熟悉各种工具,熟悉了之后再慢慢深入,总之逆向大多数都是算法分析,会分析算法其他无非就是各种工具的使用,脚本的编写。

roger 发表于 2019-2-20 16:42:26

做了几道,卡在脚本上了,看来我得多练习python了,我写脚本思路不对

丶风存 发表于 2019-8-31 00:44:06

跟着学习

猪猪 发表于 2019-9-10 15:29:56

跟着学习

小高231 发表于 2019-10-12 11:26:47

学习学习学习

lawhack 发表于 2019-12-8 10:44:21

啥也不说了,楼主就是给力!

梦入神机2020 发表于 2020-1-10 11:32:24


谢谢楼主的分享

梦入神机2020 发表于 2020-1-10 11:32:51


谢谢楼主的分享

monkeyman 发表于 2020-1-19 22:22:41

非常感谢楼主分享资源呀

缺舟一帆渡 发表于 2020-2-29 22:13:48

感谢分享,我会认真学习的!
页: [1] 2 3
查看完整版本: 安卓逆向入门题目