丶诺熙 发表于 2020-1-11 12:40

攻防世界题解2-app2

## app2

> 新人发帖,欢迎各位大佬多多指教
> 附件地址:https://adworld.xctf.org.cn/media/task/attachments/30e5fb52c9134abbb4b80efc44ee4ec3.apk

(自己解题的时候比较懒,一般懒得去将apk安装。采取直接逆的方式。上一篇可能写的不是太详细,这篇再详细说说)

### 初探-分析
首先拿到一道安卓题目,我会解压apk,看一下lib文件夹中,是否有东西。一般来说,如果没有的话,题目就是较为简单的,分析java代码即可,如果有,还需要我们去逆向so文件。

![](http://img.5am3.com/5am3/img/20200111120243.png)

可以看到,在这个题目中,确实是存在so文件的。(大家不要在意那三个文件夹,他表示在不同架构下,去执行的so文件。

此时可以猜测这道题目的做法,首先分析java代码,找到关键逻辑,进而继续分析so。


### 开始解题-java

将apk文件,拖入JEB中。点击Bytecode,可以看到我们这个程序的结构。

![](http://img.5am3.com/5am3/img/20200111120620.png)

此时我们需要关注MainActivity,这个一般是我们的程序入口。
点击进去,然后右键Decompile进行反编译。

分析代码,可以看到onClick这里,获取了c,d空间的文本内容。猜测是获取我们输入的两个字符串。

![](http://img.5am3.com/5am3/img/20200111120859.png)

进而保存为ili,lil传入给了SecondActivity。

然后我们继续跟进SecondActivity

![](http://img.5am3.com/5am3/img/20200111121123.png)

可以发现在这里将我们传入的字符串取出,并进行加密,然后与一个加密字符串做比对操作。

此时我们需要继续跟一下加密,看一下这里是如何实现的,以及我们该怎么逆向其代码。

![](http://img.5am3.com/5am3/img/20200111121353.png)

可以看到,到这里,正式进入到了我们的so文件中。


### 开始解题-so

将三个so文件中的任意一个拖入ida中,

![](http://img.5am3.com/5am3/img/20200111121623.png)

然后根据我们刚刚已知的doRawData关键字,找到相应的函数。

分析,可以发现,应该是对我们传入的数据做了AES加密。

v4应该是我们传入的值,v10则是秘钥。可以看到v14-v10这里组成了个数组。我们将其取出。秘钥即为`thisisatestkey==`

然后自己构造一个AES脚本对我们之前拿到的数据进行解密。

### 解题-踩坑ing..

解密得到aimagetencent。提交flag,发现失败,猜测这个即为我们的登陆账号密码。
然后安装apk,尝试登陆发现闪退。
![](http://img.5am3.com/5am3/img/20200111123103.png)

我们只能继续去看一下登陆逻辑,没发现什么。(其实是跟不下去了

然后找了一下大佬们的wp。发现存在一个没有被调用过的FileDataActivity。
flag在这里。

![](http://img.5am3.com/5am3/img/20200111123705.png)


于是拿到我们的字符串,然后解密,即可得到flag。


解密脚本如下:

```python
#coding:utf-8
import base64
from Crypto.Cipher import AES

class AesEncry(object):
    key = "thisisatestkey=="# aes秘钥

    def encrypt(self, data):
      data = json.dumps(data)
      mode = AES.MODE_ECB
      padding = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16)
      cryptos = AES.new(self.key, mode)
      cipher_text = cryptos.encrypt(padding(data).encode("utf-8"))
      return base64.b64encode(cipher_text).decode("utf-8")

    def decrypt(self, data):
      cryptos = AES.new(self.key, AES.MODE_ECB)
      decrpytBytes = base64.b64decode(data)
      meg = cryptos.decrypt(decrpytBytes).decode('utf-8')
      return meg[:-ord(meg[-1])]


a =AesEncry().decrypt("9YuQ2dk8CSaCe7DTAmaqAA==")
print(a)
```

人小鬼大666 发表于 2020-1-11 13:17

虽然看不懂,但是我还是坚持看完了。

netspy0808 发表于 2020-1-11 18:42

因为平时搞娃娃的作业比较多,各种app全买吧又不实现,想着自己学学来破解看看,结果,我发现我居然看了也是等于白看,完全看不懂啊,只有膜拜大佬的份!

toddwong 发表于 2020-1-11 13:28

高手,直接破so.我还在外面徘徊

13510667258 发表于 2020-1-11 14:01

收益匪浅,值得学习,非常感谢

lep52 发表于 2020-1-11 14:26

学习了,谢谢

听世界的喧闹 发表于 2020-1-11 14:50


高手,直接破so.我还在外面徘徊

2Burhero 发表于 2020-1-11 17:59

感谢等放学

starlancer 发表于 2020-1-13 15:13


感谢等放学

z5487693 发表于 2020-1-13 16:07

分享下大佬的wp😄
页: [1] 2
查看完整版本: 攻防世界题解2-app2