西普杯2017年网络安全技能赛 writeup

0x1 题目1

描述:近期截获一个拦截发送垃圾短信的恶意软件,在用户手机安装后,会随机向外发送垃圾短信。分析该恶意软件,分析其发送短信的实现点,并还原出要发送的垃圾短信内容。
安装到模拟器里,只有一个按钮,但是点击没有任何反应,对apk进行了反汇编,查看java源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.tencent.crasms;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity
extends Activity
{
Button a;
static
{
System.loadLibrary("msyk");
}
protected void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
setContentView(2130968602);
this.a = ((Button)findViewById(2131427420));
this.a.setOnClickListener(new View.OnClickListener()
{
public void onClick(View paramAnonymousView)
{
try
{
paramAnonymousView = SmsManager.getDefault();
MainActivity.this.rx3sdfx(paramAnonymousView);
Toast.makeText(MainActivity.this.getApplicationContext(), "ok", 0).show();
return;
}
catch (Exception paramAnonymousView)
{
for (;;) {}
}
}
});
}
public native void rx3sdfx(SmsManager paramSmsManager);
}

分析这段代码,发现它加载了一个msyk的库文件,发送短信功能的函数rx3sdfx并没有实现具体的功能,所以需要去分析这个库文件,看它到底进行了什么样的操作

这段代码就是对短信内容进行处理的方法,算法就是一个简单的异或,但是这里需要注意一点的是v135是由高位和低位组成的(这里比较坑),最后还原出短信的内容为:This Phone has been hacked, SN:8391215

0x2 题目2

描述:没有后缀,怎么打开,你知道这是什么文件吗??
用十六进制编辑器查看,可以看到文件里面的内容是逆序存放的,将文件内容逆过来就能看到flag

脚本如下:

1
2
3
with open('reverseMe','rb') as f:
with open('flag','wb') as file:
file.write(f.read()[::-1])

运行的结果为:

0x3 题目3

描述:haha.exe目前无法直接运行,找到启动haha.exe的方法并提交需要的内容。
直接运行是不能运行的,需要加参数运行,参数就是正确的key值,如果参数错误则会提示Invalid Key,载入IDA分析,搜索关键字定位到关键代码处

while就是来判断输入的key是否正确,前面需要注意的是,对输入的参数就行了md5加密,然后加密的结果赋值给v86,v86和v16这个数组进行比较

v16这个数组的地址并不是连续的,所以需要把缺少的数值加进去,最后得到v16的数组是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
v16 = 0x5D;
v17 = 0x41;
v18 = 0x40;
v19 = 0x2A;
v20 = 0xBCu;
v21 = 0x4B;
v22 = 0x2A;
v23 = 0x76;
v24 = 0xB9u;
v25 = 0x71;
v26 = 0x9Du;
v27 = 0x91u;
v28 = 0x10;
v29 = 0x17;
v30 = 0xC5u;
v31 = 0x92u;

得到的md5值为:5d41402abc4b2a76b9719d911017c592,解密后的key值为:hello
运行结果:

0x4 题目4

描述:算法很简单,好像无法静态调试啊!啊!
提示不能静态分析,只能用OD跟踪,我搜索字符串的时候看到“Congratulations”这样的字符串,以为算法在这里,调试了好几遍都没有输入的信息,然后在入口处下断点返回到它被调用的那个函数里,发现这个函数里有输入,还要计算的过程,然后在这下断点分析算法:

看懂算法之后就可以开始写脚本了:

1
2
3
4
5
6
7
a = [0xB9 ,0x3A,0xA9,0xD8,0x15, 0x8A, 0xE7 ,0x42,0x69, 0x90, 0xCA, 0xA3, 0x4D, 0xD8, 0xD9, 0xC9 ]
flag = ""
for i in range(16):
for j in range(33,128):
if ((2*j-6)^j)-2*i==a[i]:
flag += chr(j)
print (flag)

运行结果:mBqL!zS6-hLm)XY_

0x5 题目5

描述:下断点,然后手工暴力破解
在0x400e53下个断点,然后输入一串字符串,一路调试,你会发现经过0x401210这个函数运算后对输入的结果进行了加密

一直往下调试,会将加密的字符串跟正确加密过的字符串进行比较

分析了下它的加密算法,参考了别人的wp,作者说是采用了静态的凯撒加密,但是不行的是每一位加密的字符key值都是不相同的,所以只能去手工爆破,猜测加密的key值,最后爆破出的flag:
CTF-BR{riot_in_public_square_vgzdLIEjd}

https://advancedpersistentjest.com/2016/03/28/writeup-sleeper_cell/

https://github.com/xil-se/xil.se/blob/master/content/post/pwn2win-2016-sleeper-cell-kbeckmann.md