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