上周因为别的事情(帮忙校验电子取证的书,所以上周的题也就没有怎么搞。还有一个原因是我做安卓逆向的工具AndroidKiller
挂了,一直也没修好(到现在还没修好……最后只能用Android逆向助手。
DDCTF-Android Easy
dex2jar
,然后jd-gui
:
public class FlagActivity extends d
{
private static String m = "com.didi_ctf.flagapp.FlagActivity";
private static final byte[] p = { -40, -62, 107, 66, -126, 103, -56, 77, 122, -107, -24, -127, 72, -63, -98, 64, -24, -5, -49, -26, 79, -70, -26, -81, 120, 25, 111, -100, -23, -9, 122, -35, 66, -50, -116, 3, -72, 102, -45, -85, 0, 126, -34, 62, 83, -34, 48, -111, 61, -9, -51, 114, 20, 81, -126, -18, 27, -115, -76, -116, -48, -118, -10, -102, -106, 113, -104, 98, -109, 74, 48, 47, -100, -88, 121, 22, -63, -32, -20, -41, -27, -20, -118, 100, -76, 70, -49, -39, -27, -106, -13, -108, 115, -87, -1, -22, -53, 21, -100, 124, -95, -40, 62, -69, 29, 56, -53, 85, -48, 25, 37, -78, 11, -110, -24, -120, -82, 6, -94, -101 };
private static final byte[] q = { -57, -90, 53, -71, -117, 98, 62, 98, 101, -96, 36, 110, 77, -83, -121, 2, -48, 94, -106, -56, -49, -80, -1, 83, 75, 66, -44, 74, 2, -36, -42, -103, 6, -115, -40, 69, -107, 85, -78, -49, 54, 78, -26, 15, 98, -70, 8, -90, 94, -61, -84, 64, 112, 51, -29, -34, 126, -21, -126, -71, -31, -24, -60, -2, -81, 66, -84, 85, -91, 10, 84, 70, -8, -63, 26, 126, -76, -104, -123, -71, -126, -62, -23, 11, -39, 70, 14, 59, -101, -39, -124, 91, -109, 102, -49, 21, 105, 0, 37, -128, -57, 117, 110, -115, -86, 56, 25, -46, -55, 7, -125, 109, 76, 104, -15, 82, -53, 18, -28, -24 };
private TextView n;
private TextView o;
private String i()
{
int i = 0;
byte[] arrayOfByte1 = new byte[p.length];
for (int j = 0; j < arrayOfByte1.length; j++)
arrayOfByte1[j] = (byte)(p[j] ^ q[j]);
int k = arrayOfByte1[0];
for (int i1 = 0; arrayOfByte1[(k + i1)] != 0; i1++);
byte[] arrayOfByte2 = new byte[i1];
while (i < i1)
{
arrayOfByte2[i] = arrayOfByte1[(k + i)];
i++;
}
return new String(arrayOfByte2);
}
我们按照它给的逻辑分别算出
arrayOfByte2="DDCTF-3ad60811d87c4a2dba0ef651b2d93476@didichuxing.com"
flag{DDCTF-3ad60811d87c4a2dba0ef651b2d93476@didichuxing.com}
WELCOME TO JNI
JNI 全称 Java Native Interface,Java 本地化接口,可以通过 JNI 调用系统提供的 API。操作系统,无论是 Linux,Windows 还是 Mac OS,或者一些汇编语言写的底层硬件驱动都是 C/C++ 写的。Java和C/C++不同 ,它不会直接编译成平台机器码,而是编译成虚拟机可以运行的Java字节码的.class文件,通过JIT技术即时编译成本地机器码,所以有效率就比不上C/C++代码,JNI技术就解决了这一痛点,JNI 可以说是 C 语言和 Java 语言交流的适配器、中间件。
总而言之,我们现在还是要搞这个apk
嘛~
先找到入口点,然后jd-gui
看一下:
根据图中逻辑,我们现在要去native-lib
中寻找loginUtils
:
Codegate CTF Redvelvet
根据提示内容,我们要用angr
解题,在IDA64
里面不难看出我们要find 0x4015F2
(最后输出结果的位置),avoid 0x401621
:
为了提高angr
的速度和正确率,我们直接把exit
函数设置为avoid
:
import angr
p = angr.Project("./RedVelvet",load_options={"auto_load_libs": False})
sta = p.factory.entry_state()
sim = p.factory.simulation_manager(sta)
sim.explore(find=0x4015f2,avoid=[0x4007D0])
print(sim.found[0].posix.dumps(0))
'''
Traceback (most recent call last):
File "exp.py", line 6, in <module>
print(sim.found[0].posix.dumps(0))
IndexError: list index out of range
'''
嗯????为什么没有答案呢???我去问了一下万能的Rx
神,他是这么给我解释的(大意):最后一个加密的函数是SHA256
,而众所周知SHA256
是不可逆算法,所以z3是跑不出结果的。但是在跑到SHA256
的时候它的输入内容相当于已经确定了,所以我们把find
定位在它进入SHA256
的时候,也就是0x40152d
:
import angr
p = angr.Project("./RedVelvet",load_options={"auto_load_libs": False})
sta = p.factory.entry_state()
sim = p.factory.simulation_manager(sta)
sim.explore(find=0x40152d,avoid=[0x4007D0])
print(sim.found[0].posix.dumps(0))
#flag{What_You_Wanna_Be?:)_l`_la}
插一个题外话,我用wsl
貌似才4mins
左右……