克格勃信使
前言
克格勃,全称为“苏联国家安全委员会”,克格勃前身为捷尔任斯基创立的“契卡(Cheka)”及斯大林时期内务人民委员部(NKVD)下属的国家安全总局,1991年苏联解体后,改制为俄罗斯联邦安全局,其第一总局另外成立俄罗斯对外情报局。假如你是国际秘密情报局的逆向工程师,今天早上,你的团队负责人指派你检查在一个行为不端的代理的手机上发现的一个Android应用程序,据传,行为不端的特工Sterling Archer与一些KGB间谍有过接触,你的工作是对应用程序进行逆向工程,以验证谣言。正好最近在研究安卓逆向,正好闲来无事,玩一玩
任务
Alerts (Medium)
The app keeps giving us these pesky alerts when we start the app. We should investigate.
Login (Easy)
This is a recon challenge. All characters in the password are lowercase.
Social Engineering (Hard)
It looks like someone is bad at keeping secrets. They’re probably susceptible to social engineering… what should I say?
the first
打开应用程序,发现直接弹窗报错,提示为该app只能在俄罗斯设备上运行,okkk,准备分析

首先使用apktool对apk包进行解码到指定文件夹中,随后查看AndroidManifest.xml文件,看看程序启动时调用了什么

我们可以看到程序启动的时候调用了MainActivity函数,用dex2jar进行反编译,将apk转换为jar包

随后开始分析源代码,找到MainActivity.class,并在下面发现了程序启动时的报错信息,可以发现程序会判断property的值是否等于Russia,不等于的话就会报错

随后会判断str的值是否等于2131558400,我们需要将这个值转换为十六进制值,才能在xml文件中找到对应的位置

然后在res/values文件夹中定位0x7f0d0000,发现name值是User,接着定位User,最后发现了一串疑似base64的字符串,解密拿到flag1

the second
我们继续分析源代码,要是想绕过限制,必须使得这两个if判断成功,这里有两个思路,第一个就是将这两个if判断去掉,这样开启程序的时候就不会做判断处理也自然就不会弹窗

之前我们用apktool解码过这个apk包,选择现在我们直接定位MainActivity文件

打开第一个文件,我们定位0x7f0d0000,不难发现,第115行到175行正是那两个if判断,于是全给删了,但是要注意的是需要将原来的第186行的内容更改为return-void来结束



保存退出之后,用apktool重新构建一个新的apk包

需要注意的是,此时构建的新apk包,并不能直接安装应用程序,因为没有文件签名,安装的话会有报错提示并且安装失败,如下图


所以我们需要先给apk进行文件签名,完成之后会生成一个新的apk

此时再重新安装并打开应用程序,就没有弹窗报错提示了

第二个方法就是在判断语句之前,赋予两个值,让他判断条件恒成立即可,如下图,我们再来看一下那两个判断,其实条件只需要满足恒等于“Russia”和“2131558400”(也就是RkxBR3s1N0VSTDFOR180UkNIM1J9Cg==)即可

进行赋值

赋值之后就是重构apk,同上面的操作一样,不再演示。
现在我们开始破解账号和密码,找到LoginActivity,可以看到程序登录验证的代码,在这段代码中发现了一串字符串:2131558450,和前面的处理方式一样,还是先转换为16进制,再层层定位,最终发现了用户名

用户名知道了,现在就剩想办法找到密码了,开始分析密码的判断条件,发现调用的m532j函数

双击进行定位,跳转到了密码验证的地方,这段代码不难分析出,它会将我们输入的密码和2131558446进行比较

继续重复前面的操作,发现name值是password,最后通过定位password得到了一串新的字符,也就是加密的密码

再往下分析,发现了加密类型:MD5

but!!!但是无法爆破出来……

重新看了一下任务,任务中写道“this is a “recon” challenge”???侦查??难不成社工??直接搬出大Google,对用户名进行搜索,搜索到了一篇推特,难不成这就是男主???

加上密码password再搜索试试,发现了密码为Guest,再加上任务中的提示:都是小写,所以密码应该为guest

ok,万事俱备,只欠东风,登录!

the third
登录进去之后,发现是一个聊天界面,可是我随便发送了几条信息,都是没有反应的,哎,没人理我..那就继续分析,开始追踪MessageActivity


通过分析我们可以发现,每当我们发送消息时,都会调用onSendMessage函数,而且最终的flag就在该函数中生成,而且我们输入的文本会转换成String str,随后str会传参到m530a函数里,并且调用了equals函数来检查它是否等于f2548p,继续定位f2548p

如上图,我们定位到了f2548p的数值,并且往下看就可以看到m530a函数代码

这个函数对我们输入的字符串进行一些异或操作,我们需要写一个脚本来还原字符串
1 |
|


“if you ask nicely”…好好好不给是吧,那就继续分析m529b函数,同理,也是调用了equals函数,来检查它是否等于f2550r,继续审计发现了m529b函数的操作

同样,写一个脚本来还原字符串
1 |
|

还原之后,用我们的小学英语水平,填字母还原一下,字符串为:May I PLEASE have the password(请告诉我密码),果然语气确实变得温柔多的,至少比刚才显得有礼貌了,果不其然,Boris也愉快的给了我们最后一个flag!

Boris is my friend!!