- 0792 Android2.0
- 0790 基础android
解答:用反编译工具,直接看MainActivity。 不太清楚的可以先看AndroidManifest.xml,activity标签中指定了入口的activity类。
分析MainActivity可知关键函数是getResult:
查看JNI类的getResult方法,是个静态方法。 需要用ida查看so文件。
apk文件压缩包解压即可,找到so文件。
这里小小的说明一下怎么找函数(大佬们可以无视跳过~) 在搜索栏直接搜索这个函数就可以,可以看到他的名字起得非常的详细,java+包名+类名+函数名。
点击后,在出现的汇编代码中,按F5就可以查看反编译的代码了~
好了,开始正式的分析代码:
1)v2
是传给getResult
的参数,在题目中就是我们输入的pwd
。可以看到先是进行了Init
初始化操作,给v3
、v4
、v5
进行了赋值,然后分别对v3
、v4
、v5
进行操作(注意v3
、v4
、v5
都是指针)。
2)v3
经过First
函数处理后,要满足返回的值不为1,这里将修改后的v3
定义为change_v3
。
3)change_v4
是change_v3
和v4
的前4个进行异或,最后一位保持原样,结果和byte_2888
相等。
4)change_v5
是change_v4
和v5
的前4个进行异或,最后一位保持原样,结果和AFBo}
相等。
接下来看一下Init
函数:实际就是将输入的字符串,每三个为一组,每组的第一个字符给v3
,第二个字符给v4
,第三个字符给v5
。
查看First
函数:对v3
的前4个字符进行了char*2^0x80
操作,最后的结果等于LN^dl
。
可以推出最开始的v3
的内容是:
c="LN^dl"
result3=""
for i in range(len(c)-1):
result3+=chr((ord(c[i])^0x80)//2)
result3+=c[4]
print(result3)
#fgorl
接下来再看v4
,前4位通过change_v3
和byte_2888
的前4位异或得到,最后一位是byte_2888
的最后一位。(注意是改变后的v3
的值,也就是LN^dl
)
查看byte_2888
的内容
c="LN^dl"
result4=""
cmp4=[0x20,0x35,0x2d,0x16,0x61]
for i in range(len(cmp4)-1):
result4+=chr(ord(c[i])^cmp4[i])
result4+=chr(cmp4[4])
print(result4)
#l{sra
v5
的前4位是change_v4
和AFBo}
的前4位异或,最后一位是}
cmp4=[0x20,0x35,0x2d,0x16,0x61]
result5=""
cmp5="AFBo}"
for i in range(0,4):
result5+=chr(cmp4[i]^ord(cmp5[i]))
result5+=cmp5[4]
print(result5)
for i in range(5):
print(result3[i]+result4[i]+result5[i],end="")
#asoy}
最后输出结果得到flag:
for i in range(5):
print(result3[i]+result4[i]+result5[i],end="")
#flag{sosorryla}
0790 基础android
解答:这道题可以当作杂项题来做。 打开后,发现assets下的有内容,先看一下,根据显示的信息可知,这个压缩包实际是个jpg图片。
assets文件夹存放的是静态资源文件
直接解压apk,找到这个文件,修改一下后缀获取flag。
虽然出了结果,但是还是要顺一下代码学习学习~
先看一下AndroidManifest.xml,这里还注册了一个广播接收器,是GetAndChange。
在MainActivity中,对输入的password进行check判断输入“Good,Please go on!”,可知这只是第一步,并不是最后结果。
继续看后面的内容,发现显示启动了MainActivity2。
在MainActivity2中调用sendBroadcast方法发送了广播,这里广播接收器所接收的广播种类需要我们自己输入,就是AndroidManifest.xml中在标签指定的
android.is.very.fun
。
接下来看一下GetAndChange接收广播后的操作,又启用了NextContent。
在NextContent中,将timg_2.zip写入到了img.jpg中。
最后再看一下check类中的内容,代码很简单,分析可知输入的pass的每个字符对应的是(255 - len) - 100-ord('0')
写脚本跑一下~
for i in range(0,12):
print(chr((255 - i) - 100-ord('0')),end="")
# kjihgfedcba`
接下来,通过apk走一下正经的流程。在apk中输入得到的字符串,进入下一阶段
这里输入android.is.very.fun
即可(原因在上面已经写过了)
获取flag